1
priceload.php in web – MultiMag

source: web/priceload.php @ 19c317b

Last change on this file since 19c317b was 19c317b, checked in by Blacklight <blacklight@…>, 10 years ago
  • Добавлена колонка с описаниями в анализатор
  • Property mode set to 100644
File size: 36.5 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('core.php');
21include_once('include/doc.core.php');
22
23set_time_limit(120);
24
25need_auth();
26
27SafeLoadTemplate($CONFIG['site']['inner_skin']);
28
29$tmpl->HideBlock('left');
30
31$firm_id=0;
32$num_name=1;
33$num_cost=2;
34$num_art=3;
35$line_cnt=0;
36
37$line = array();
38$line_pos = 0;
39
40function topmenu($s='')
41{
42        global $tmpl;
43        if(!$tmpl->ajax)
44        {
45                doc_menu($s,0);
46        }
47}
48
49function draw_groups_tree($level, $firm)
50{
51        $ret='';
52        $res=mysql_query("SELECT `doc_group`.`id`, `doc_group`.`name`, `firm_info_group`.`id` FROM `doc_group`
53        LEFT JOIN `firm_info_group`     ON `firm_info_group`.`firm_id`='$firm' AND `firm_info_group`.`group_id`=`doc_group`.`id`
54        WHERE `doc_group`.`pid`='$level' ORDER BY `doc_group`.`name`");
55        $i=0;
56        $r='';
57        if($level==0) $r='IsRoot';
58        $cnt=mysql_num_rows($res);
59        while($nxt=mysql_fetch_row($res))
60        {
61                if($nxt[0]==0) continue;
62                $checked=$nxt[2]?'checked':'';
63                $item="<label><input type='checkbox' name='g[]' value='$nxt[0]' id='cb$nxt[0]' class='cb' $checked onclick='CheckCheck($nxt[0])'>$nxt[1]</label>";
64                if($i>=($cnt-1)) $r.=" IsLast";
65                $tmp=draw_groups_tree($nxt[0], $firm); // рекурсия
66                if($tmp)
67                        $ret.="<li class='Node ExpandLeaf $r'><div class='Expand'></div><div class='Content'>$item</div><ul class='Container' id='cont$nxt[0]'>".$tmp.'</ul></li>';
68                else
69                        $ret.="<li class='Node ExpandLeaf $r'><div class='Expand'></div><div class='Content'>$item</div></li>";
70                $i++;
71        }
72        return $ret;
73}
74
75
76function firmAddForm($id=0)
77{
78        global $tmpl;
79        $nxt=array();
80        if($id)
81        {
82                $res=mysql_query("SELECT `id`, `name`, `signature`, `currency`, `coeff`, `type`, `delivery_info` FROM `firm_info` WHERE `id`='$id'");
83                if(mysql_errno())       throw new MysqlException("Не удалось выбрать данные фирмы");
84                $nxt=mysql_fetch_row($res);
85        }
86
87        $disp=$nxt[5]==2?'block':'none';
88
89        $tmpl->AddStyle(".scroll_block
90        {
91                max-height:             250px;
92                overflow:               auto;
93        }
94
95        div#sb
96        {
97                display:                $disp;
98                border:                 1px solid #888;
99        }
100
101        .selmenu
102        {
103                background-color:       #888;
104                width:                  auto;
105                font-weight:            bold;
106                padding-left:           20px;
107        }
108
109        .selmenu a
110        {
111                color:                  #fff;
112                cursor:                 pointer;
113        }
114
115        .cb
116        {
117                width:                  14px;
118                height:                 14px;
119                border:                 1px solid #ccc;
120        }
121
122        ");
123
124        $tmpl->AddText("<h1>Данные фирмы</h1>
125        <form action='' method='post'>
126        <input type='hidden' name=mode value='firms'>");
127        if($id) $tmpl->AddText("<input type=hidden name=id value='$nxt[0]'>");
128        $tmpl->AddText("Наименование:<br>
129        <input type='text' name='nm' value='$nxt[1]'><br>
130        Сигнатура:<br>
131        <input type='text' name='sign' value='$nxt[2]'><br>
132        Валюта:<br>
133        <select name='curr'>");
134        $res=mysql_query("SELECT `id`, `name`, `coeff` FROM `currency` ORDER BY `id`");
135        while($nx=mysql_fetch_row($res))
136        {
137                if($nx[0]==$nxt[3])
138                        $tmpl->AddText("<option style='background-color: #8f8;' selected value='$nx[0]'>$nx[1]</option>");
139                else
140                        $tmpl->AddText("<option value='$nx[0]'>$nx[1]</option>");
141        }
142
143        $typesel=array( 0=>'', 1=>'', 2=>'');
144        $typesel[$nxt[5]]='selected';
145
146        $tmpl->AddText("</select><br>
147        Валютный коэффициент:<br>
148        <input type='text' name='coeff' value='$nxt[4]'><br>
149        Информация о доставке:<br>
150        <input type='text' name='delivery_info' value='$nxt[6]'><br>
151
152        <script type='text/javascript'>
153        function gstoggle()
154        {
155                var seltype=document.getElementById('seltype').value;
156                if(seltype=='2')
157                        document.getElementById('sb').style.display='block';
158                else    document.getElementById('sb').style.display='none';
159        }
160
161        function SelAll(flag)
162        {
163                var elems = document.getElementsByName('g[]');
164                var l = elems.length;
165                for(var i=0; i<l; i++)
166                {
167                        elems[i].checked=flag;
168                        if(flag)        elems[i].disabled = false;
169                }
170        }
171
172        function CheckCheck(ids)
173        {
174                var cb = document.getElementById('cb'+ids);
175                //alert(cb.checked);
176                var cont=document.getElementById('cont'+ids);
177                if(!cont)       return;
178                var elems=cont.getElementsByTagName('input');
179                var l = elems.length;
180                for(var i=0; i<l; i++)
181                {
182                        if(!cb.checked)         elems[i].checked=false;
183                        elems[i].disabled =! cb.checked;
184                }
185        }
186
187        function FillTextBoxes(l_id, t_name, c_art, c_name, c_cost, c_nal, c_curr, c_info)
188        {
189                document.getElementById('line_id').value=l_id;
190                document.getElementById('table_name').value=t_name;
191                document.getElementById('col_art').value=c_art;
192                document.getElementById('col_name').value=c_name;
193                document.getElementById('col_cost').value=c_cost;
194                document.getElementById('col_nal').value=c_nal;
195                document.getElementById('col_curr').value=c_curr;
196                document.getElementById('col_info').value=c_info;
197        }
198
199        </script><br>
200        Результаты анализа:<br>
201        <select name='type' id='seltype' onchange='gstoggle()'>
202        <option value='0' $typesel[0]>Не меняют цены</option>
203        <option value='1' $typesel[1]>Меняют все цены</option>
204        <option value='2' $typesel[2]>Меняют цены выбранных групп товаров</option>
205        </select><br>
206
207
208        <div class='scroll_block' id='sb'>
209        <ul class='Container'>
210        <div class='selmenu'><a onclick='SelAll(true)'>Выбрать всё<a> | <a onclick='SelAll(false)'>Снять всё</a></div>
211        ".draw_groups_tree(0,$id)."</ul>");
212
213
214
215        $tmpl->AddText("</div>");
216        if(!$nxt)
217        {
218                $tmpl->AddText("<h2>Структура прайса</h2>
219                <table>
220                <thead>Номера колонок
221                <tr><th>Имя листа<th>С кодом производителя<th>С названиями<th>С ценами<th>С наличием
222                <tr><td><input type='text' name='table_name'>
223                <td><input type='text' name='col_art'>
224                <td><input type='text' name='col_name'>
225                <td><input type='text' name='col_cost'>
226                <td><input type='text' name='col_nal'>
227                <td><input type='text' name='col_curr'>
228                <td><input type='text' name='col_info'>
229                </table>");
230
231        }
232        $tmpl->AddText("<input type=submit value='Записать!'></form>");
233        if($nxt)
234        {
235                $tmpl->AddText("<h2>Структура прайса</h2>
236                <form action='' method='post'>
237                <input type='hidden' name='mode' value='firmss'>
238                <input type='hidden' name='firm_id' value='$nxt[0]'>
239                <input type='hidden' name='line_id' value='0' id='line_id'>
240                <table>
241                <tr><th rowspan='2'>Имя листа<th colspan='6'>Номера колонок
242                <tr><th>С кодом производителя<th>С названиями<th>С ценами<th>С наличием<th>С валютой<th>С информацией");
243                $res=mysql_query("SELECT `id`, `table_name`, `art`, `name`, `cost`, `nal`, `currency`, `info` FROM `firm_info_struct`
244                WHERE `firm_id`='$nxt[0]'");
245                if(mysql_errno())       throw new MysqlException("не удалось получить настройки столбцов!");
246                while($nx=mysql_fetch_row($res))
247                {
248                        $tmpl->AddText("<tr><td>
249                        <a href='?mode=firmsd&p=$nx[0]'><img src='/img/i_del.png' alt='Удалить'></a>
250                        <a onclick=\"FillTextBoxes('$nx[0]', '$nx[1]', '$nx[2]', '$nx[3]', '$nx[4]', '$nx[5]', '$nx[6]', '$nx[7]');\"><img src='/img/i_edit.png'  alt='Правка'></a>
251                        $nx[1]<td>$nx[2]<td>$nx[3]<td>$nx[4]<td>$nx[5]<td>$nx[6]<td>$nx[7]");
252                }
253                $tmpl->AddText("<tr><th colspan='7'>Новый лист<tr>
254                <td><input type='text' name='table_name' id='table_name'>
255                <td><input type='text' name='col_art' id='col_art'>
256                <td><input type='text' name='col_name' id='col_name'>
257                <td><input type='text' name='col_cost' id='col_cost'>
258                <td><input type='text' name='col_nal' id='col_nal'>
259                <td><input type='text' name='col_curr' id='col_curr'>
260                <td><input type='text' name='col_info' id='col_info'>
261                </table>
262                <input type=submit value='Записать!'></form>");
263
264        }
265}
266
267try
268{
269
270if(!isAccess('generic_price_an','view'))        throw new AccessException("Недостаточно привилегий");
271topmenu();
272$tmpl->SetTitle("Анализатор прайсов");
273if($mode=='')
274{
275        $i=0;
276        $tmpl->AddText("
277        <h1>Редактор организаций</h1>
278        <table width='100%'>
279        <tr><th>ID<th>Наименование<th>Обновлено<th>Сигнатура<th>Валюта<th>Отчёты");
280        $res=mysql_query("SELECT `firm_info`.`id`, `firm_info`.`name`, `firm_info`.`signature`, `currency`.`name`, `firm_info`.`coeff`, `firm_info`.`last_update`  FROM `firm_info`
281        LEFT JOIN `currency` ON `currency`.`id`=`firm_info`.`currency`
282        ORDER BY `firm_info`.`last_update` DESC");
283        if(mysql_errno())       throw new MysqlException("Не удалось получить список организаций");
284        while($nxt=mysql_fetch_row($res))
285        {
286                $date_style='';
287                $date='';
288                $time=time();
289                $udate=strtotime($nxt[5]);
290                $days=floor( ($time-$udate)/(60*60*24));
291                if($days<30)
292                {
293                        if($days<3)             $date_style="style='color: #0d0'";
294                        else if($days<7)        $date_style="style='color: #d80'";
295                        else                    $date_style="style='color: #f00'";
296                       
297                        if($days<1)
298                        {
299                                $hours=floor( ($time-$udate)/(60*60));
300                                if($hours<1)
301                                {
302                                        $minutes=floor( ($time-$udate)/60);
303                                        if($minutes<1)
304                                        {
305                                                $date='только что';
306                                        }
307                                        else $date=$minutes.' мин. назад';
308                                }
309                                else $date=$hours.' ч. назад';
310                        }
311                        else $date=$days.' дн. назад';
312                }
313                else if($udate<2)       $date='никогда';
314                else                    $date=date("Y-m-d", $udate);
315               
316                $tmpl->AddText("<tr class='lin$i pointer'><td><a href='?mode=firme&amp;id=$nxt[0]'>$nxt[0]</a>
317                <td>$nxt[1]<td $date_style>$date<td>$nxt[2]<td>$nxt[3], $nxt[4]<td>
318                <a href='?mode=r_noparsed&amp;f=$nxt[0]'>Необработанные</a> |
319                <a href='?mode=r_parsed&amp;f=$nxt[0]'>Обработанные</a> |
320                <a href='?mode=r_multiparsed&amp;f=$nxt[0]'>Дублирующиеся</a>
321               
322                ");
323                $i=1-$i;
324        }
325
326        $tmpl->AddText("</table>");
327}
328else if($mode=='load')
329{
330        $m_upl_size=get_max_upload_filesize();
331        $tmpl->AddText("
332        <form method=post enctype='multipart/form-data'>
333        <input type=hidden name=mode value='parse'>
334        <h1>Загрузить прайс в базу</h1>
335        Файл прайса (таблица ODF или XLS, до $m_upl_size байт, файл должен иметь корректное расширение)<br>
336        <input type='hidden' name='MAX_FILE_SIZE' value='$m_upl_size'>
337        <input name='file' type='file'><br>
338        Организация будет выбрана автоматически на основе списка сигнатур. Если организации нет в списке, Вам будет предложено её добавить.<br>
339        <label><input type='checkbox' name='bhtml' value='1'>Показать загруженные таблицы</label><br>
340        <input type=submit value='Загрузить'>
341        </form>
342        <p><b>Важно!</b> Загруженный прайс заменит уже существующую информацию в базе по соответствующей организации. Загрузка будет выполнена немедленно, но проанализированны данные будут при следующем запуске анализатора (обычно в течение одного часа).</p>");
343}
344else if($mode=="parse")
345{
346        $bhtml=rcv('bhtml');
347        if(!is_uploaded_file($_FILES['file']['tmp_name']))
348                throw new Exception("Файл не получен. Возможно, его забыли выбрать, либо он слишком большой.");
349        if($_FILES['file']['size']>(4000*1024))
350                throw new Exception("Слишком большой файл!");
351       
352        require_once($CONFIG['location']."/common/priceloader.xls.php");
353        require_once($CONFIG['location']."/common/priceloader.ods.php");
354       
355        $path_info = pathinfo($_FILES['file']['name']);
356        switch(strtolower($path_info['extension']))
357        {
358                case 'xls':     $loader=new XLSPriceLoader($_FILES['file']['tmp_name']);
359                                break;
360                case 'ods':     $loader=new ODSPriceLoader($_FILES['file']['tmp_name']);
361                                break;
362                default:        throw new Exception("Неверное расширение файла!");
363        }
364       
365        $firm_array=$loader->detectSomeFirm();
366        $loader->setBuildHTMLData(40);
367        foreach($firm_array as $firm)
368        {
369                $loader->setInsertToDatabase();
370                $loader->useFirmAndCurency($firm['firm_id'],$firm['curency_id']);
371                $count=$loader->Run();
372                $tmpl->msg("Успешно обработано $count строк фирмы {$firm['firm_id']} ({$firm['firm_name']})","ok");
373                if($bhtml)      $tmpl->AddText("<h3>Загруженные данные:</h3>".$loader->getHTML());
374                $f=1;
375        }
376        if($f==0)
377        {
378                $tmpl->msg("Фирма не определена!","info");
379                if($bhtml)
380                {
381                        $loader->Run();
382                        $tmpl->AddText("<h3>Загруженные данные:</h3>".$loader->getHTML());
383                }
384
385                firmAddForm();
386        }
387       
388//      if($firm=$loader->detectFirm())
389//      {
390//              $loader->setInsertToDatabase();
391//              if($bhtml)      $loader->setBuildHTMLData();
392//              $count=$loader->Run();
393//              $tmpl->msg("Успешно обработано $count строк фирмы $firm","ok");
394//              if($bhtml)      $tmpl->AddText("<h3>Загруженные данные:</h3>".$loader->getHTML());
395//      }
396//      else
397//      {
398//              $tmpl->msg("Фирма не определена!","info");
399//              if($bhtml)
400//              {
401//                      $loader->setBuildHTMLData();
402//                      $loader->Run();
403//                      $tmpl->AddText("<h3>Загруженные данные:</h3>".$loader->getHTML());
404//              }
405//
406//              firmAddForm();
407//      }
408}
409else if($mode=='firme')
410{
411        $id=rcv('id');
412        firmAddForm($id);
413}
414else if($mode=='firms')
415{
416        $id=rcv('id');
417        $nm=rcv('nm');
418        $sign=rcv('sign');
419        $curr=rcv('curr');
420        $coeff=rcv('coeff');
421        $type=rcv('type');
422        $table_name=rcv('table_name');
423        $delivery_info=rcv('delivery_info');
424        if(!$id)
425        {
426                $col_art=rcv('col_art');
427                $col_name=rcv('col_name');
428                $col_cost=rcv('col_cost');
429                $col_nal=rcv('col_nal');               
430                $col_curr=rcv('col_curr');
431                $col_info=rcv('col_info');
432                $res=mysql_query("INSERT INTO `firm_info` (`name`, `signature`, `currency`, `coeff`, `type`, `delivery_info`)
433                VALUES ('$nm', '$sign', '$curr', '$coeff', '$type', '$delivery_info')");
434                if(mysql_errno())       throw new MysqlException("Не удалось добавить новую фирму");
435
436                $firm_id=mysql_insert_id();
437                mysql_query("INSERT INTO `firm_info_struct` (`firm_id`, `table_name`, `art`, `name`, `cost`, `nal`, `currency`, `info`)
438                VALUES ('$firm_id', '$table_name', '$col_art', '$col_name', '$col_cost', '$col_nal', '$col_curr', '$col_info')");
439                if(mysql_errno())       throw new MysqlException("Не удалось добавить структуру прайса");
440                $tmpl->msg("Фирма добавлена!",'ok');
441        }
442        else
443        {
444                $res=mysql_query("UPDATE `firm_info` SET `name`='$nm', `signature`='$sign', `currency`='$curr', `coeff`='$coeff', `type`='$type', `delivery_info`='$delivery_info' WHERE `id`='$id'");
445                if(mysql_errno())       throw new MysqlException("Не удалось обновить данные фирмы");
446                $tmpl->msg("Фирма обновлена!",'ok');
447        }
448        if($type==2)    // Влияние цен для заданных групп товаров
449        {
450                $g=@$_POST['g'];
451                mysql_query("DELETE FROM `firm_info_group` WHERE `firm_id`='$id'");
452                if(mysql_errno())       throw new MysqlException("Не удалось удалить устаревшие данные");
453                if(is_array($g))
454                foreach($g as $line)
455                {
456                        mysql_query("INSERT INTO `firm_info_group` (`firm_id`, `group_id`) VALUES ('$id', '$line')");
457                        if(mysql_errno())       throw new MysqlException("Не удалось обновить привязки к группам");
458                }
459                $tmpl->msg("Привязки к группам обновлены!",'ok');
460        }
461}
462else if($mode=='firmss')
463{
464        $line_id=rcv('line_id');
465        $firm_id=rcv('firm_id');
466        $table_name=rcv('table_name');
467        $col_art=rcv('col_art');
468        $col_name=rcv('col_name');
469        $col_cost=rcv('col_cost');
470        $col_nal=rcv('col_nal');
471        $col_curr=rcv('col_curr');
472        $col_info=rcv('col_info');
473        if(!$line_id)
474        {
475                mysql_query("INSERT INTO `firm_info_struct` (`firm_id`, `table_name`, `art`, `name`, `cost`, `nal`, `currency`, `info`)
476                VALUES ('$firm_id', '$table_name', '$col_art', '$col_name', '$col_cost', '$col_nal', '$col_curr', '$col_info')");
477                if(mysql_errno())       throw new MysqlException("Не удалось вставить строку");
478        }
479        else
480        {
481                mysql_query("UPDATE `firm_info_struct` SET `table_name`='$table_name', `art`='$col_art', `name`='$col_name', `cost`='$col_cost', `nal`='$col_nal', `currency`='$col_curr', `info`='$col_info' WHERE `id`='$line_id'");
482                if(mysql_errno())       throw new MysqlException("Не удалось обновить данные");
483                if(mysql_affected_rows()==0)    $tmpl->msg("Ничего не изменено","info");
484        }
485
486        $tmpl->msg("Операция выполнена успешно!",'ok');
487}
488else if($mode=='firmsd')
489{
490        $p=rcv('p');
491        $res=mysql_query("DELETE FROM `firm_info_struct` WHERE `id`='$p'");
492        if($res) $tmpl->msg("Удалено!","ok");
493        else $tmpl->msg("Не удалось удалть!","err");
494}
495else if($mode=='viewall')
496{
497        $s=rcv('s');
498        if($rv=rcv('rv'))
499        {
500                $ch=' checked';
501                $ss='';
502        }
503        else
504        {
505                $ch='';
506                $ss="WHERE `price`.`name` LIKE '%$s%' OR `price`.`art` LIKE '%$s%'";
507        }
508        $tmpl->AddText("<h3>Поиск по критерию</h3>
509        <form action='' method=post>
510        <input type=hidden nmae=mode value=viewall>
511        Строка поиска:<br>
512        <input type=text name=s value='$s'><br>
513        <label><input type=checkbox name=rv value=1 $ch>Регулярное выражение</label><br>
514        <input type=submit value='Выполнить отбор'>
515        </form>");
516        $res=mysql_query("SELECT `price`.`name`, `price`.`cost`, `price`.`art`, `firm_info`.`name`
517        FROM `price`
518        LEFT JOIN `firm_info` ON `firm_info`.`id`=`price`.`firm`
519        $ss
520        ORDER BY `price`.`name`");
521        echo $ss;
522        $tmpl->AddText("<table width=100%><tr><th>Наименование<th>Цена<th>Артикул<th>Фирма");
523        while($nxt=mysql_fetch_row($res))
524        {
525                if($rv)
526                {
527                        if(preg_match("/$s/",$nxt[0]))
528                        {
529                                $tmpl->AddText("<tr><td>$nxt[0]<td>$nxt[1]<td>$nxt[2]<td>$nxt[3]");
530                        }
531                }
532                else $tmpl->AddText("<tr><td>$nxt[0]<td>$nxt[1]<td>$nxt[2]<td>$nxt[3]");
533        }
534        $tmpl->AddText("</table>");
535}
536else if($mode=='viewsort')
537{
538        $tmpl->AddText("<h3>Сортированная выборка</h3>");
539
540        $header="<tr><th>Name";
541        $res=mysql_query("SELECT `name` FROM `firm_info` WHERE `id`!='0' ORDER BY `id`");
542        $f_max=mysql_num_rows($res);
543        while($nxt=mysql_fetch_row($res))
544                $header.="<th>$nxt[0]";
545
546        $tmpl->AddText("<table width=100%>$header");
547        $res=mysql_query("SELECT `seekdata`.`name`,`seekdata`.`sql`,`seekdata`.`regex`,`seekdata`.`id`, `doc_group`.`name` FROM `seekdata`
548        LEFT JOIN `doc_group` ON `doc_group`.`id`=`seekdata`.`group`
549        ORDER BY `seekdata`.`name`");
550        $c=0;
551        while($nxt=mysql_fetch_row($res))
552        {
553                $costar=array();
554                $rs=mysql_query("SELECT `name`,`cost`,`firm` FROM `price`
555                WHERE `name` LIKE '%$nxt[1]%' ORDER BY `cost` LIMIT 1000");
556                while($nx=mysql_fetch_row($rs))
557                {
558                        if(preg_match("/$nxt[2]/",$nx[0]))
559                        {
560                                if($costar[$nx[2]])
561                                        $costar[$nx[2]].=" / <a title='$nx[0]'>".$nx[1]."</a>";
562                                else
563                                        $costar[$nx[2]]="<a title='$nx[0]'>".$nx[1]."</a>";
564                        }
565                }
566                $tmpl->AddText("<tr><td><a title='$nxt[2]' href='?mode=regve&amp;id=$nxt[3]'>$nxt[4] $nxt[0]</a>");
567                for($i=1;$i<=$f_max;$i++)
568                        $tmpl->AddText("<td>$costar[$i]");
569                $c++;
570                if($c>=15)
571                {
572                        $tmpl->AddText($header);
573                        $c=0;
574                }
575        }
576        $tmpl->AddText("</div></table>");
577}
578else if($mode=='search')
579{
580        $s=rcv('s');
581        $g=rcv('g');
582        $tmpl->AddText("<h3>Поиск по строке</h3>
583        <form action='' mode='get'>
584        <input type='hidden' name='mode' value='search'>
585        <input type='text' name='s' value='$s'>
586        <input type='submit' value='Найти'></form></b>");
587        if($s)
588        {
589                $tmpl->AddText("<h3>Результаты:</h3>");
590                if(strlen($g)==0)
591                {
592                        $tmpl->AddText("<h3>Интересующие Вас товары найдены в группах:</h3>");
593                        $res=mysql_query("SELECT `doc_group`.`id`, `doc_group`.`name` FROM `seekdata`
594                        LEFT JOIN `doc_group` ON `doc_group`.`id`=`seekdata`.`group`
595                        WHERE `seekdata`.`name` LIKE '%$s%'
596                        GROUP BY `seekdata`.`group`");
597                        while($nxt=mysql_fetch_row($res))
598                        {
599                                if($nxt[1]=='')
600                                {
601                                        $nxt[1]='==Группа не указана==';
602                                        $nxt[0]=0;
603                                }
604                                $tmpl->AddText("<a href='?mode=search&amp;s=$s&amp;g=$nxt[0]'>$nxt[1]</a><br>");
605                        }
606
607                }
608                else
609                {
610                        $tmpl->AddText("<h3>Результаты в выбранной группе</h3>");
611                        $res=mysql_query("SELECT `seekdata`.`id`, `seekdata`.`name` FROM `seekdata`
612                        LEFT JOIN `doc_group` ON `doc_group`.`id`=`seekdata`.`group`
613                        WHERE `seekdata`.`name` LIKE '%$s%' AND `seekdata`.`group`='$g'");
614                        while($nxt=mysql_fetch_row($res))
615                        {
616                                $tmpl->AddText("$nxt[1]<br>");
617                        }
618
619
620                }
621
622        }
623
624}
625else if($mode=='regve')
626{
627        exit();
628        $id=rcv('id');
629        $nxt=array();
630        $tmpl->AddText("<h3>Правка условия выборки</h3>
631        <form action='' method=post>
632        <input type=hidden name=mode value=regvs>");
633        if($id)
634        {
635                $tmpl->AddText("<input type=hidden name=id value='$id'>");
636                $res=mysql_query("SELECT `name`,`sql`,`regex`, `group` FROM `seekdata` WHERE `id`='$id'");
637                $nxt=mysql_fetch_row($res);
638        }
639        $tmpl->AddText("
640        Наименование:<br>
641        <input type=text name=nm value='$nxt[0]'><br>
642        Группа:<br>
643        <select name='group'>");
644        $res=mysql_query("SELECT `id`, `name` FROM `doc_group` ORDER BY `name`");
645        if(!$nxt[3])
646                $tmpl->AddText("<option style='background-color: #8f8;' selected disabled value='0'>--- не выбрана ---</option>");
647        while($nx=mysql_fetch_row($res))
648        {
649                if($nx[0]==$nxt[3])
650                        $tmpl->AddText("<option style='background-color: #8f8;' selected value='$nx[0]'>$nx[1] ($nx[0])</option>");
651                else
652                        $tmpl->AddText("<option value='$nx[0]'>$nx[1] ($nx[0])</option>");
653        }
654
655        $tmpl->AddText("</select>
656        Строка отбора (можно использовать символ %):<br>
657        <input type=text name=ss value='$nxt[1]'><br>
658        Регулярное выражение поиска:<br>
659        <input type=text name=rv value='$nxt[2]' id='re' onkeydown=\"DelayedSave('/priceload.php?mode=regvt','regex_text', 're'); return true;\" ><br>
660        <input type=submit value='Записать'>
661        </form>
662        <div id='regex_text'>ss</div>");
663}
664else if($mode=='regvt')
665{
666        $tmpl->ajax=1;
667        $s=@$_GET['s'];
668        if($s=='')
669        {
670                echo"Пустой запрос!";
671                exit();
672
673        }
674        //$s='/'.$s.'/';
675
676        $costar=array();
677        $rs=@mysql_query("SELECT `name`,`cost`,`firm` FROM `price`");
678        $cnt=mysql_num_rows($rs);
679        echo mysql_error();
680
681        $tmpl->AddText("<h3>Результаты отбора $s ($cnt совпадений, 100 максимум):</h3>");
682        $tmpl->AddText("<table width=100%><tr>");
683        $res=mysql_query("SELECT `name` FROM `firm_info` WHERE `id`!='0' ORDER BY `id`");
684        $f_max=mysql_num_rows($res);
685        while(@$nxt=mysql_fetch_row($res))
686                $tmpl->AddText("<th>$nxt[0]");
687
688        while(@$nx=mysql_fetch_row($rs))
689        {
690                if($a=preg_match("/$s/",$nx[0]))
691                {
692
693                        if($costar[$nx[2]])
694                                $costar[$nx[2]].="<hr>$nx[0] ($nx[1])";
695                        else
696                                $costar[$nx[2]]="$nx[0] ($nx[1])";
697                }
698                if($a===FALSE) break;
699        }
700        $tmpl->AddText("<tr valign=top>");
701        for($i=1;$i<=$f_max;$i++)
702                $tmpl->AddText("<td>$costar[$i]");
703
704        $tmpl->AddText("</table>");
705}
706else if($mode=='regvs')
707{
708        $id=rcv('id');
709        $nm=rcv('nm');
710        $ss=rcv('ss');
711        $g=rcv('group');
712        $rv=@$_POST['rv'];
713        if($id)
714        {
715                $res=mysql_query("UPDATE `seekdata` SET `name`='$nm', `sql`='$ss', `regex`='$rv', `group`='$g' WHERE `id`='$id'");
716                if($res) $tmpl->msg("Данные обновлены!",'ok');
717                else $tmpl->msg("Данные НЕ обновлены!",'err');
718        }
719        else
720        {
721                $res=mysql_query("INSERT INTO `seekdata` (`name`, `sql`, `regex`, `group`)
722                VALUES ('$nm', '$ss', '$rv', '$g')");
723                if($res) $tmpl->msg("Данные обновлены!",'ok');
724                else $tmpl->msg("Данные НЕ обновлены!",'err');
725        }
726
727        $costar=array();
728        $rs=@mysql_query("SELECT `name`,`cost`,`firm` FROM `price`
729        WHERE `name` LIKE '$ss' ORDER BY `cost` LIMIT 100");
730        $cnt=mysql_num_rows($rs);
731        echo mysql_error();
732
733        $tmpl->AddText("<h3>Результаты отбора $rv ($cnt совпадений, 100 максимум):</h3>");
734        $tmpl->AddText("<table width=100%><tr>");
735        $res=mysql_query("SELECT `name` FROM `firm_info` WHERE `id`!='0' ORDER BY `id`");
736        $f_max=mysql_num_rows($res);
737        while(@$nxt=mysql_fetch_row($res))
738                $tmpl->AddText("<th>$nxt[0]");
739
740        while(@$nx=mysql_fetch_row($rs))
741        {
742                if(preg_match("/$rv/",$nx[0]))
743                {
744                        if($costar[$nx[2]])
745                                $costar[$nx[2]].="<hr>$nx[0] ($nx[1])";
746                        else
747                                $costar[$nx[2]]="$nx[0] ($nx[1])";
748                }
749        }
750        $tmpl->AddText("<tr valign=top>");
751        for($i=1;$i<=$f_max;$i++)
752                $tmpl->AddText("<td>$costar[$i]");
753
754        $tmpl->AddText("</table>");
755}
756else if($mode=='r_noparsed')
757{
758        $f=rcv('f');
759        $s1=rcv('s1');
760        $s2=rcv('s2');
761        $s3=rcv('s3');
762        $tmpl->AddText("<h1 id='page-title'>Необработанные позиции</h1>
763        <div id='page-info'>Отметьте галочками нужные, и добавте на склад. Можно воспользоваться фильтром.</div>");
764        if($f)  $sql_add=" AND `price`.`firm`='$f'";
765        else    $sql_add='';
766        if($s1) $sql_add.="AND (`price`.`name` LIKE '%$s1%' OR `price`.`info` LIKE '%$s1%')";
767        if($s2) $sql_add.="AND (`price`.`name` LIKE '%$s2%' OR `price`.`info` LIKE '%$s2%')";
768        if($s3) $sql_add.="AND (`price`.`name` LIKE '%$s3%' OR `price`.`info` LIKE '%$s3%')";
769        $res=mysql_query("SELECT `price`.`id`, `price`.`art`, `price`.`name`, `firm_info`.`name`, `price`.`info`
770        FROM `price`
771        LEFT JOIN `firm_info` ON `firm_info`.`id`=`price`.`firm`
772        WHERE `seeked`='0' $sql_add
773        LIMIT 100000");
774        if(mysql_num_rows($res))
775        {
776                $i=0;
777                $tmpl->AddText("
778                <script type='text/javascript'>
779
780                function SelAll(flag)
781                {
782                        var elems = document.getElementsByName('p[]');
783                        var l = elems.length;
784                        for(var i=0; i<l; i++)
785                        {
786                                elems[i].checked=flag;
787                                if(flag)        elems[i].disabled = false;
788                        }
789                }
790
791                </script>
792                <form action='' method='get'>
793                <input type='hidden' name='mode' value='r_noparsed'>
794                <input type='hidden' name='f' value='$f'>
795                <input type='text' name='s1' value='$s1'> - <input type='text' name='s2' value='$s2'> - <input type='text' name='s3' value='$s3'>
796                <button>Отфильтровать</button>
797                </form>
798                <form action='' method='post'>
799                <input type='hidden' name='mode' value='adding'>
800                <div class='selmenu'><a onclick='SelAll(true)'>Выбрать всё<a> | <a onclick='SelAll(false)'>Снять всё</a></div>
801                <table width='100%'><tr><th>ID<th>Код произв.<th>Наименование<th>Инфо<th>Фирма");
802                while($nxt=mysql_fetch_row($res))
803                {
804                        $i=1-$i;
805                        $tmpl->AddText("<tr class='lin$i'><td><label><input type='checkbox' name='p[]' value='$nxt[0]'>$nxt[0]</label><td>$nxt[1]<td>$nxt[2]<td>$nxt[4]<td>$nxt[3]");
806                }
807                $tmpl->AddText("</table><button type='submit'>Далее</button></form>");
808        }
809        else $tmpl->msg("Необработанных позиций не обнаружено!");
810}
811else if($mode=='adding')
812{
813        $tmpl->AddText("<h1 id='page-title'>Добавление позиций на склад</h1>
814        <div id='page-info'>Назовите позиции так, как они должны называться в вашем прайсе</div>");
815        $p=@$_POST['p'];
816        if(!is_array($p))       throw new Exception("Список позиций не получен");
817        $res=mysql_query("SELECT `price`.`id`, `price`.`art`, `price`.`name`
818        FROM `price`
819        WHERE `seeked`='0'");
820        if(mysql_errno())       throw new MysqlException("Не удалось получить данные прайсов");
821        $tmpl->AddText("<form action='' method='post'>
822        <input type='hidden' name='mode' value='adding_s'>
823        <table width='100%'><tr><th>N<th>Код произв.<th>Оригинальное наименование<th style='width: 40%'>Наше наименование</th><th>Описание</th></tr>");
824        $i=0;
825        while($nxt=mysql_fetch_row($res))
826        {
827                if(!in_array($nxt[0],$p))       continue;
828                $i++;
829                $nxt[1]=trim($nxt[1]);
830                $nxt[2]=trim($nxt[2]);
831                $name=mb_substr($nxt[2],0,128,"UTF-8");
832                $tmpl->AddText("<tr class='lin$i'><td>$i<td><input type='text' name='vc[$nxt[0]]' value='$nxt[1]'><td>$nxt[2]<td><input type='text' name='n[$nxt[0]]' value='$name' style='width: 95%'><td><textarea name='d[$nxt[0]]'>$nxt[2]</textarea>");
833        }
834        $tmpl->AddText("</table>Группа:<br><select name='group'>");
835        $res=mysql_query("SELECT `id`, `name` FROM `doc_group`");
836        while($nxt=mysql_fetch_row($res))
837        {
838                $tmpl->AddText("<option value='$nxt[0]'>$nxt[1] ($nxt[0])</option>");
839        }
840        $tmpl->AddText("</select><br>Единицы измерения:<br><select name='units'>");
841        $res2=mysql_query("SELECT `id`, `name` FROM `class_unit_group` ORDER BY `id`");
842        while($nx2=mysql_fetch_row($res2))
843        {
844                $tmpl->AddText("<option disabled style='color:#fff; background-color:#000'>$nx2[1]</option>\n");
845                $res=mysql_query("SELECT `id`, `name`, `rus_name1` FROM `class_unit` WHERE `class_unit_group_id`='$nx2[0]'");
846                while($nx=mysql_fetch_row($res))
847                {
848                        $tmpl->AddText("<option value='$nx[0]'>$nx[1] ($nx[2])</option>");
849                }
850        }
851        $tmpl->AddText("</select><br><button type='submit'>Добавить</button></form>");
852}
853else if($mode=='adding_s')
854{
855        $group=rcv('group');
856        $units=rcv('units');
857        $tmpl->AddText("<h1 id='page-title'>Добавление позиций на склад - сохранение</h1>");
858        $n=@$_POST['n'];
859        if(!is_array($n))       throw new Exception("Список позиций не получен");
860        foreach($n as $id => $value)
861        {
862                $vc=mysql_real_escape_string(@$_POST['vc'][$id]);
863                $desc=mysql_real_escape_string(@$_POST['d'][$id]);
864                $value=mysql_real_escape_string($value);
865                mysql_query("INSERT INTO `doc_base` (`group`, `name`, `vc`, `unit`, `desc`) VALUES ('$group', '$value', '$vc', '$units', '$desc')");
866                if(mysql_errno())       throw new MysqlException("Не удалось добавить наименование $value");
867                $pos_id=mysql_insert_id();
868                $tmpl->AddText("Добавлено $pos_id: $vc - $value<br>");
869                if($vc)
870                {
871                        mysql_query("INSERT INTO `seekdata` (`id`, `sql`) VALUES ('$pos_id', '$vc')");
872                        if(mysql_errno())       throw new MysqlException("Не удалось добавить данные анализатора для наименования $value");
873                }
874        }
875        $tmpl->msg("Все операции выполнены!","ok");
876}
877else if($mode=='r_parsed')
878{
879        $f=rcv('f');
880        $tmpl->AddText("<h1>Отчёт по обработаным позициям</h1>");
881        if($f) $f=" AND `price`.`firm`='$f'";
882        $res=mysql_query("SELECT `price`.`id`, `price`.`name`, `price`.`art`, `firm_info`.`name`
883        FROM `price`
884        LEFT JOIN `firm_info` ON `firm_info`.`id`=`price`.`firm`
885        WHERE `seeked`='1' $f
886        LIMIT 100000");
887        if(mysql_num_rows($res))
888        {
889                $i=0;
890                $tmpl->AddText("<table width='100%'><tr><th>ID<th>Наименование<th>Артикул<th>Фирма");
891                while($nxt=mysql_fetch_row($res))
892                {
893                        $i=1-$i;
894                        $tmpl->AddText("<tr class='lin$i'><td><a href='?mode=multi_view&amp;p=$nxt[0]'>$nxt[0]</a><td>$nxt[1]<td>$nxt[2]<td>$nxt[3]");
895                }
896                $tmpl->AddText("</table>");
897        }
898        else $tmpl->msg("Обработанных позиций не обнаружено!");
899}
900else if($mode=='r_multiparsed')
901{
902        $f=rcv('f');
903        $tmpl->AddText("<h1>Отчёт по многократно обработанным позициям</h1>");
904        if($f) $f=" AND `price`.`firm`='$f'";
905        $res=mysql_query("SELECT `price`.`id`, `price`.`name`, `price`.`art`, `firm_info`.`name`, `price`.`seeked`
906        FROM `price`
907        LEFT JOIN `firm_info` ON `firm_info`.`id`=`price`.`firm`
908        WHERE `seeked`>'1' $f
909        LIMIT 1000");
910        if(mysql_num_rows($res))
911        {
912                $i=0;
913                $tmpl->AddText("<table width='100%'><tr><th>ID<th>Наименование<th>Артикул<th>Фирма<th>Срабатываний");
914                while($nxt=mysql_fetch_row($res))
915                {
916                        $i=1-$i;
917                        $tmpl->AddText("<tr class='lin$i'><td><a href='?mode=multi_view&amp;p=$nxt[0]'>$nxt[0]</a><td>$nxt[1]<td>$nxt[2]<td>$nxt[3]<td>$nxt[4]");
918                }
919                $tmpl->AddText("</table>");
920        }
921        else $tmpl->msg("Многократно обработанных позиций не обнаружено!");
922}
923else if($mode=='multi_view')
924{
925        $price_id=rcv('p');
926        $tmpl->AddText("<h1>Информация о совпадениях выбранной позиции прайса</h1>");
927        $res=mysql_query("SELECT `parsed_price`.`pos`, `doc_group`.`name`, `doc_base`.`name`, `seekdata`.`sql`, `seekdata`.`regex` FROM `parsed_price`
928        LEFT JOIN `seekdata` ON `seekdata`.`id`=`parsed_price`.`pos`
929        LEFT JOIN `doc_base` ON `doc_base`.`id`=`parsed_price`.`pos`
930        LEFT JOIN `doc_group` ON `doc_group`.`id`=`doc_base`.`group`
931        WHERE `parsed_price`.`from`='$price_id'");
932        $tmpl->AddText("<table width='100%'><tr><th>ID<th>Наименование<th>Строка поиска<th>Регулярное выражение");
933        while($nxt=mysql_fetch_row($res))
934        {
935                $i=1-$i;
936                $tmpl->AddText("<tr class='lin$i'><td><a href='/docs.php?l=pran&mode=srv&opt=ep&pos=$nxt[0]'>$nxt[0]</a><td>$nxt[1] - $nxt[2]<td>$nxt[3]<td>$nxt[4]");
937        }
938        $tmpl->AddText("</table>");
939}
940else if($mode=='replaces')
941{
942        $tmpl->AddText("<h1>Подстановки для регулярных выражений</h1>
943        <table width='100%'><tr><th>ID<th>Поиск<th>Замена");
944        $res=mysql_query("SELECT `id`, `search_str`, `replace_str` FROM `prices_replaces` ORDER BY `search_str`");
945        if(mysql_errno())       throw new MysqlException('Не удалось получить список подстановок!');
946        while($nxt=mysql_fetch_row($res))
947        {
948                $tmpl->AddText("<tr><td><a href='?mode=replacese&amp;p=$nxt[0]'>$nxt[0]</a> <a href='?mode=replacesd&amp;p=$nxt[0]' title='Удалить'><img src='/img/i_del.png' alt='Удалить'></a><td>{{{$nxt[1]}}}<td>$nxt[2]");
949        }
950        $tmpl->AddText("</table><br>
951        <a href='?mode=replacese&amp;p=0'><img src='/img/i_add.png' alt='Добавить'> Добавить</a>");
952}
953else if($mode=='replacese')
954{
955        $p=rcv('p');
956        $res=mysql_query("SELECT `id`, `search_str`, `replace_str` FROM `prices_replaces` WHERE `id`='$p'");
957        if(mysql_errno())       throw new MysqlException('Не удалось получить данные подстановки!');
958        $nxt=@mysql_fetch_row($res);
959        $tmpl->AddText("<h1>Правка подстановки</h1>
960        <form action='' method='post'>
961        <input type='hidden' name='mode' value='replacess'>
962        <input type='hidden' name='p' value='$nxt[0]'>
963        Поиск:<br>
964        <input type='text' name='search_str' value='$nxt[1]'><br>
965        Замена:<br>
966        <input type='text' name='replace_str' value='$nxt[2]'><br>
967        <button>Сохранить</button>
968        </form>");
969}
970else if($mode=='replacess')
971{
972        $p=rcv('p');
973        $search_str=rcv('search_str');
974        $replace_str=rcv('replace_str');
975
976        if($p=='')
977        {
978                mysql_query("INSERT INTO `prices_replaces` (`search_str`, `replace_str`) VALUES ('$search_str', '$replace_str')");
979                if(mysql_errno())       throw new MysqlException('Не удалось добавить данные подстановки!');
980                $p=mysql_insert_id();
981        }
982        else
983        {
984                mysql_query("UPDATE `prices_replaces` SET `search_str`='$search_str', `replace_str`='$replace_str' WHERE `id`='$p'");
985                if(mysql_errno())       throw new MysqlException('Не удалось обновить данные подстановки!');
986        }
987
988        $tmpl->msg("Выполнено!<br><a href='?mode=replaces'>Вернуться к таблице</a> | <a href='?mode=replacese&amp;p=$p'>Продолжить редактирование</a>","ok","Сохранение подстановки");
989}
990else if($mode=='menu')
991{
992        $tmpl->ajax=1;
993        $tmpl->SetText("
994        <div onclick=\"window.location='/docs.php?l=pran'\">Результаты анализа</div>
995        <div onclick=\"window.location='/priceload.php'\">Редактор организаций</div>
996        <div onclick=\"window.location='/priceload.php?mode=load'\">Загрузить прайс</div>
997        <div onclick=\"window.location='/priceload.php?mode=viewall'\">Просмотреть общий список</div>
998        <div onclick=\"window.location='/priceload.php?mode=search'\">Поиск</div>
999        <div onclick=\"window.location='/priceload.php?mode=replaces'\">Подстановки</div>
1000        <div onclick=\"window.location='/priceload.php?mode=r_noparsed'\">Ошибки: необработанные</div>
1001        <div onclick=\"window.location='/priceload.php?mode=r_multiparsed'\">Ошибки: дублирующиеся</div>");
1002}
1003else $tmpl->logger('Запрошен неверный режим! Возможно, вы указали неверные параметры, или же ссылка, по которой Вы обратились, неверна.');
1004
1005
1006}
1007catch(MysqlException $e)
1008{
1009        $tmpl->ajax=0;
1010        $tmpl->msg($e->getMessage()."<br>Сообщение передано администратору",'err',"Ошибка в базе данных");
1011}
1012catch(Exception $e)
1013{
1014        $tmpl->msg($e->getMessage(),'err');
1015}
1016
1017$tmpl->write();
1018?>
Note: See TracBrowser for help on using the repository browser.