1
Changeset b490b46 – MultiMag

Changeset b490b46


Ignore:
Timestamp:
Oct 4, 2013, 1:37:38 AM (8 years ago)
Author:
Blacklight <blacklight@…>
Branches:
master
Children:
50e4c67
Parents:
03d943c
Message:
  • Слияние с веткой mysqli
Files:
6 added
137 edited

Legend:

Unmodified
Added
Removed
  • cli/async.php

    r03d943c rb490b46  
    33//      MultiMag v0.1 - Complex sales system
    44//
    5 //      Copyright (C) 2005-2012, BlackLight, TND Team, http://tndproject.org
     5//      Copyright (C) 2005-2013, BlackLight, TND Team, http://tndproject.org
    66//
    77//      This program is free software: you can redistribute it and/or modify
     
    2424require_once($CONFIG['cli']['location']."/core.cli.inc.php");
    2525
    26 try
    27 {
    28 
    29 $res=mysql_query("SELECT `id`, `task` FROM `async_workers_tasks` WHERE `needrun`=1 LIMIT 1");
    30 if(mysql_errno())       throw new MysqlException("Не удалось получить информацию об асинхронных обработчиках");
    31 while($ainfo=mysql_fetch_assoc($res))
    32 {
    33         mysql_query("UPDATE `async_workers_tasks` SET `needrun`=0, `textstatus`='Запускается' WHERE `id`='{$ainfo['id']}'");
    34         if(mysql_errno())       throw new MysqlException("Не удалось обновить статус");
    35         require_once($CONFIG['location']."/common/async/".strtolower($ainfo['task']).".php");
    36         $classname=$ainfo['task']."Worker";
    37         $worker=new $classname($ainfo['id']);
    38         $worker->run();
    39         $worker->end();
    40 
     26try {
     27        $res = $db->query("SELECT `id`, `task` FROM `async_workers_tasks` WHERE `needrun`=1 LIMIT 1");
     28        while ($ainfo = $res->fetch_assoc()) {
     29                $db->query("UPDATE `async_workers_tasks` SET `needrun`=0, `textstatus`='Запускается' WHERE `id`='{$ainfo['id']}'");
     30                require_once($CONFIG['location'] . "/common/async/" . strtolower($ainfo['task']) . ".php");
     31                $classname = $ainfo['task'] . "Worker";
     32                $worker = new $classname($ainfo['id']);
     33                $worker->run();
     34                $worker->end();
     35        }
    4136}
    42 
    43 }
    44 catch(Exception $e)
    45 {
    46         if($worker) {
     37catch (Exception $e) {
     38        if ($worker) {
    4739                try {
    4840                        $worker->finalize();
    49                 }
    50                 catch(Exception $e)
    51                 {
    52                         echo $e->getMessage()."\n";
    53                         mysql_query("UPDATE `async_workers_tasks` SET `needrun`=0, `textstatus`='".$e->getMessage()."' WHERE `id`='{$ainfo['id']}'");
     41                } catch (Exception $e) {
     42                        echo $e->getMessage() . "\n";
     43                        mysql_query("UPDATE `async_workers_tasks` SET `needrun`=0, `textstatus`='" . $e->getMessage() . "' WHERE `id`='{$ainfo['id']}'");
    5444                }
    5545        }
    56 
    5746        echo $e->getMessage();
    58         mysql_query("UPDATE `async_workers_tasks` SET `needrun`=0, `textstatus`='".$e->getMessage()."' WHERE `id`='{$ainfo['id']}'");
     47        $db->query("UPDATE `async_workers_tasks` SET `needrun`=0, `textstatus`='" . $db->real_escape_string($e->getMessage()) . "' WHERE `id`='{$ainfo['id']}'");
    5948}
    6049
  • cli/backup.php

    r03d943c rb490b46  
    33//      MultiMag v0.1 - Complex sales system
    44//
    5 //      Copyright (C) 2005-2012, BlackLight, TND Team, http://tndproject.org
     5//      Copyright (C) 2005-2013, BlackLight, TND Team, http://tndproject.org
    66//
    77//      This program is free software: you can redistribute it and/or modify
     
    1919//
    2020
    21 $c=explode('/',__FILE__);$base_path='';
    22 for($i=0;$i<(count($c)-2);$i++) $base_path.=$c[$i].'/';
     21$c = explode('/', __FILE__);
     22$base_path = '';
     23for ($i = 0; $i < (count($c) - 2); $i++)
     24        $base_path.=$c[$i] . '/';
    2325include_once("$base_path/config_cli.php");
    2426
    25 $archiv_dir=$CONFIG['backup']['archiv_dir'];
    26 $zip_level=$CONFIG['backup']['ziplevel'];
    27 $minspace=$CONFIG['backup']['min_free_space'];
     27$archiv_dir = $CONFIG['backup']['archiv_dir'];
     28$zip_level = $CONFIG['backup']['ziplevel'];
     29$minspace = $CONFIG['backup']['min_free_space'];
    2830
    2931
    3032// Check free disk space
    31 if($minspace && $archiv_dir)
    32 if(disk_free_space($archiv_dir)<=($minspace*1024*1024) )
    33 {
    34         echo"Need cleaning!\n";
    35        
    36         if ($handle = opendir($archiv_dir))
    37         {
    38                 while (false !== ($file = readdir($handle)))
    39                 {
    40                         if($file[0]=='.')       continue;
    41                         if(is_dir($archiv_dir.'/'.$file))
    42                                 dir_clean($archiv_dir.'/'.$file);
     33if ($minspace && $archiv_dir)
     34        if (disk_free_space($archiv_dir) <= ($minspace * 1024 * 1024)) {
     35                echo"Need cleaning!\n";
     36
     37                if ($handle = opendir($archiv_dir)) {
     38                        while (false !== ($file = readdir($handle))) {
     39                                if ($file[0] == '.')
     40                                        continue;
     41                                if (is_dir($archiv_dir . '/' . $file))
     42                                        dir_clean($archiv_dir . '/' . $file);
     43                        }
     44                        closedir($handle);
    4345                }
    44                 closedir($handle);
     46                else
     47                        echo">Dir $archiv_dir ERROR!\n";
    4548        }
    46         else echo">Dir $archiv_dir ERROR!\n";
    47 }
    4849
    49 $yy=date("Y");
    50 $tm=date("Y.m.d_H.i");
    51 @mkdir("$archiv_dir/$yy/",0700);
    52 @mkdir("$archiv_dir/$yy/$tm",0700);
     50$yy = date("Y");
     51$tm = date("Y.m.d_H.i");
     52@mkdir("$archiv_dir/$yy/", 0700);
     53@mkdir("$archiv_dir/$yy/$tm", 0700);
    5354
    54 if(@$CONFIG['backup']['mysql'])
    55 {
    56         @mkdir("/tmp/mysql_dump",0700);
    57         $res=mysql_list_dbs();
    58         while($nxt=mysql_fetch_row($res))
    59         {
    60                 if($nxt[0]=='mysql')                    continue;
    61                 if($nxt[0]=='information_schema')       continue;
     55if (@$CONFIG['backup']['mysql']) {
     56        @mkdir("/tmp/mysql_dump", 0700);
     57        $res = mysql_list_dbs();
     58        while ($nxt = mysql_fetch_row($res)) {
     59                if ($nxt[0] == 'mysql')
     60                        continue;
     61                if ($nxt[0] == 'information_schema')
     62                        continue;
    6263                echo"Dumping $nxt[0]...";
    6364                `mysqldump -u {$CONFIG['mysql']['login']} -p{$CONFIG['mysql']['pass']} -R -l --hex-blob -q -Q $nxt[0] > /tmp/mysql_dump/$nxt[0].dump`;
    6465                echo"Done!\n";
    6566                echo"Zipping mysql dump $nxt[0]...";
    66                 if(@$CONFIG['backup']['archiver']=='7z')
     67                if (@$CONFIG['backup']['archiver'] == '7z')
    6768                        `7zr a -ssc -mx=$zip_level $archiv_dir/$yy/$tm/mysql_$nxt[0].7z /tmp/mysql_dump/$nxt[0].dump`;
    68                 else    `zip $archiv_dir/$yy/$tm/mysql_$nxt[0].zip -r /tmp/mysql_dump/$nxt[0].dump -$zip_level -j`;
     69                else
     70                        `zip $archiv_dir/$yy/$tm/mysql_$nxt[0].zip -r /tmp/mysql_dump/$nxt[0].dump -$zip_level -j`;
    6971                echo"Done!\n";
    7072        }
    7173}
    7274
    73 if(@is_array($CONFIG['backup']['dirs']))
    74 foreach($CONFIG['backup']['dirs'] as $arch => $path)
    75 {
    76         echo"Zipping $path => $arch...";
    77         if($CONFIG['backup']['archiver']=='7z')
    78                 `7zr a -ssc -mx=$zip_level $archiv_dir/$yy/$tm/$arch.7z $path`;
    79         else    `zip $archiv_dir/$yy/$tm/$arch.zip -r $path -$zip_level`;
    80         echo"Done!\n";
    81 }
     75if (@is_array($CONFIG['backup']['dirs']))
     76        foreach ($CONFIG['backup']['dirs'] as $arch => $path) {
     77                echo"Zipping $path => $arch...";
     78                if ($CONFIG['backup']['archiver'] == '7z')
     79                        `7zr a -ssc -mx=$zip_level $archiv_dir/$yy/$tm/$arch.7z $path`;
     80                else
     81                        `zip $archiv_dir/$yy/$tm/$arch.zip -r $path -$zip_level`;
     82                echo"Done!\n";
     83        }
    8284
    83 
    84 function dir_clean($dir_name)
    85 {
    86         $i=1;
    87         if ($handle = opendir($dir_name))
    88         {
     85function dir_clean($dir_name) {
     86        $i = 1;
     87        if ($handle = opendir($dir_name)) {
    8988                echo "Directory handle: $handle\n";
    9089                echo "Files:\n";
    91                 while (false !== ($file = readdir($handle)))
    92                 {
    93                         if($file[0]=='.')       continue;
    94                         if($i)
    95                         {
    96                                 $fn=$dir_name.'/'.$file;
     90                while (false !== ($file = readdir($handle))) {
     91                        if ($file[0] == '.')
     92                                continue;
     93                        if ($i) {
     94                                $fn = $dir_name . '/' . $file;
    9795                                deleteDirectory($fn);
    9896                                echo "Delete $fn\n";
    9997                        }
    100                         $i=1-$i;
     98                        $i = 1 - $i;
    10199                }
    102100                closedir($handle);
    103101        }
    104         else echo">Dir $dir_name ERROR!\n";
     102        else
     103                echo">Dir $dir_name ERROR!\n";
    105104}
    106105
    107 
    108 function deleteDirectory($dir)
    109 {
    110         if (!file_exists($dir)) return true;
    111         if (!is_dir($dir) || is_link($dir)) return unlink($dir);
    112         foreach (scandir($dir) as $item)
    113         {
    114                 if ($item == '.' || $item == '..') continue;
    115                 if (!deleteDirectory($dir . "/" . $item))
    116                 {
    117                         chmod($dir . "/" . $item, 0777);
    118                         if (!deleteDirectory($dir . "/" . $item)) return false;
    119                 }; 
    120         } 
    121         return rmdir($dir); 
     106function deleteDirectory($dir) {
     107        if (!file_exists($dir))
     108                return true;
     109        if (!is_dir($dir) || is_link($dir))
     110                return unlink($dir);
     111        foreach (scandir($dir) as $item) {
     112                if ($item == '.' || $item == '..')
     113                        continue;
     114                if (!deleteDirectory($dir . "/" . $item)) {
     115                        chmod($dir . "/" . $item, 0777);
     116                        if (!deleteDirectory($dir . "/" . $item))
     117                                return false;
     118                };
     119        }
     120        return rmdir($dir);
    122121}
    123122
     123if (@$CONFIG['backup']['ftp_host']) {
     124        $conn_id = @ftp_connect($CONFIG['backup']['ftp_host']);
     125        $login_result = @ftp_login($conn_id, $CONFIG['backup']['ftp_login'], $CONFIG['backup']['ftp_pass']);
    124126
    125 if(@$CONFIG['backup']['ftp_host'])
    126 {
    127 $conn_id = @ftp_connect($CONFIG['backup']['ftp_host']);
    128 $login_result = @ftp_login($conn_id, $CONFIG['backup']['ftp_login'], $CONFIG['backup']['ftp_pass']);
     127        if ((!$conn_id) || (!$login_result)) {
     128                echo "FTP connection has failed!\n";
     129                echo "Attempted to connect to {$CONFIG['backup']['ftp_host']}\n";
     130        } else {
     131                echo "Connected to {$CONFIG['backup']['ftp_host']}\n";
     132                if ($handle = opendir("$archiv_dir/$yy/$tm")) {
     133                        @ftp_mkdir($conn_id, "/{$CONFIG['site']['name']}");
     134                        @ftp_mkdir($conn_id, "/{$CONFIG['site']['name']}/$yy");
     135                        $res = ftp_mkdir($conn_id, "/{$CONFIG['site']['name']}/$yy/$tm");
     136                        if (!$res)
     137                                echo"MkDir ERROR!\n";
     138                        while (false !== ($file = readdir($handle))) {
     139                                if ($file[0] == '.')
     140                                        continue;
     141                                $sfn = "$archiv_dir/$yy/$tm/$file";
     142                                $rfn = "/{$CONFIG['site']['name']}/$yy/$tm/$file";
    129143
    130 if ((!$conn_id) || (!$login_result))
    131 {
    132    echo "FTP connection has failed!\n";
    133    echo "Attempted to connect to {$CONFIG['backup']['ftp_host']}\n";
    134 }
    135 else
    136 {
    137         echo "Connected to {$CONFIG['backup']['ftp_host']}\n";
    138         if($handle = opendir("$archiv_dir/$yy/$tm"))
    139         {
    140                 @ftp_mkdir ( $conn_id , "/{$CONFIG['site']['name']}");
    141                 @ftp_mkdir ( $conn_id , "/{$CONFIG['site']['name']}/$yy");
    142                 $res=ftp_mkdir ( $conn_id , "/{$CONFIG['site']['name']}/$yy/$tm");
    143                 if(!$res)       echo"MkDir ERROR!\n";
    144                 while (false !== ($file = readdir($handle)))
    145                 {
    146                         if($file[0]=='.')       continue;
    147                         $sfn="$archiv_dir/$yy/$tm/$file";
    148                         $rfn="/{$CONFIG['site']['name']}/$yy/$tm/$file";
    149                        
    150                         $upload = ftp_put($conn_id, $rfn, $sfn, FTP_BINARY);
     144                                $upload = ftp_put($conn_id, $rfn, $sfn, FTP_BINARY);
    151145
    152                         if (!$upload)   echo "FTP upload has failed!\n";
    153                         else            echo "Uploaded $sfn to ftpserver\n";
     146                                if (!$upload)
     147                                        echo "FTP upload has failed!\n";
     148                                else
     149                                        echo "Uploaded $sfn to ftpserver\n";
     150                        }
     151                        closedir($handle);
    154152                }
    155                 closedir($handle);
     153                else
     154                        echo">Dir reading ERROR!\n";
    156155        }
    157         else echo">Dir reading ERROR!\n";
    158 }
    159 @ftp_close($conn_id);
     156        @ftp_close($conn_id);
    160157}
    161158
  • cli/bank_exchange.php

    r03d943c rb490b46  
    33//      MultiMag v0.1 - Complex sales system
    44//
    5 //      Copyright (C) 2005-2010, BlackLight, TND Team, http://tndproject.org
     5//      Copyright (C) 2005-2013, BlackLight, TND Team, http://tndproject.org
    66//
    77//      This program is free software: you can redistribute it and/or modify
     
    2828
    2929`umount {$CONFIG['bank']['mountpoint']}`;
    30 `mount -t smbfs -o username={$CONFIG['bank']['login']},password={$CONFIG['bank']['pass']},iocharset=utf8 {$CONFIG['bank']['remotepoint']} {$CONFIG['bank']['mountpoint']}`;
     30`mount -t cifs -o username={$CONFIG['bank']['login']},password={$CONFIG['bank']['pass']},iocharset=utf8 {$CONFIG['bank']['remotepoint']} {$CONFIG['bank']['mountpoint']}`;
    3131
    3232
    33 $file=file($CONFIG['bank']['mountpoint'].'/export/STATES.TXT');
    34 if($file)
    35 {
    36 $params=array();
    37 $parsing=0;
    38 foreach($file as $line)
    39 {
    40         $line=iconv( 'windows-1251','UTF-8', $line);   
    41         //echo $line.'<br>';
    42         $line=trim($line);
    43         $pl=split("=",$line,2);
    44         switch($pl[0])
    45         {
    46                 case 'СекцияДокумент':
    47                         if($pl[1]=="Платёжное поручение")
    48                         {
    49                                 $parsing=1;
    50                                 echo"Новый $pl[1]\n";
    51                         }
    52                         else echo"Неопознанный документ: $pl[1]\n";
    53                 break;
    54                 case 'КонецДокумента':
    55                         if($parsing)
    56                         {
    57                                 doc_process($params);
    58                         }
    59                         $parsing=0;
    60                         $params=array();
    61                 break;
    62                 case 'Номер':
    63                         if($parsing)
    64                                 $params['docnum']=$pl[1];
    65                 break;
    66                 case 'УникальныйНомерДокумента':
    67                         if($parsing)
    68                                 $params['unique']=$pl[1];
    69                 break;
    70                 case 'ДатаПроведения':
    71                         if($parsing)
    72                                 $params['date']=$pl[1];
    73                 break; 
    74                 case 'БИК':
    75                         if($parsing)
    76                                 $params['bik']=$pl[1];
    77                 break; 
    78                 case 'Счет':
    79                         if($parsing)
    80                                 $params['schet']=$pl[1];
    81                 break;
    82                 case 'КорреспондентБИК':
    83                         if($parsing)
    84                                 $params['kbik']=$pl[1];
    85                 break;
    86                 case 'КорреспондентСчет':
    87                         if($parsing)
    88                                 $params['kschet']=$pl[1];
    89                 break; 
    90                 case 'ДебетСумма':
    91                         if($parsing)
    92                                 $params['debet']=$pl[1];
    93                 break;
    94                 case 'КредитСумма':
    95                         if($parsing)
    96                                 $params['kredit']=$pl[1];
    97                 break;
    98                 case 'НазначениеПлатежа':
    99                         if($parsing)
    100                                 $params['desc']=$pl[1];
    101                 break;
     33$file = file($CONFIG['bank']['mountpoint'] . '/export/STATES.TXT');
     34if ($file) {
     35        $params = array();
     36        $parsing = 0;
     37        foreach ($file as $line) {
     38                $line = iconv('windows-1251', 'UTF-8', $line);
     39                //echo $line.'<br>';
     40                $line = trim($line);
     41                $pl = split("=", $line, 2);
     42                switch ($pl[0]) {
     43                        case 'СекцияДокумент':
     44                                if ($pl[1] == "Платёжное поручение") {
     45                                        $parsing = 1;
     46                                        echo"Новый $pl[1]\n";
     47                                }
     48                                else
     49                                        echo"Неопознанный документ: $pl[1]\n";
     50                                break;
     51                        case 'КонецДокумента':
     52                                if ($parsing) {
     53                                        doc_process($params);
     54                                }
     55                                $parsing = 0;
     56                                $params = array();
     57                                break;
     58                        case 'Номер':
     59                                if ($parsing)
     60                                        $params['docnum'] = $pl[1];
     61                                break;
     62                        case 'УникальныйНомерДокумента':
     63                                if ($parsing)
     64                                        $params['unique'] = $pl[1];
     65                                break;
     66                        case 'ДатаПроведения':
     67                                if ($parsing)
     68                                        $params['date'] = $pl[1];
     69                                break;
     70                        case 'БИК':
     71                                if ($parsing)
     72                                        $params['bik'] = $pl[1];
     73                                break;
     74                        case 'Счет':
     75                                if ($parsing)
     76                                        $params['schet'] = $pl[1];
     77                                break;
     78                        case 'КорреспондентБИК':
     79                                if ($parsing)
     80                                        $params['kbik'] = $pl[1];
     81                                break;
     82                        case 'КорреспондентСчет':
     83                                if ($parsing)
     84                                        $params['kschet'] = $pl[1];
     85                                break;
     86                        case 'ДебетСумма':
     87                                if ($parsing)
     88                                        $params['debet'] = $pl[1];
     89                                break;
     90                        case 'КредитСумма':
     91                                if ($parsing)
     92                                        $params['kredit'] = $pl[1];
     93                                break;
     94                        case 'НазначениеПлатежа':
     95                                if ($parsing)
     96                                        $params['desc'] = $pl[1];
     97                                break;
     98                }
    10299        }
    103 }
    104100}
    105101
    106102global $dv;
    107103
    108 $res=mysql_query("SELECT * FROM `doc_vars` WHERE `id`='$firm_id'");
    109 $dv=mysql_fetch_assoc($res);
    110 $innkpp=split('/',$dv['firm_inn']);
     104$res = $db->query("SELECT * FROM `doc_vars` WHERE `id`='$firm_id'");
     105$dv = $res->fetch_assoc();
     106$innkpp = split('/', $dv['firm_inn']);
    111107
    112108
    113 $i=0;
    114 $dt=date("d.m.Y");
    115 $res=mysql_query("SELECT `doc_list`.`id`, `doc_list`.`altnum`, `doc_list`.`sum`, `doc_list`.`comment`,
     109$i = 0;
     110$dt = date("d.m.Y");
     111$res = $db->query("SELECT `doc_list`.`id`, `doc_list`.`altnum`, `doc_list`.`sum`, `doc_list`.`comment`,
    116112`doc_agent`.`fullname`, `doc_agent`.`inn`, `doc_agent`.`rs`, `doc_agent`.`bik`, `doc_agent`.`ks`, `doc_agent`.`bank`
    117113FROM `doc_list`
    118114LEFT JOIN `doc_agent` ON `doc_agent`.`id`=`doc_list`.`agent`
    119115WHERE `doc_list`.`type`='5' AND `doc_list`.`ok`>'0' AND `doc_list`.`nds`>'0'");
    120 echo mysql_error();
    121 while($nxt=mysql_fetch_row($res))
    122 {
    123         if(!$i)
    124         {
    125                 $i=1;
    126                 $fd=fopen("{$CONFIG['bank']['mountpoint']}/import/810pay.txt","a+");
    127                 fseek($fd,0,SEEK_END);
    128                 if(!ftell($fd))
    129                 {
    130                         $header="1CClientBankExchange\r\nВерсияФормата=1\r\nКодировка=Windows\r\n";
     116while ($nxt = $res->fetch_row()) {
     117        if (!$i) {
     118                $i = 1;
     119                $fd = fopen("{$CONFIG['bank']['mountpoint']}/import/810pay.txt", "a+");
     120                fseek($fd, 0, SEEK_END);
     121                if (!ftell($fd)) {
     122                        $header = "1CClientBankExchange\r\nВерсияФормата=1\r\nКодировка=Windows\r\n";
    131123                        fwrite($fd, to_win($header));
    132124                }
    133125        }
    134         $f_innkpp=split('/',$nxt[5]);
    135         $str="СекцияДокумент=Платежное поручение\r\nНомер=$nxt[1]\r\nДата=$dt\r\nСумма=$nxt[2]\r\n". "ВидПлатежа=Электронный\r\nВидОплаты=01\r\nОчередность=6\r\nПлательщикИНН=$innkpp[0]\r\nПлательщикКПП=$innkpp[1]\r\n". "Плательщик=".$dv['firm_name']."\r\nПлательщикСчет=".$dv['firm_schet']."\r\nПлательщикБИК=0".$dv['firm_bik']."\r\n". "ПлательщикКорсчет=".$dv['firm_bank_kor_s']."\r\nПлательщикБанк1=".$dv['firm_bank']."\r\nПолучательИНН=$f_innkpp[0]\r\n". "ПолучательКПП=$f_innkpp[1]\r\nПолучатель=$nxt[4]\r\nПолучательСчет=$nxt[6]\r\nПолучательБИК=$nxt[7]\r\n". "ПолучательКорсчет=$nxt[8]\r\nПолучательБанк1=$nxt[9]\r\nНазначениеПлатежа=$nxt[3]\r\nКонецДокумента\r\n\r\n";
     126        $f_innkpp = split('/', $nxt[5]);
     127        $str = "СекцияДокумент=Платежное поручение\r\nНомер=$nxt[1]\r\nДата=$dt\r\nСумма=$nxt[2]\r\n" . "ВидПлатежа=Электронный\r\nВидОплаты=01\r\nОчередность=6\r\nПлательщикИНН=$innkpp[0]\r\nПлательщикКПП=$innkpp[1]\r\n" . "Плательщик=" . $dv['firm_name'] . "\r\nПлательщикСчет=" . $dv['firm_schet'] . "\r\nПлательщикБИК=0" . $dv['firm_bik'] . "\r\n" . "ПлательщикКорсчет=" . $dv['firm_bank_kor_s'] . "\r\nПлательщикБанк1=" . $dv['firm_bank'] . "\r\nПолучательИНН=$f_innkpp[0]\r\n" . "ПолучательКПП=$f_innkpp[1]\r\nПолучатель=$nxt[4]\r\nПолучательСчет=$nxt[6]\r\nПолучательБИК=$nxt[7]\r\n" . "ПолучательКорсчет=$nxt[8]\r\nПолучательБанк1=$nxt[9]\r\nНазначениеПлатежа=$nxt[3]\r\nКонецДокумента\r\n\r\n";
    136128        fwrite($fd, to_win($str));
    137129        echo "$nxt[0] ($nxt[4])\n";
    138         mysql_query("UPDATE `doc_list` SET `nds`='0' WHERE `id`='$nxt[0]'");
     130        $db->query("UPDATE `doc_list` SET `nds`='0' WHERE `id`='$nxt[0]'");
    139131}
    140 if($fd) fclose($fd);
     132if ($fd)        fclose($fd);
    141133
    142 function to_win($str)
    143 {
    144         return iconv( 'UTF-8', 'windows-1251', $str);   
     134function to_win($str) {
     135        return iconv('UTF-8', 'windows-1251', $str);
    145136}
    146137
    147 
    148 function doc_process($params)
    149 {
    150         echo"result: doc: ".$params['docnum'];
     138function doc_process($params) {
     139        global $db;
     140        echo"result: doc: " . $params['docnum'];
    151141        //var_dump($params);
    152142        //echo"\n";
    153         if($params['debet']>0)
    154         {
    155                 $type=5;
    156                 $sum=$params['debet'];
    157         }
    158         else
    159         {
    160                 $type=4;
    161                 $sum=$params['kredit'];
     143        if ($params['debet'] > 0) {
     144                $type = 5;
     145                $sum = $params['debet'];
     146        } else {
     147                $type = 4;
     148                $sum = $params['kredit'];
    162149        }
    163150        echo", SUM: $sum\n";
    164         $res=mysql_query("SELECT `doc_list`.`id`, `doc_list`.`altnum`, `doc_list`.`subtype`, `doc_list`.`sum`, `doc_dopdata`.`value`
    165         FROM `doc_list`
    166         LEFT JOIN `doc_dopdata` ON `doc_dopdata`.`doc`=`doc_list`.`id` AND `doc_dopdata`.`param`='unique'
    167         WHERE `doc_list`.`altnum`='".$params['docnum']."' AND `doc_list`.`type`='$type'");
    168         $i=0;
    169         while($nxt=mysql_fetch_row($res))
    170         {
     151        $res = $db->query("SELECT `doc_list`.`id`, `doc_list`.`altnum`, `doc_list`.`subtype`, `doc_list`.`sum`, `doc_dopdata`.`value`
     152                FROM `doc_list`
     153                LEFT JOIN `doc_dopdata` ON `doc_dopdata`.`doc`=`doc_list`.`id` AND `doc_dopdata`.`param`='unique'
     154                WHERE `doc_list`.`altnum`='" . $params['docnum'] . "' AND `doc_list`.`type`='$type'");
     155        $i = 0;
     156        while ($nxt = $res->fetch_row()) {
    171157                echo"id: $nxt[0], altnum: $nxt[1], subtype: $nxt[2], sum: $nxt[3]\n";
    172                 if($nxt[4]==$params['unique']) $i++;
     158                if ($nxt[4] == $params['unique'])       $i++;
    173159        }
    174160        echo "FIND: $i\n";
    175         if(!$params['unique'])  echo"UINQUE IS NULL!\n";
    176         if(($i==0) && ($type==4))
    177         {
    178                         $res=mysql_query("SELECT `num`, `firm_id` FROM `doc_kassa` WHERE `ids`='bank' AND `rs`='{$params['schet']}'");
    179                         $b_data=mysql_fetch_row($res);
    180                         if(!$b_data[0]) $b_data[0]=1;
    181                         if(!$b_data[1]) $b_data[1]=1;
    182                        
    183                         $tm=time();
    184                         $res=mysql_query("SELECT `id`, `agent` FROM `doc_list` WHERE `type`='3' AND `sum`='$sum' ORDER BY `id` DESC");
    185                         @$p_doc=mysql_result($res,0,0);
    186                         @$agent=mysql_result($res,0,1);
    187                         if(!$agent) $agent=1;
    188                         $desc=mysql_escape_string($params['desc']);
    189                         mysql_query("INSERT INTO `doc_list` ( `type`, `agent`, `comment`, `date`, `altnum`, `subtype`, `sum`, `p_doc`, `sklad`, `bank`, `firm_id`)
    190                         VALUES ('4', '$agent', '$desc', '$tm', '".$params['docnum']."', 'auto', '$sum', '$p_doc' , '1', '$b_data[0]', '$b_data[1]')");
    191                         $new_id=mysql_insert_id();
    192                         echo "insert_id: $new_id\n".mysql_error();
    193                         mysql_query("REPLACE INTO `doc_dopdata` (`doc`,`param`,`value`)
    194                         VALUES ('$new_id','unique','".$params['unique']."')");
     161        if (!$params['unique'])
     162                echo"UINQUE IS NULL!\n";
     163        if (($i == 0) && ($type == 4)) {
     164                $res = $db->query("SELECT `num`, `firm_id` FROM `doc_kassa` WHERE `ids`='bank' AND `rs`='{$params['schet']}'");
     165                $b_data = $res->fetch_row();
     166                if (!$b_data[0])        $b_data[0] = 1;
     167                if (!$b_data[1])        $b_data[1] = 1;
     168
     169                $tm = time();
     170                $res = mysql_query("SELECT `id`, `agent` FROM `doc_list` WHERE `type`='3' AND `sum`='$sum' ORDER BY `id` DESC");
     171                if($res->num_rows)
     172                        list($p_doc, $agent) = $res->fetch_row();
     173                else {
     174                        $p_doc = 0;
     175                        $agent = 1;
     176                }
     177                $desc = $db->real_escape_string($params['desc']);
     178                $db->query("INSERT INTO `doc_list` ( `type`, `agent`, `comment`, `date`, `altnum`, `subtype`, `sum`, `p_doc`, `sklad`, `bank`, `firm_id`)
     179                        VALUES ('4', '$agent', '$desc', '$tm', '" . $params['docnum'] . "', 'auto', '$sum', '$p_doc' , '1', '$b_data[0]', '$b_data[1]')");
     180                $new_id = $db->insert_id;
     181                echo "insert_id: $new_id\n";
     182                $db->query("REPLACE INTO `doc_dopdata` (`doc`,`param`,`value`) VALUES ('$new_id','unique','" . $params['unique'] . "')");
    195183        }
    196        
     184
    197185        echo"\n";
    198186}
    199187
    200 
    201 
    202188?>
  • cli/core.cli.inc.php

    r03d943c rb490b46  
    2222class MysqlException extends Exception
    2323{
    24         function __construct($text)
    25         {
    26                 parent::__construct($text.':'.mysql_error());
    27         }
     24
    2825};
     26
     27$db = @ new MysqiExtended($CONFIG['mysql']['host'], $CONFIG['mysql']['login'], $CONFIG['mysql']['pass'], $CONFIG['mysql']['db']);
     28
     29if($db->connect_error)
     30        die("Ошибка соединения с базой данных");
     31
     32// Включаем автоматическую генерацию исключений для mysql
     33mysqli_report(MYSQLI_REPORT_STRICT | MYSQLI_REPORT_ERROR);
     34
     35if(!$db->set_charset("utf8"))
     36    die("Невозможно задать кодировку соединения с базой данных: ".$db->error);
     37
    2938
    3039
  • cli/daily.php

    r03d943c rb490b46  
    11#!/usr/bin/php
    22<?php
     3//      MultiMag v0.1 - Complex sales system
     4//
     5//      Copyright (C) 2005-2013, BlackLight, TND Team, http://tndproject.org
     6//
     7//      This program is free software: you can redistribute it and/or modify
     8//      it under the terms of the GNU Affero General Public License as
     9//      published by the Free Software Foundation, either version 3 of the
     10//      License, or (at your option) any later version.
     11//
     12//      This program is distributed in the hope that it will be useful,
     13//      but WITHOUT ANY WARRANTY; without even the implied warranty of
     14//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15//      GNU Affero General Public License for more details.
     16//
     17//      You should have received a copy of the GNU Affero General Public License
     18//      along with this program.  If not, see <http://www.gnu.org/licenses/>.
     19//
    320
    421// Ежедневный запуск в 0:01
     
    825require_once($CONFIG['cli']['location']."/core.cli.inc.php");
    926
    10 try
    11 {
     27try {
    1228
    13 // Очистка от неподтверждённых пользователей
    14 if($CONFIG['auto']['user_del_days']>0)
    15 {
    16         $tim=time();
    17         $dtim=time()-60*60*24*$CONFIG['auto']['user_del_days'];
    18         $dtim=date('Y-m-d H:i:s',$dtim);
    19         $res=mysql_query("SELECT `id` FROM `users`
    20         LEFT JOIN `users_openid` ON `users_openid`.`user_id`=`users`.`id`
    21         WHERE `users_openid`.`user_id` IS NULL AND `users`.`reg_date`<'$dtim' AND `users`.`reg_email_confirm`!='1' AND `reg_phone_confirm`!='1'");
    22         if(mysql_errno())       throw new MysqlException("Не удалось получить пользователей для удаления");
    23         while($nxt=mysql_fetch_row($res))
    24         {
    25                 mysql_query("DELETE FROM `users` WHERE `id`='$nxt[0]'");
    26                 // Обработка ошибок не требуется, т.к. пользователи, по которым есть информация, не могут быть удалены.
     29        // Очистка от неподтверждённых пользователей
     30        if ($CONFIG['auto']['user_del_days'] > 0) {
     31                $tim = time();
     32                $dtim = time() - 60 * 60 * 24 * $CONFIG['auto']['user_del_days'];
     33                $dtim = date('Y-m-d H:i:s', $dtim);
     34                $res = $db->query("SELECT `id` FROM `users`
     35                        LEFT JOIN `users_openid` ON `users_openid`.`user_id`=`users`.`id`
     36                        WHERE `users_openid`.`user_id` IS NULL AND `users`.`reg_date`<'$dtim' AND `users`.`reg_email_confirm`!='1' AND `reg_phone_confirm`!='1'");
     37                while ($nxt = $res->fetch_row())
     38                        mysql_query("DELETE FROM `users` WHERE `id`='$nxt[0]'");
    2739        }
    28 }
    2940
    3041// Перемещение непроведённых реализаций на начало текущего дня
    31 if($CONFIG['auto']['move_nr_to_end']==true)
    32 {
    33         $end_day=strtotime(date("Y-m-d 00:00:01"));
    34         mysql_query("UPDATE `doc_list` SET `date`='$end_day' WHERE `type`='2' AND `ok`='0'");
    35         if(mysql_errno())       throw new MysqlException("Не удалось переместить реализации");
    36 }
     42        if ($CONFIG['auto']['move_nr_to_end'] == true) {
     43                $end_day = strtotime(date("Y-m-d 00:00:01"));
     44                $db->query("UPDATE `doc_list` SET `date`='$end_day' WHERE `type`='2' AND `ok`='0'");
     45        }
    3746
    3847// Перемещение непроведённых заявок на начало текущего дня
    39 if($CONFIG['auto']['move_no_to_end']==true)
    40 {
    41         $end_day=strtotime(date("Y-m-d 00:00:01"));
    42         mysql_query("UPDATE `doc_list` SET `date`='$end_day' WHERE `type`='3' AND `ok`='0'");
    43         if(mysql_errno())       throw new MysqlException("Не удалось переместить заявки");
    44 }
     48        if ($CONFIG['auto']['move_no_to_end'] == true) {
     49                $end_day = strtotime(date("Y-m-d 00:00:01"));
     50                $db->query("UPDATE `doc_list` SET `date`='$end_day' WHERE `type`='3' AND `ok`='0'");
     51        }
    4552
    4653// Очистка счётчика посещений от старых данных
    47 $tt=time()-60*60*24*10;
    48 mysql_query("DELETE FROM `counter` WHERE `date` < '$tt'");
    49 if(mysql_errno())       throw new MysqlException("Не удалось очистить счётчик");
     54        $tt = time() - 60 * 60 * 24 * 10;
     55        $db->query("DELETE FROM `counter` WHERE `date` < '$tt'");
    5056
    5157// Загрузка курсов валют
    52 $data=file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp");
    53 $doc = new DOMDocument('1.0');
    54 $doc->loadXML($data);
    55 $doc->normalizeDocument ();
    56 $valutes=$doc->getElementsByTagName('Valute');
    57 foreach($valutes as $valute)
    58 {
    59         $name=$value=0;
    60         foreach($valute->childNodes as $val)
    61         {
    62                 switch($val->nodeName)
    63                 {
    64                         case 'CharCode':
    65                                 $name=$val->nodeValue;
    66                                 break;
    67                         case 'Value':
    68                                 $value=$val->nodeValue;
    69                                 break;
     58        $data = file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp");
     59        $doc = new DOMDocument('1.0');
     60        $doc->loadXML($data);
     61        $doc->normalizeDocument();
     62        $valutes = $doc->getElementsByTagName('Valute');
     63        foreach ($valutes as $valute) {
     64                $name = $value = 0;
     65                foreach ($valute->childNodes as $val) {
     66                        switch ($val->nodeName) {
     67                                case 'CharCode':
     68                                        $name = $val->nodeValue;
     69                                        break;
     70                                case 'Value':
     71                                        $value = $val->nodeValue;
     72                                        break;
     73                        }
    7074                }
     75                $value = round(str_replace(',', '.', $value), 4);
     76                $db->query("UPDATE `currency` SET `coeff`='$value' WHERE `name`='$name'");
    7177        }
    72         $value=round(str_replace(',','.',$value),4);
    73         mysql_query("UPDATE `currency` SET `coeff`='$value' WHERE `name`='$name'");
    74         if(mysql_errno())       throw new MysqlException("Не удалось обновить курсы валют");
    75 }
    76 
    77 }
    78 catch(Exception $e)
    79 {
     78} catch (Exception $e) {
    8079        mailto($CONFIG['site']['doc_adm_email'], "Error in daily.php", $e->getMessage());
    81         echo $e->getMessage()."\n";
     80        echo $e->getMessage() . "\n";
    8281}
    8382
  • cli/db_optimize.php

    r03d943c rb490b46  
    33//      MultiMag v0.1 - Complex sales system
    44//
    5 //      Copyright (C) 2005-2012, BlackLight, TND Team, http://tndproject.org
     5//      Copyright (C) 2005-2013, BlackLight, TND Team, http://tndproject.org
    66//
    77//      This program is free software: you can redistribute it and/or modify
     
    2525require_once($CONFIG['cli']['location']."/core.cli.inc.php");
    2626require_once($CONFIG['location']."/common/async/dbcheck.php");
    27 try
    28 {
    29         $worker=new DbCheckWorker(0);
     27try {
     28        $worker = new DbCheckWorker(0);
    3029        $worker->run();
    31 }
    32 catch(Exception $e)
    33 {
    34         if($worker)
    35         {
    36                 try
    37                 {
     30} catch (Exception $e) {
     31        if ($worker) {
     32                try {
    3833                        $worker->finalize();
    39                 }
    40                 catch(Exception $e)
    41                 {
    42                         echo $e->getMessage()."\n";
     34                } catch (Exception $e) {
     35                        echo $e->getMessage() . "\n";
    4336                }
    4437        }
    4538
    46         echo $e->getMessage()."\n";
    47         try
    48         {
    49                 $mail_text="При автоматической проверке базы данных сайта найдены следующие проблемы:\n****\n\n".$e->getMessage()."\n\n****\nНеобходимо исправить найденные ошибки!";
     39        echo $e->getMessage() . "\n";
     40        try {
     41                $mail_text = "При автоматической проверке базы данных сайта найдены следующие проблемы:\n****\n\n" . $e->getMessage() . "\n\n****\nНеобходимо исправить найденные ошибки!";
    5042
    5143                mailto($CONFIG['site']['doc_adm_email'], "DB check report", $mail_text);
    5244                echo "Почта отправлена!";
    53                 mysql_query("UPDATE `variables` SET `corrupted`='1'");
    54         }
    55         catch(Exception $e)
    56         {
    57                 echo"Ошибка отправки почты!".$e->getMessage();
     45                $db->query("UPDATE `variables` SET `corrupted`='1'");
     46        } catch (Exception $e) {
     47                echo"Ошибка отправки почты!" . $e->getMessage();
    5848        }
    5949}
    6050
    61 
    62 
    63 
    64 
    65 
    6651?>
  • cli/db_update.php

    r03d943c rb490b46  
    33//      MultiMag v0.1 - Complex sales system
    44//
    5 //      Copyright (C) 2005-2012, BlackLight, TND Team, http://tndproject.org
     5//      Copyright (C) 2005-2013, BlackLight, TND Team, http://tndproject.org
    66//
    77//      This program is free software: you can redistribute it and/or modify
     
    2828include_once($CONFIG['cli']['location']."/backup.php");
    2929
    30 function applyPatch($patch)
    31 {
    32         $file=file_get_contents($patch);
    33         if(!$file)      throw new Exception("Не удаётся открыть файл патча!");
    34         $queries=explode(";",$file);
    35         mysql_query("START TRANSACTION");
    36         foreach($queries as $query)
    37         {
    38                 if(strlen(trim($query))==0) continue;
    39                 mysql_query($query);
    40                 if(mysql_errno())       throw new MysqlException("Не удалось исполнить запрос $query");
    41         }       
    42         mysql_query("COMMIT");
     30function applyPatch($patch) {
     31        $file = file_get_contents($patch);
     32        if (!$file)
     33                throw new Exception("Не удаётся открыть файл патча!");
     34        $queries = explode(";", $file);
     35        $db->query("START TRANSACTION");
     36        foreach ($queries as $query) {
     37                if (strlen(trim($query)) == 0)
     38                        continue;
     39                $db->query($query);
     40        }
     41        $db->query("COMMIT");
    4342}
    4443
    45 
    46 try
    47 {
    48 $patches=scandir($CONFIG['location']."/db_patches/");
    49 if(!is_array($patches)) throw new Exception("Не удалось получить список файлов патчей!");
    50 for($i=0;$i<1000;$i++)
    51 {
    52         $res=mysql_query("SELECT `version` FROM `db_version`");
    53         if(mysql_errno())       throw new MysqlException("Не удалось получить версию базы данных! Вероятно, ваша база слишком стара, и не поддерживает автоматическое обновление. Обновите вручную.");
    54         else
    55         {
    56                 $db_version=@mysql_result($res,0,0);
    57                 if($db_version!=MULTIMAG_REV)
    58                 {
    59                         foreach($patches as $patch)
    60                         {
    61                                 if(strpos($patch,'~')!==false)  continue;
    62                                 if(strpos($patch,$db_version)===0)
    63                                 {
     44try {
     45        $patches = scandir($CONFIG['location'] . "/db_patches/");
     46        if (!is_array($patches))
     47                throw new Exception("Не удалось получить список файлов патчей!");
     48        for ($i = 0; $i < 1000; $i++) {
     49                $res = $db->query("SELECT `version` FROM `db_version`");
     50                if($res->num_rows)
     51                        list($db_version) = $res->fetch_row();
     52                else    $db_version = 0;
     53                if ($db_version != MULTIMAG_REV) {
     54                        foreach ($patches as $patch) {
     55                                if (strpos($patch, '~') !== false)
     56                                        continue;
     57                                if (strpos($patch, $db_version) === 0) {
    6458                                        echo "Накладываем патч $patch\n";
    65                                         applyPatch($CONFIG['location']."/db_patches/$patch");
     59                                        applyPatch($CONFIG['location'] . "/db_patches/$patch");
    6660                                        break;
    6761                                }
    6862                        }
    6963                }
    70                 else break;
     64                else    break;
     65               
    7166        }
    72 }
    73 
    74 }
    75 catch(Exception $e)
    76 {
    77         echo "\n\n==============================================\nОШИБКА ОБНОВЛЕНИЯ БАЗЫ: ".$e->getMessage()."\n==============================================\n\n";
     67} catch (Exception $e) {
     68        echo "\n\n==============================================\nОШИБКА ОБНОВЛЕНИЯ БАЗЫ: " . $e->getMessage() . "\n==============================================\n\n";
    7869}
    7970
  • cli/dolg_info.php

    r03d943c rb490b46  
    2323include_once("$base_path/config_cli.php");
    2424
    25 require_once($CONFIG['site']['location']."/core.php"); 
    26 require_once($CONFIG['site']['location']."/include/doc.core.php"); 
     25require_once($CONFIG['site']['location']."/core.php");
     26require_once($CONFIG['site']['location']."/include/doc.core.php");
    2727
    28 $mail_text=array();
    29 $sum_dolga=array();
     28$mail_text = array();
     29$sum_dolga = array();
    3030
    31 $res=mysql_query("SELECT `id`, `name`, `responsible` FROM `doc_agent` ORDER BY `name`");
    32 while($nxt=mysql_fetch_row($res))
    33 {
    34         $dolg=DocCalcDolg($nxt[0],0);
    35         if( $dolg>0 )
    36         {
    37                 $dolg=abs($dolg);
     31$res = $db->query("SELECT `id`, `name`, `responsible` FROM `doc_agent` ORDER BY `name`");
     32while ($nxt = $res->fetch_row()) {
     33        $dolg = agentCalcDebt($nxt[0], 0);
     34        if ($dolg > 0) {
     35                $dolg = abs($dolg);
    3836                $sum_dolga[$nxt[2]]+=$dolg;
    39                 $dolg=sprintf("%0.2f",$dolg);
    40                 $a_name=html_entity_decode ($nxt[1],ENT_QUOTES,"UTF-8");
     37                $dolg = sprintf("%0.2f", $dolg);
     38                $a_name = html_entity_decode($nxt[1], ENT_QUOTES, "UTF-8");
    4139                $mail_text[$nxt[2]].="Агент $a_name (id:$nxt[0]) должен нам $dolg рублей\n";
    4240        }
    4341}
    4442
    45 try
    46 {
    47         $xmppclient->connect();
    48         $xmppclient->processUntil('session_start');
    49         $xmppclient->presence();
     43try {
     44        require_once($CONFIG['location'] . '/common/XMPPHP/XMPP.php');
     45        $xmppclient = new XMPPHP_XMPP($CONFIG['xmpp']['host'], $CONFIG['xmpp']['port'], $CONFIG['xmpp']['login'], $CONFIG['xmpp']['pass'], 'xmpphp', '');
     46        $xmpp_connected = 0;
    5047
    51         $res=mysql_query("SELECT `id`, `name`, `reg_email`, `jid` FROM `users`");
    52         while($nxt=mysql_fetch_row($res))
    53         {
    54                 if($mail_text[$nxt[0]])
    55                 {
    56                         $dolg=sprintf("%0.2f",$sum_dolga[$nxt[0]]);
    57                         $text="Уважаемый(ая) $nxt[1]!\nНекоторые из Ваших клиентов, для которых Вы являетесь ответственным менеджером, имеют непогашенные долги перед нашей компанией на общую сумму {$dolg} рублей.\nНеобходимо в кратчайший срок решить данную проблему!\n\nВот список этих клиентов:\n".$mail_text[$nxt[0]]."\n\nПожалуйста, не откладывайте решение проблемы на длительный срок!";
    58                        
     48        $res = $db->query("SELECT `id`, `name`, `reg_email`, `jid` FROM `users`");
     49        while ($nxt = $res->fetch_row()) {
     50                if ($mail_text[$nxt[0]]) {
     51                        $dolg = sprintf("%0.2f", $sum_dolga[$nxt[0]]);
     52                        $text = "Уважаемый(ая) $nxt[1]!\nНекоторые из Ваших клиентов, для которых Вы являетесь ответственным менеджером, имеют непогашенные долги перед нашей компанией на общую сумму {$dolg} рублей.\nНеобходимо в кратчайший срок решить данную проблему!\n\nВот список этих клиентов:\n" . $mail_text[$nxt[0]] . "\n\nПожалуйста, не откладывайте решение проблемы на длительный срок!";
     53
    5954                        mailto($nxt[2], "Ваши долги", $text);
    60                         if($nxt[3])
    61                         {
     55                        if ($nxt[3]) {
     56                                if ($xmpp_connected) {
     57                                        $xmppclient->connect();
     58                                        $xmppclient->processUntil('session_start');
     59                                        $xmppclient->presence();
     60                                        $xmpp_connected = 1;
     61                                }
    6262                                $xmppclient->message($nxt[3], $text);
    6363                                echo "\nСообщение было отправлено через XMPP!";
    6464                        }
    65                         echo $text."\n\n\n\n";
    66 
     65                        echo $text . "\n\n\n\n";
    6766                }
    6867        }
    6968        $xmppclient->disconnect();
    7069        echo "\nСообщение было отправлено через XMPP!";
    71 }
    72 catch(XMPPHP_Exception $e)
    73 {
     70} catch (XMPPHP_Exception $e) {
    7471        echo"\nНевозможно отправить сообщение XMPP";
    75 }
    76 catch(Exception $e)
    77 {
    78         echo"Ошибка отправки почты!".$e->getMessage();
     72} catch (Exception $e) {
     73        echo"Ошибка отправки почты!" . $e->getMessage();
    7974}
    8075
  • cli/iptinit.php

    r03d943c rb490b46  
    11#!/usr/bin/php
    22<?php
     3//      MultiMag v0.1 - Complex sales system
     4//
     5//      Copyright (C) 2005-2013, BlackLight, TND Team, http://tndproject.org
     6//
     7//      This program is free software: you can redistribute it and/or modify
     8//      it under the terms of the GNU Affero General Public License as
     9//      published by the Free Software Foundation, either version 3 of the
     10//      License, or (at your option) any later version.
     11//
     12//      This program is distributed in the hope that it will be useful,
     13//      but WITHOUT ANY WARRANTY; without even the implied warranty of
     14//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15//      GNU Affero General Public License for more details.
     16//
     17//      You should have received a copy of the GNU Affero General Public License
     18//      along with this program.  If not, see <http://www.gnu.org/licenses/>.
     19//
     20
    321$c=explode('/',__FILE__);$base_path='';
    422for($i=0;$i<(count($c)-2);$i++) $base_path.=$c[$i].'/';
    523include_once("$base_path/config_cli.php");
    624
    7 if(!$CONFIG['route']['ext_ip'])
    8 {
     25if(!$CONFIG['route']['ext_ip']){
    926    echo "External ip address NOT configured!\n";
    1027    exit(0);
     
    132149if( ($date_time_array['hours']>=$CONFIG['route']['iplimit']['hstart']) && ($date_time_array['hours']<$CONFIG['route']['iplimit']['hend']) )
    133150{
    134         $res=mysql_query("SELECT * FROM `traffic_denyip`");
    135         while($nxt=mysql_fetch_row($res))
    136         {
     151        $res = $db->query("SELECT * FROM `traffic_denyip`");
     152        while($nxt = $res->fetch_row()) {
    137153                if($CONFIG['route']['iplimit']['toport'])
    138154                        `$ipt -t nat -A PREROUTING -d $nxt[1] -p tcp -m multiport --dport 80 -j REDIRECT --to-port {$CONFIG['route']['iplimit']['toport']}`;
     
    145161
    146162// Прозрачный прокси
    147 if($CONFIG['route']['transparent_proxy'])
    148 {
     163if($CONFIG['route']['transparent_proxy']) {
    149164    echo "Transparent proxy start\n";
    150165    `$ipt -t nat -A PREROUTING -d ! {$CONFIG['route']['ext_ip']} -p tcp -m multiport --dport 80 -j REDIRECT --to-port 3128`;
  • cli/price_an.php

    r03d943c rb490b46  
    1919//
    2020
    21 $c=explode('/',__FILE__);$base_path='';
    22 for($i=0;$i<(count($c)-2);$i++) $base_path.=$c[$i].'/';
     21$c = explode('/', __FILE__);
     22$base_path = '';
     23for ($i = 0; $i < (count($c) - 2); $i++)
     24        $base_path.=$c[$i] . '/';
    2325include_once("$base_path/config_cli.php");
    2426
    25 require_once($CONFIG['cli']['location']."/core.cli.inc.php");
    26 
    27 set_time_limit(60*120); // Выполнять не более 120 минут
    28 $start_time=microtime(TRUE);
    29 
    30 if(!$CONFIG['price']['dir'])
    31 {
    32         //echo"Директория с прайсами не определена, завершаем работу...\n";
     27require_once($CONFIG['cli']['location'] . "/core.cli.inc.php");
     28
     29set_time_limit(60 * 120); // Выполнять не более 120 минут
     30$start_time = microtime(TRUE);
     31
     32if (!$CONFIG['price']['dir']) {
    3333        exit(0);
    3434}
    35 $mail_text='';
    36 
    37 $c=explode('/',__FILE__);
    38 mysql_query("INSERT INTO `sys_cli_status` (`script`, `status`) VALUES ('".$c[count($c)-1]."', 'Start')");
    39 $status_id=mysql_insert_id();
    40 
    41 function SetStatus($status)
    42 {
     35$mail_text = '';
     36
     37$db->query("INSERT INTO `sys_cli_status` (`script`, `status`) VALUES ('" . $c[count($c) - 1] . "', 'Start')");
     38$status_id = $db->insert_id;
     39
     40function SetStatus($status, $db) {
    4341        global $status_id;
    44         mysql_query("UPDATE `sys_cli_status` SET `status`='$status' WHERE `id`='$status_id'");
     42        $db->query("UPDATE `sys_cli_status` SET `status`='$status' WHERE `id`='$status_id'");
    4543}
    4644
    4745/// Фиктивный класс для анализатора прайсов. Надо переделать архитектуру так, чтобы он не требовался
    48 class Foo
    49 {
    50     function AddText($t) {return;}
    51     function msg($t) {return;}
    52 };
    53 
    54 $tmpl=new Foo();
    55 
    56 function log_write($dir, $msg)
    57 {
    58         $f_log=fopen($dir.'/load.log','a');
    59         fprintf($f_log, date("Y.m.d H:i:s ").$msg."\n");
     46class Foo {
     47
     48        function addContent($t) {
     49                return;
     50        }
     51
     52        function msg($t) {
     53                return;
     54        }
     55
     56}
     57
     58;
     59
     60$tmpl = new Foo();
     61
     62function log_write($dir, $msg) {
     63        $f_log = fopen($dir . '/load.log', 'a');
     64        fprintf($f_log, date("Y.m.d H:i:s ") . $msg . "\n");
    6065        fclose($f_log);
    61         echo $msg."\n";
    62 }
    63 
    64 function forked_match_process($nproc, $limit, $res)
    65 {
     66        echo $msg . "\n";
     67}
     68
     69function forked_match_process($nproc, $limit, $res, $db) {
    6670        global $a_start_time, $CONFIG;
    67         $old_p=$i=0;
    68         while($nxt=mysql_fetch_row($res))
    69         {
     71        $old_p = $i = 0;
     72        while ($nxt = $res->fetch_row()) {
    7073                $i++;
    7174                //$speed=(microtime(TRUE)-$a_start_time)/$i;
    7275                //echo"Proc: $nproc, Step $i, pos $nxt[3], $speed sec / pos...\n";
    7376
    74                 if(!$nproc)
    75                 {
    76                         $p=floor($i/$limit*100);
    77                         if($old_p!=$p)
    78                         {
    79                                 $old_p=$p;
     77                if (!$nproc) {
     78                        $p = floor($i / $limit * 100);
     79                        if ($old_p != $p) {
     80                                $old_p = $p;
    8081                                //$p/=10;
    81                                 SetStatus("Analyze: $p pp");
    82                         }
    83                 }
    84                 $res1=mysql_query("SELECT `id`, `search_str`, `replace_str` FROM `prices_replaces`");
    85                 if(mysql_errno())               throw new Exception("Не удалось выбрать замены: ".mysql_error());
    86                 while($nxt1=mysql_fetch_row($res1))
    87                 {
    88                         $nxt[2]=str_replace("{{{$nxt1[1]}}}", $nxt1[2], $nxt[2]);
    89                         $nxt[5]=str_replace("{{{$nxt1[1]}}}", $nxt1[2], $nxt[5]);
    90                 }
    91 
    92                 $a=preg_match("/$nxt[2]/", ' ');
    93                 $b=preg_match("/$nxt[5]/", ' ');
    94                 if($a===FALSE || $b===FALSE)
    95                 {
     82                                SetStatus("Analyze: $p pp", $db);
     83                        }
     84                }
     85                $res1 = $db->query("SELECT `id`, `search_str`, `replace_str` FROM `prices_replaces`");
     86                while ($nxt1 = $res1->fetch_row()) {
     87                        $nxt[2] = str_replace("{{{$nxt1[1]}}}", $nxt1[2], $nxt[2]);
     88                        $nxt[5] = str_replace("{{{$nxt1[1]}}}", $nxt1[2], $nxt[5]);
     89                }
     90
     91                $a = preg_match("/$nxt[2]/", ' ');
     92                $b = preg_match("/$nxt[5]/", ' ');
     93                if ($a === FALSE || $b === FALSE) {
    9694                        $mail_text.="Анализ прайсов: регулярное выражение позиции id:$nxt[3] (для $nxt[0]) составлено с ошибкой! Это значительно снижает быстродействие, и может вызвать сбой!\n";
    9795                        continue;
    9896                }
    9997
    100                 $str_array=preg_split("/( OR | AND )/",$nxt[1],-1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    101                 $sql_add='';
    102                 $conn='';
    103                 $c=1;
    104                 foreach($str_array as $str_l)
    105                 {
    106                         if($c)  $sql_add.=" $conn (`price`.`name` LIKE '%$str_l%' OR `price`.`art` LIKE '%$str_l%')";
    107                         else    $conn=$str_l;
    108                         $c=1-$c;
    109                 }
    110 
    111                 $costar=array();
    112                 $rs=mysql_query("SELECT `price`.`id`, `price`.`name`, `price`.`cost`, `price`.`firm`, `price`.`nal`, `firm_info`.`coeff`, `currency`.`coeff`, `price`.`art`, `price`.`currency`
     98                $str_array = preg_split("/( OR | AND )/", $nxt[1], -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
     99                $sql_add = '';
     100                $conn = '';
     101                $c = 1;
     102                foreach ($str_array as $str_l) {
     103                        if ($c) {
     104                                $str_l_sql = $db->real_escape_string($str_l);
     105                                $sql_add.=" $conn (`price`.`name` LIKE '%$str_l_sql%' OR `price`.`art` LIKE '%$str_l_sql%')";
     106                        }
     107                        else    $conn = $str_l;
     108                        $c = 1 - $c;
     109                }
     110
     111                $costar = array();
     112                $rs = $db->query("SELECT `price`.`id`, `price`.`name`, `price`.`cost`, `price`.`firm`, `price`.`nal`, `firm_info`.`coeff`, `currency`.`coeff`, `price`.`art`, `price`.`currency`
    113113                FROM `price`
    114114                INNER JOIN `firm_info` ON `firm_info`.`id`=`price`.`firm`
    115115                LEFT JOIN `currency` ON `currency`.`id`=`price`.`currency`
    116116                WHERE $sql_add");
    117                 if(mysql_errno())               throw new Exception("Не удалось выбрать прайс-лист из базы данных: ".mysql_error());
    118                 while($nx=mysql_fetch_row($rs))
    119                 {
    120                         $a=preg_match("/$nxt[2]/",$nx[1]);
    121                         $b=preg_match("/$nxt[2]/",$nx[7]);
    122 
    123                         if( $a || $b )
    124                         {
    125                                 if($nxt[5])
    126                                 {
    127                                         $a=preg_match("/$nxt[5]/",$nx[1]);
    128                                         $b=preg_match("/$nxt[5]/",$nx[7]);
    129                                         if( $a || $b )  continue;
     117                while ($nx = $rs->fetch_row()) {
     118                        $a = preg_match("/$nxt[2]/", $nx[1]);
     119                        $b = preg_match("/$nxt[2]/", $nx[7]);
     120
     121                        if ($a || $b) {
     122                                if ($nxt[5]) {
     123                                        $a = preg_match("/$nxt[5]/", $nx[1]);
     124                                        $b = preg_match("/$nxt[5]/", $nx[7]);
     125                                        if ($a || $b)
     126                                                continue;
    130127                                }
    131128
    132                                 if($nx[5]==0) $nx[5]=1;
    133                                 if($nx[6]==0) $nx[6]=1;
    134                                 $cost=$nx[2]*$nx[5]*$nx[6];
    135                                 mysql_query("INSERT INTO `parsed_price_tmp` (`firm`, `pos`, `cost`, `nal`, `from`)
     129                                if ($nx[5] == 0)
     130                                        $nx[5] = 1;
     131                                if ($nx[6] == 0)
     132                                        $nx[6] = 1;
     133                                $cost = $nx[2] * $nx[5] * $nx[6];
     134                                $db->query("INSERT INTO `parsed_price_tmp` (`firm`, `pos`, `cost`, `nal`, `from`)
    136135                                VALUES ('$nx[3]', '$nxt[3]', '$cost', '$nx[4]', '$nx[0]' )");
    137                                 if(mysql_errno())       throw new Exception("Не удалось сохранить строку совпадения: ".mysql_error());
    138 
    139                                 if($CONFIG['price']['mark_matched'])
    140                                 {
    141                                         if($CONFIG['price']['mark_doubles'])
    142                                                 mysql_query("INSERT INTO `price_seeked` VALUES ($nx[0], 1) ON DUPLICATE KEY UPDATE `seeked`=`seeked`+1");
    143                                         else    mysql_query("INSERT IGNORE INTO `price_seeked` VALUES ($nx[0], 1)");
    144                                         if(mysql_errno())       throw new Exception("Не удалось изменить счётчик совпадений: ".mysql_error());
    145                                 }
    146                         }
    147                 }
    148                 if($i>$limit)   break;
    149         }
    150 }
    151 
    152 
    153 function mysql_reconnect()
    154 {
     136
     137                                if ($CONFIG['price']['mark_matched']) {
     138                                        if ($CONFIG['price']['mark_doubles'])
     139                                                $db->query("INSERT INTO `price_seeked` VALUES ($nx[0], 1) ON DUPLICATE KEY UPDATE `seeked`=`seeked`+1");
     140                                        else
     141                                                $db->query("INSERT IGNORE INTO `price_seeked` VALUES ($nx[0], 1)");
     142                                }
     143                        }
     144                }
     145                if ($i > $limit) break;
     146        }
     147}
     148
     149function mysql_reconnect() {
    155150        global $CONFIG;
    156         @mysql_close();
    157         if(!@mysql_connect($CONFIG['mysql']['host'],$CONFIG['mysql']['login'],$CONFIG['mysql']['pass']))
    158                 throw new Exception("Нет связи с сервером баз данных: ".mysql_error());
    159         if(!@mysql_select_db($CONFIG['mysql']['db']))
    160                 throw new Exception("Невозможно активизировать базу данных: ".mysql_error());
    161         mysql_query("SET CHARACTER SET UTF8");
    162         mysql_query("SET character_set_client = UTF8");
    163         mysql_query("SET character_set_results = UTF8");
    164         mysql_query("SET character_set_connection = UTF8");
    165 }
    166 
    167 function parallel_match()
    168 {
    169         global $a_start_time, $CONFIG;
    170         $res=mysql_query("SELECT `doc_base`.`name`, `seekdata`.`sql`, `seekdata`.`regex`, `seekdata`.`id`, `doc_group`.`name`, `seekdata`.`regex_neg`
     151        $db = @ new MysqiExtended($CONFIG['mysql']['host'], $CONFIG['mysql']['login'], $CONFIG['mysql']['pass'], $CONFIG['mysql']['db']);
     152
     153        if($db->connect_error)
     154                die("Ошибка соединения с базой данных");
     155
     156        // Включаем автоматическую генерацию исключений для mysql
     157        mysqli_report(MYSQLI_REPORT_STRICT | MYSQLI_REPORT_ERROR);
     158
     159        if(!$db->set_charset("utf8"))
     160            die("Невозможно задать кодировку соединения с базой данных: ".$db->error);
     161        return $db;
     162}
     163
     164function parallel_match() {
     165        global $a_start_time, $CONFIG, $db;
     166        $res = $db->query("SELECT `doc_base`.`name`, `seekdata`.`sql`, `seekdata`.`regex`, `seekdata`.`id`, `doc_group`.`name`, `seekdata`.`regex_neg`
    171167        FROM `seekdata`
    172168        LEFT JOIN `doc_group` ON `doc_group`.`id`=`seekdata`.`group`
    173169        LEFT JOIN `doc_base` ON `doc_base`.`id`=`seekdata`.`id`");
    174         if(mysql_errno())               throw new Exception("Не удалось выбрать наименования: ".mysql_error());
    175         $row=mysql_num_rows($res);
    176         SetStatus("Analyze: 0 pp");
    177         $a_start_time=microtime(TRUE);
    178         mysql_close();
     170        $row = $res->num_rows;
     171        SetStatus("Analyze: 0 pp", $db);
     172        $a_start_time = microtime(TRUE);
     173        $db->close();
    179174
    180175        // Подготовка к распараллеливанию
    181         $numproc=$CONFIG['price']['numproc'];           // Включая родительский
    182         if($numproc<1)          $numproc=1;
    183         if($numproc>128)        $numproc=128;
    184         $pids_array=array();
    185         $limit_per_child=floor($row/$numproc);
    186 
    187         for($i=0;$i<($numproc-1);$i++)
    188         {
     176        $numproc = $CONFIG['price']['numproc'];  // Включая родительский
     177        if ($numproc < 1)
     178                $numproc = 1;
     179        if ($numproc > 128)
     180                $numproc = 128;
     181        $pids_array = array();
     182        $limit_per_child = floor($row / $numproc);
     183
     184        for ($i = 0; $i < ($numproc - 1); $i++) {
    189185                $pid = pcntl_fork();
    190                 if ($pid == -1)         throw new Exception("Параллельная обработка невозможна");
    191                 $pids_array[]=$pid;
    192                 if(!$pid)
    193                 {
    194                         mysql_data_seek($res , $limit_per_child*$i );
    195                         if(mysql_errno())               throw new Exception("Не удалось сместить указатель $pid: ".mysql_error());
    196                         mysql_reconnect();
    197                         forked_match_process($i+1, $limit_per_child, $res);
     186                if ($pid == -1)
     187                        throw new Exception("Параллельная обработка невозможна");
     188                $pids_array[] = $pid;
     189                if (!$pid) {
     190                        $res->data_seek($limit_per_child * $i);
     191                        $db = mysql_reconnect();
     192                        forked_match_process($i + 1, $limit_per_child, $res, $db);
    198193                        echo"Proc N$i end...\n";
    199194                        exit(0);
    200195                }
    201196        }
    202         mysql_data_seek($res , $limit_per_child*$i );
    203         if(mysql_errno())               throw new Exception("Не удалось сместить указатель $pid: ".mysql_error());
    204         mysql_reconnect();
    205         forked_match_process(0, $row-$limit_per_child*$i, $res);
    206 
    207         foreach($pids_array as $pid)    pcntl_waitpid($pid, $status);
     197        $res->data_seek($limit_per_child * $i);
     198        $db = mysql_reconnect();
     199        forked_match_process(0, $row - $limit_per_child * $i, $res, $db);
     200
     201        foreach ($pids_array as $pid)
     202                pcntl_waitpid($pid, $status);
    208203
    209204        echo"Параллельная обработка завершена!";
    210205}
    211206
    212 
    213 try
    214 {
    215         if(!file_exists($CONFIG['price']['dir']))       throw new Exception("Каталог с прайсами ({$CONFIG['price']['dir']}) не существует");
    216         if(!is_dir($CONFIG['price']['dir']))            throw new Exception("Каталог с прайсами ({$CONFIG['price']['dir']}) не является каталогом");
    217         $dh  = opendir($CONFIG['price']['dir']);
    218         if(!$dh)                                        throw new Exception("Не удалось открыть каталог с прайсами ({$CONFIG['price']['dir']})");
    219         SetStatus('Loading prices');
    220         require_once($CONFIG['location']."/common/priceloader.xls.php");
    221         require_once($CONFIG['location']."/common/priceloader.ods.php");
    222 
    223         while (false !== ($filename = readdir($dh)))
    224         {
     207try {
     208        if (!file_exists($CONFIG['price']['dir']))
     209                throw new Exception("Каталог с прайсами ({$CONFIG['price']['dir']}) не существует");
     210        if (!is_dir($CONFIG['price']['dir']))
     211                throw new Exception("Каталог с прайсами ({$CONFIG['price']['dir']}) не является каталогом");
     212        $dh = opendir($CONFIG['price']['dir']);
     213        if (!$dh)
     214                throw new Exception("Не удалось открыть каталог с прайсами ({$CONFIG['price']['dir']})");
     215        SetStatus('Loading prices', $db);
     216        require_once($CONFIG['location'] . "/common/priceloader.xls.php");
     217        require_once($CONFIG['location'] . "/common/priceloader.ods.php");
     218
     219        while (false !== ($filename = readdir($dh))) {
    225220                $path_info = pathinfo($filename);
    226                 $ext=isset($path_info['extension'])?strtolower($path_info['extension']):'';
    227                 if($ext=='xls')         $loader=new XLSPriceLoader($CONFIG['price']['dir'].'/'.$filename);
    228                 else if($ext=='ods')    $loader=new ODSPriceLoader($CONFIG['price']['dir'].'/'.$filename);
    229                 else continue;
    230                 $f=0;
    231                 $firm_array=$loader->detectSomeFirm();
     221                $ext = isset($path_info['extension']) ? strtolower($path_info['extension']) : '';
     222                if ($ext == 'xls')
     223                        $loader = new XLSPriceLoader($CONFIG['price']['dir'] . '/' . $filename);
     224                else if ($ext == 'ods')
     225                        $loader = new ODSPriceLoader($CONFIG['price']['dir'] . '/' . $filename);
     226                else
     227                        continue;
     228                $f = 0;
     229                $firm_array = $loader->detectSomeFirm();
    232230                $loader->setInsertToDatabase();
    233                 $msg="File: $filename\n";
    234                 foreach($firm_array as $firm)
    235                 {
     231                $msg = "File: $filename\n";
     232                foreach ($firm_array as $firm) {
    236233                        echo "{$msg}Firm_id: {$firm['firm_id']} ({$firm['firm_name']}), ";
    237                         $loader->useFirmAndCurency($firm['firm_id'],$firm['curency_id']);
    238                         $count=$loader->Run();
     234                        $loader->useFirmAndCurency($firm['firm_id'], $firm['curency_id']);
     235                        $count = $loader->Run();
    239236                        echo "Parsed ($count items)!\n";
    240                         $f=1;
    241                 }
    242                 if($f==0)
    243                 {
     237                        $f = 1;
     238                }
     239                if ($f == 0) {
    244240                        $msg.="соответствий не найдено. Прайс не обработан.";
    245                         $mail_text.="Анализ прайсов: $msg\n";
    246                 }
    247                 else unlink($CONFIG['price']['dir']     .'/'.$filename);
     241                        $mail_text.="Анализ прайсов: $msg\n";
     242                }
     243                else
     244                        unlink($CONFIG['price']['dir'] . '/' . $filename);
    248245
    249246//              if($firm=$loader->detectFirm())
     
    265262        // Выборка
    266263        echo "Начинаем анализ...\n";
    267         mysql_query("UPDATE `price` SET `seeked`='0'");
    268         mysql_query("CREATE TABLE IF NOT EXISTS `parsed_price_tmp` (
     264        $db->query("UPDATE `price` SET `seeked`='0'");
     265        $db->query("CREATE TABLE IF NOT EXISTS `parsed_price_tmp` (
    269266        `id` int(11) NOT NULL auto_increment,
    270267        `firm` int(11) NOT NULL,
     
    276273        UNIQUE KEY `id` (`id`)
    277274        ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;");
    278         if(mysql_errno())               throw new Exception("Не удалось создать временную таблицу совпадений: ".mysql_error());
    279 
    280         if($CONFIG['price']['mark_matched'])
    281         {
    282                 mysql_query("DROP TABLE `price_seeked`");
    283                 mysql_query("CREATE TABLE IF NOT EXISTS `price_seeked` (
     275
     276        if ($CONFIG['price']['mark_matched']) {
     277                $db->query("DROP TABLE `price_seeked`");
     278                $db->query("CREATE TABLE IF NOT EXISTS `price_seeked` (
    284279                `id` int(11) NOT NULL,
    285280                `seeked` int(11) NOT NULL,
    286281                UNIQUE KEY `id` (`id`)
    287282                ) ENGINE=Memory");
    288                 if(mysql_errno())               throw new Exception("Не удалось создать временную таблицу отметок: ".mysql_error());
    289283        }
    290284
    291285        parallel_match();
    292286
    293         if($CONFIG['price']['mark_matched'])
    294         {
    295                 mysql_unbuffered_query("UPDATE `price`,`price_seeked` SET `price`.`seeked`=`price_seeked`.`seeked`  WHERE `price`.`id`=`price_seeked`.`id`");
    296                 if(mysql_errno())               throw new Exception("Не удалось записать отметки в основную таблицу: ".mysql_error());
    297         }
    298 
    299         mysql_query("ALTER TABLE`parsed_price_tmp`
     287        if ($CONFIG['price']['mark_matched'])
     288                $db->query("UPDATE `price`,`price_seeked` SET `price`.`seeked`=`price_seeked`.`seeked`  WHERE `price`.`id`=`price_seeked`.`id`");
     289
     290        $db->query("ALTER TABLE`parsed_price_tmp`
    300291        ADD INDEX ( `firm` ),
    301292        ADD INDEX ( `pos` ),
     
    303294        ADD INDEX ( `nal` ),
    304295        ADD INDEX ( `from` )");
    305         if(mysql_errno())       if(mysql_errno())       throw new Exception("Ошибка создания индексов в таблице с соответствиями: ".mysql_error());
    306 
    307         mysql_query("DROP TABLE `parsed_price`");
    308         if(mysql_errno())       if(mysql_errno())       throw new Exception("Ошибка удаления старой таблицы с соответствиями: ".mysql_error());
    309 
    310         mysql_query("RENAME TABLE `parsed_price_tmp` TO `parsed_price` ;");
    311         if(mysql_errno())                               throw new Exception("Ошибка переименования таблицы с соответствиями: ".mysql_error());
    312 
    313 
    314         echo    "Анализ прайсов завершен успешно!";
     296
     297        $db->query("DROP TABLE `parsed_price`");
     298
     299        $db->query("RENAME TABLE `parsed_price_tmp` TO `parsed_price` ;");
     300
     301        echo "Анализ прайсов завершен успешно!";
    315302        // ====================== ОБНОВЛЕНИЕ ЦЕН =============================================================
    316         $res=mysql_query("SELECT `doc_base`.`id`, `doc_base`.`cost`, `doc_base`.`name`, (
     303        $res = $db->query("SELECT `doc_base`.`id`, `doc_base`.`cost`, `doc_base`.`name`, (
    317304        SELECT SUM(`doc_base_cnt`.`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id` GROUP BY `doc_base_cnt`.`id`) AS `allcnt`, `doc_base`.`group`
    318305        FROM `doc_base`");
    319         if(mysql_errno())                               throw new Exception("Ошибка выборки при обновлении цен: ".mysql_error());
    320         $row=mysql_num_rows($res);
    321         $old_p=$i=0;
    322         while($nxt=mysql_fetch_row($res))
    323         {
     306        $row = $res->num_rows;
     307        $old_p = $i = 0;
     308        while ($nxt = $res->fetch_row()) {
    324309                $i++;
    325                 $p=floor($i/$row*100);
    326                 if($old_p!=$p)
    327                 {
    328                         $old_p=$p;
    329                         SetStatus("Cost change: $p pp");
    330                 }
    331                 settype($nxt[3],'int');
    332 
    333                 $mincost=99999999;
    334                 $ok_line=0;
    335                 $rrp=0;
    336                 $rs=mysql_query("SELECT `parsed_price`.`cost`,`firm_info`.`type`, `firm_info_group`.`id`, `parsed_price`.`id`, `firm_info`.`rrp`, `firm_info`.`id`
     310                $p = floor($i / $row * 100);
     311                if ($old_p != $p) {
     312                        $old_p = $p;
     313                        SetStatus("Cost change: $p pp", $db);
     314                }
     315                settype($nxt[3], 'int');
     316
     317                $mincost = 99999999;
     318                $ok_line = 0;
     319                $rrp = 0;
     320                $rs = $db->query("SELECT `parsed_price`.`cost`,`firm_info`.`type`, `firm_info_group`.`id`, `parsed_price`.`id`, `firm_info`.`rrp`, `firm_info`.`id`
    337321                FROM  `parsed_price`
    338322                LEFT JOIN `firm_info` ON `firm_info`.`id`=`parsed_price`.`firm`
    339323                LEFT JOIN `firm_info_group` ON `firm_info_group`.`firm_id`=`parsed_price`.`firm` AND `firm_info_group`.`group_id`='$nxt[4]'
    340324                WHERE `parsed_price`.`pos`='$nxt[0]' AND `parsed_price`.`cost`>'0' AND `parsed_price`.`nal`!='' AND `parsed_price`.`nal`!='-' AND `parsed_price`.`nal`!='call' AND `parsed_price`.`nal`!='0'");
    341                 if(mysql_errno())       throw new Exception(mysql_error());
    342                 while($nx=mysql_fetch_row($rs))
    343                 {
    344                         if($nx[4])
    345                         {
    346                                 $rrp=$nx[0];
    347                                 $ok_line=$nx[3];
     325                while ($nx = $rs->fetch_row()) {
     326                        if ($nx[4]) {
     327                                $rrp = $nx[0];
     328                                $ok_line = $nx[3];
    348329                                break;
    349330                        }
    350                         if(($nx[1]==1 || ($nx[1]==2 &&  $nx[2]!='')) && $mincost>$nx[0])
    351                         {
    352                                 $mincost=$nx[0];
    353                                 $ok_line=$nx[3];
    354                         }
    355                 }
    356 
    357                 if($ok_line==0) $mincost=0;
    358                
    359                 if($rrp)
    360                 {
    361                         $s_cost=0;
    362                         $cres=mysql_query("SELECT `id` FROM `doc_cost` WHERE `vid`='1'");
    363                         if(mysql_errno())       throw new Exception(mysql_error());
    364                         list($cost_id)=mysql_fetch_row($cres);
    365                         $cres=mysql_query("SELECT `value` FROM `doc_base_cost` WHERE `pos_id`='$nxt[0]' AND `cost_id`='$cost_id'");
    366                         if(mysql_errno())       throw new Exception(mysql_error());
    367                         if(mysql_num_rows($cres)>0)
    368                         {
    369                                 list($s_cost)=mysql_fetch_row($cres);
    370                                
    371                         }
     331                        if (($nx[1] == 1 || ($nx[1] == 2 && $nx[2] != '')) && $mincost > $nx[0]) {
     332                                $mincost = $nx[0];
     333                                $ok_line = $nx[3];
     334                        }
     335                }
     336
     337                if ($ok_line == 0)
     338                        $mincost = 0;
     339
     340                if ($rrp) {
     341                        $s_cost = 0;
     342                        $cres = $db->query("SELECT `id` FROM `doc_cost` WHERE `vid`='1'");
     343                        list($cost_id) = $cres->fetch_row();
     344                        $cres = $db->query("SELECT `value` FROM `doc_base_cost` WHERE `pos_id`='$nxt[0]' AND `cost_id`='$cost_id'");
     345                        if ($cres->num_rows)
     346                                list($s_cost) = $cres->fetch_row();
    372347                       
    373                         if($s_cost!=$rrp)
    374                         {
    375                                 if($s_cost)
    376                                 {
    377                                         mysql_query("UPDATE `doc_base_cost` SET `value`='$rrp' AND `rrp_firm_id`='$nx[5]' WHERE `pos_id`='$nxt[0]' AND `cost_id`='$cost_id'");
    378                                         if(mysql_errno())       throw new Exception(mysql_error());
    379                                 }
    380                                 else
    381                                 {
    382                                         mysql_query("INSERT INTO `doc_base_cost` (`cost_id`, `pos_id`, `type`, `value`, `accuracy`, `direction`, `rrp_firm_id`)
     348                        if ($s_cost != $rrp) {
     349                                if ($s_cost)
     350                                        $db->query("UPDATE `doc_base_cost` SET `value`='$rrp' AND `rrp_firm_id`='$nx[5]' WHERE `pos_id`='$nxt[0]'
     351                                                AND `cost_id`='$cost_id'");
     352                                else {
     353                                        $db->query("INSERT INTO `doc_base_cost` (`cost_id`, `pos_id`, `type`, `value`, `accuracy`, `direction`, `rrp_firm_id`)
    383354                                        VALUES ('$cost_id', '$nxt[0]', 'fix', '$rrp', '2', '0', '$nx[5]')");
    384                                         if(mysql_errno())       throw new MysqlException("Не удалось записать заданную цену");
    385355                                }
    386356                                echo "У наименования ID:$nxt[0] изменена РОЗНИЧНАЯ цена с $s_cost на $rrp. Наименование: $nxt[2]\n";
     
    389359                }
    390360
    391                 if( $nxt[3]==0 )
    392                 {
    393                         mysql_query("UPDATE `parsed_price` SET `selected`='1' WHERE `id`='$ok_line'");
    394                         if(mysql_errno())       throw new Exception(mysql_error());
    395                         if($nxt[1]!=$mincost)
    396                         {
    397                                 $txt="У наименования ID:$nxt[0] изменена цена с $nxt[1] на $mincost. Наименование: $nxt[2]\n";
    398                                 mysql_query("UPDATE `doc_base` SET `cost`='$mincost', `cost_date`=NOW() WHERE `id`='$nxt[0]'");
    399                                 if(mysql_errno())       throw new Exception(mysql_error());
     361                if ($nxt[3] == 0) {
     362                        $db->query("UPDATE `parsed_price` SET `selected`='1' WHERE `id`='$ok_line'");
     363                        if ($nxt[1] != $mincost) {
     364                                $txt = "У наименования ID:$nxt[0] изменена цена с $nxt[1] на $mincost. Наименование: $nxt[2]\n";
     365                                $db->query("UPDATE `doc_base` SET `cost`='$mincost', `cost_date`=NOW() WHERE `id`='$nxt[0]'");
    400366                                echo $txt;
    401                                 if($nxt[1])     $pp=($nxt[1]-$mincost)*100/$nxt[1];
    402                                 else            $pp=-1000;
    403                                 if($pp>@$CONFIG['price']['notify_down'] && @$CONFIG['price']['notify_down'])    $mail_text.=$txt;
    404                                 if(($pp*(-1))>@$CONFIG['price']['notify_up'] && @$CONFIG['price']['notify_up']) $mail_text.=$txt;
    405                         }
    406                 }
    407         }
    408         mysql_query("ALTER TABLE `parsed_price`
    409         ADD INDEX ( `selected` )");
    410         if(mysql_errno())       if(mysql_errno())       throw new Exception("Ошибка создания индексов (2) в таблице с соответствиями: ".mysql_error());
    411 
    412 }
    413 catch(Exception $e)
    414 {
    415         $txt="Ошибка: ".$e->getMessage()."\n";
     367                                if ($nxt[1])
     368                                        $pp = ($nxt[1] - $mincost) * 100 / $nxt[1];
     369                                else
     370                                        $pp = -1000;
     371                                if ($pp > @$CONFIG['price']['notify_down'] && @$CONFIG['price']['notify_down'])
     372                                        $mail_text.=$txt;
     373                                if (($pp * (-1)) > @$CONFIG['price']['notify_up'] && @$CONFIG['price']['notify_up'])
     374                                        $mail_text.=$txt;
     375                        }
     376                }
     377        }
     378        $db->query("ALTER TABLE `parsed_price` ADD INDEX ( `selected` )");
     379} catch (Exception $e) {
     380        $txt = "Ошибка: " . $e->getMessage() . "\n";
    416381        echo $txt;
    417382        $mail_text.=$txt;
    418383}
    419384
    420 $work_time=microtime(TRUE)-$start_time;;
    421 
    422 $h=$m=0;
    423 $s=round($work_time*100)/100;
    424 if($s>60)
    425 {
    426         $m=floor($s/60);
    427         $s-=$m*60;
    428 }
    429 
    430 if($m>60)
    431 {
    432         $h=floor($m/60);
    433         $m-=$h*60;
    434 }
    435 
    436 $text_time='Скрипт выполнен за ';
    437 if($h)  $text_time.="$h часов ";
    438 if($m)  $text_time.="$m минут ";
    439 if($s)  $text_time.="$s секунд ";
     385$work_time = microtime(TRUE) - $start_time;
     386;
     387
     388$h = $m = 0;
     389$s = round($work_time * 100) / 100;
     390if ($s > 60) {
     391        $m = floor($s / 60);
     392        $s-=$m * 60;
     393}
     394
     395if ($m > 60) {
     396        $h = floor($m / 60);
     397        $m-=$h * 60;
     398}
     399
     400$text_time = 'Скрипт выполнен за ';
     401if ($h)
     402        $text_time.="$h часов ";
     403if ($m)
     404        $text_time.="$m минут ";
     405if ($s)
     406        $text_time.="$s секунд ";
    440407$text_time.=" (всего $work_time секунд)\n";
    441408
     
    443410
    444411// ===================== ОТПРАВКА ПОЧТЫ ===============================================================
    445 if($mail_text)
    446 {
    447         try
    448         {
    449                 $mail_text="При анализе прайс-листов произошло следующее:\n****\n\n".$mail_text."\n\n****\nНайденные ошибки желательно исправить в кратчайший срок!!\n\n$text_time";
     412if ($mail_text) {
     413        try {
     414                $mail_text = "При анализе прайс-листов произошло следующее:\n****\n\n" . $mail_text . "\n\n****\nНайденные ошибки желательно исправить в кратчайший срок!!\n\n$text_time";
    450415                mailto($CONFIG['site']['admin_email'], "Price analyzer errors", $mail_text);
    451416                mailto($CONFIG['site']['doc_adm_email'], "Price analyzer errors", $mail_text);
    452417                echo "Почта отправлена!";
    453         }
    454         catch(Exception $e)
    455         {
    456                 echo"Ошибка отправки почты!".$e->getMessage();
    457         }
    458 
    459 
    460 }
    461 else echo"Ошибок не найдено, не о чем оповещать!\n";
    462 
    463 mysql_query("DELETE FROM `sys_cli_status` WHERE `id`='$status_id'");
    464 
     418        } catch (Exception $e) {
     419                echo"Ошибка отправки почты!" . $e->getMessage();
     420        }
     421}
     422else
     423        echo"Ошибок не найдено, не о чем оповещать!\n";
     424
     425$db->query("DELETE FROM `sys_cli_status` WHERE `id`='$status_id'");
    465426?>
  • cli/ps_parser.php

    r03d943c rb490b46  
    2525require_once($CONFIG['location']."/common/async/psparser.php");
    2626
    27 try
    28 {
     27try {
    2928        $worker=new PsParserWorker(0);
    3029        $worker->run();
    3130}
    32 catch(Exception $e)
    33 {
    34         if($worker)
    35         {
    36                 try
    37                 {
     31catch(Exception $e) {
     32        if($worker) {
     33                try {
    3834                        $worker->finalize();
    3935                }
    40                 catch(Exception $e)
    41                 {
     36                catch(Exception $e) {
    4237                        echo $e->getMessage()."\n";
    4338                }
    4439        }
    45 
    4640        echo $e->getMessage()."\n";
    4741}
  • cli/resp_clear.php

    r03d943c rb490b46  
    3131$info_mail='';
    3232
    33 if($CONFIG['resp_clear']['info_time'])
    34 {
    35         $res=mysql_query("SELECT `doc_agent`.`id`, `doc_agent`.`name`, `doc_agent`.`responsible`, `users`.`name`, `users`.`reg_email` FROM `doc_agent`
     33if ($CONFIG['resp_clear']['info_time']) {
     34        $res = $db->query("SELECT `doc_agent`.`id`, `doc_agent`.`name`, `doc_agent`.`responsible`, `users`.`name`, `users`.`reg_email` FROM `doc_agent`
    3635        LEFT JOIN `users` ON `users`.`id`=`doc_agent`.`responsible`
    3736        WHERE `doc_agent`.`id` NOT IN (SELECT `agent` FROM `doc_list` WHERE `date`>='$i_time' ) AND `doc_agent`.`responsible`>'0'");
    38         if(mysql_errno())       throw new MysqlException("Не удалось получить пользователей");
    39         $resp_info=array();
    40         $resp_mail=array();
    41        
    42         if(mysql_num_rows($res)>0)      $info_mail.="По следующим агентам, ассоциированным с ответственными, не было движения более {$CONFIG['resp_clear']['info_time']} дней:\n";
    43        
    44         while($nxt=mysql_fetch_row($res))
    45         {
    46                 $info_mail.='id:'.str_pad($nxt[0], 6, ' ', STR_PAD_LEFT).' - '.$nxt[1]." (ответственный - $nxt[3] (id:$nxt[2])\n";
    47                 if(!isset($resp_info[$nxt[2]])) $resp_info[$nxt[2]]='';
    48                 $resp_info[$nxt[2]].='id:'.str_pad($nxt[0], 6, ' ', STR_PAD_LEFT).' - '.$nxt[1]."\n";
    49                 $resp_mail[$nxt[2]]=$nxt[4];
     37        $resp_info = array();
     38        $resp_mail = array();
     39
     40        if ($res->num_rows > 0)
     41                $info_mail.="По следующим агентам, ассоциированным с ответственными, не было движения более {$CONFIG['resp_clear']['info_time']} дней:\n";
     42
     43        while ($nxt = $res->fetch_row()) {
     44                $info_mail.='id:' . str_pad($nxt[0], 6, ' ', STR_PAD_LEFT) . ' - ' . $nxt[1] . " (ответственный - $nxt[3] (id:$nxt[2])\n";
     45                if (!isset($resp_info[$nxt[2]]))
     46                        $resp_info[$nxt[2]] = '';
     47                $resp_info[$nxt[2]].='id:' . str_pad($nxt[0], 6, ' ', STR_PAD_LEFT) . ' - ' . $nxt[1] . "\n";
     48                $resp_mail[$nxt[2]] = $nxt[4];
    5049        }
    51        
    52         foreach($resp_info as $id => $resp)
    53         {
    54                 $mail_text="По следующим агентам, для которых Вы назначены ответственным менеджером, , не было движения более {$CONFIG['resp_clear']['info_time']} дней:\n\n".$resp."\nЕсли Вы не примите меры, то через некоторое время Вы перестанете быть ответственным менеджером этого агента!\n\nВы получили это письмо, так как являетесь ответственным менеджером.\nЭто письмо сгенерированно автоматически системой оповещения сайта {$CONFIG['site']['name']}.\nОтвечать на него не нужно.";
    55                                
    56                 try
    57                 {       
    58                         mailto($resp_mail[$id], $CONFIG['site']['name']." - Информация для ответственного сотрудника", $mail_text);
     50
     51        foreach ($resp_info as $id => $resp) {
     52                $mail_text = "По следующим агентам, для которых Вы назначены ответственным менеджером, , не было движения более {$CONFIG['resp_clear']['info_time']} дней:\n\n" . $resp . "\nЕсли Вы не примите меры, то через некоторое время Вы перестанете быть ответственным менеджером этого агента!\n\nВы получили это письмо, так как являетесь ответственным менеджером.\nЭто письмо сгенерированно автоматически системой оповещения сайта {$CONFIG['site']['name']}.\nОтвечать на него не нужно.";
     53
     54                try {
     55                        mailto($resp_mail[$id], $CONFIG['site']['name'] . " - Информация для ответственного сотрудника", $mail_text);
    5956                        echo "Почта отправлена!";
    60                 }
    61                 catch(Exception $e)
    62                 {
    63                         echo"Ошибка отправки почты!".$e->getMessage();
     57                } catch (Exception $e) {
     58                        echo"Ошибка отправки почты!" . $e->getMessage();
    6459                }
    6560        }
    6661}
    6762
    68 try
    69 {
    70 
    71 if($CONFIG['resp_clear']['clear_time'])
    72 {
    73         $res=mysql_query("SELECT `doc_agent`.`id`, `doc_agent`.`name`, `doc_agent`.`responsible`, `users`.`name`, `users`.`reg_email` FROM `doc_agent`
    74         LEFT JOIN `users` ON `users`.`id`=`doc_agent`.`responsible`
    75         WHERE `doc_agent`.`id` NOT IN (SELECT `agent` FROM `doc_list` WHERE `date`>='$c_time' ) AND `doc_agent`.`responsible`>'0'");
    76         if(mysql_errno())       throw new MysqlException("Не удалось получить пользователей");
    77         if(mysql_num_rows($res)>0)      $info_mail.="\n\nУ следующих агентов были сняты ассоциации с ответственным, т.к. не было движения более {$CONFIG['resp_clear']['clear_time']} дней:\n";
    78        
    79         while($nxt=mysql_fetch_row($res))
    80         {
    81                 $info_mail.='id:'.str_pad($nxt[0], 6, ' ', STR_PAD_LEFT).' - '.$nxt[1]." (был ответственный - $nxt[3] (id:$nxt[2])\n";
    82                 mysql_query("UPDATE `doc_agent` SET `responsible`='0' WHERE `id`='$nxt[0]'");
    83                 if(mysql_error())       throw new Exception("Не удалось убрать ответственного менеджера!");
     63try {
     64        if ($CONFIG['resp_clear']['clear_time']) {
     65                $res = $db->query("SELECT `doc_agent`.`id`, `doc_agent`.`name`, `doc_agent`.`responsible`, `users`.`name`, `users`.`reg_email` FROM `doc_agent`
     66                        LEFT JOIN `users` ON `users`.`id`=`doc_agent`.`responsible`
     67                        WHERE `doc_agent`.`id` NOT IN (SELECT `agent` FROM `doc_list` WHERE `date`>='$c_time' ) AND `doc_agent`.`responsible`>'0'");
     68                if ($res->num_rows > 0)
     69                        $info_mail.="\n\nУ следующих агентов были сняты ассоциации с ответственным, т.к. не было движения более {$CONFIG['resp_clear']['clear_time']} дней:\n";
     70                while ($nxt = $res->fetch_row()) {
     71                        $info_mail.='id:' . str_pad($nxt[0], 6, ' ', STR_PAD_LEFT) . ' - ' . $nxt[1] . " (был ответственный - $nxt[3] (id:$nxt[2])\n";
     72                        $db->query("UPDATE `doc_agent` SET `responsible`='0' WHERE `id`='$nxt[0]'");
     73                }
    8474        }
    85 }
    86 
    87 }
    88 catch(Exception $e)
    89 {
     75} catch (Exception $e) {
    9076        $info_mail.=$e->getMessage();
    9177        echo $e->getMessage();
    9278}
    9379
    94 if($info_mail)
    95 {
    96         $mail_text=$info_mail."\n\nВы получили это письмо, так как ваш адрес указан в настройках сайта.\nЭто письмо сгенерированно автоматически системой оповещения сайта {$CONFIG['site']['name']}.\nОтвечать на него не нужно.";
    97        
    98         try
    99         {       
    100                 mailto($CONFIG['resp_clear']['info_mail'], $CONFIG['site']['name']." - Информация о неактивных клиентах", $mail_text);
     80if ($info_mail) {
     81        $mail_text = $info_mail . "\n\nВы получили это письмо, так как ваш адрес указан в настройках сайта.\nЭто письмо сгенерированно автоматически системой оповещения сайта {$CONFIG['site']['name']}.\nОтвечать на него не нужно.";
     82
     83        try {
     84                mailto($CONFIG['resp_clear']['info_mail'], $CONFIG['site']['name'] . " - Информация о неактивных клиентах", $mail_text);
    10185                echo "Почта отправлена!";
    102         }
    103         catch(Exception $e)
    104         {
    105                 echo"Ошибка отправки почты!".$e->getMessage();
     86        } catch (Exception $e) {
     87                echo"Ошибка отправки почты!" . $e->getMessage();
    10688        }
    10789}
    108 
    10990?>
  • cli/week.php

    r03d943c rb490b46  
    77include_once("$base_path/config_cli.php");
    88
    9 
    10 
    119?>
  • common/async/dbcheck.php

    r03d943c rb490b46  
    8383               
    8484                // Заплонение дат первой покупки для раздела новинок
    85                 mysql_query("UPDATE `doc_base` SET `buy_time`='1970-01-01 00:00:00'");
     85                mysql_query("UPDATE `doc_base` SET `buy_time`='1970-01-01 00:00:00', `transit_cnt`='0'");
    8686                if(mysql_errno())       throw new MysqlException('Ошибка сброса данных о покупке');
    8787                $res=mysql_query("SELECT `id` FROM `doc_base` WHERE `doc_base`.`pos_type`=0");
  • common/core.common.php

    r03d943c rb490b46  
    2323/// Файл содержит код, используемый как web, так и cli скриптами
    2424
     25/// Отправить сообщение по электронной почте
     26/// @param email Адрес получателя
     27/// @param subject Тема сообщения
     28/// @param msg Тело сообщения
     29/// @param from Адрес отправителя
    2530function mailto($email, $subject, $msg, $from="")
    2631{
     
    3338        $email_message->SetEncodedHeader("Subject", $subject);
    3439        if($from)       $email_message->SetEncodedEmailHeader("From", $from, $from);
    35         else            $email_message->SetEncodedEmailHeader("From", $CONFIG['site']['admin_email'], "Почтовый робот {$CONFIG['site']['name']}");
     40        else            $email_message->SetEncodedEmailHeader("From", $CONFIG['site']['admin_email'], "Почтовый робот {$CONFIG['site']['display_name']}");
    3641        $email_message->SetHeader("Sender",$CONFIG['site']['admin_email']);
    3742        $email_message->AddQuotedPrintableTextPart($msg);
     
    4146        else                    return 0;
    4247}
     48
     49/// возвращает строковое представление интервала
    4350/// @param times - время в секундах
    44 /// возвращает строковое представление интервала
    4551function sectostrinterval($times)
    4652{
     
    5561}
    5662
     63/// Получить unixtime начала указанных суток
     64/// @param date произвольное время в UNIXTIME формате
     65function date_day($date)
     66{
     67   $ee=date("d M Y 00:00:00",$date);
     68   $tm=strtotime($ee);
     69   return $tm;
     70}
     71
     72/// Класс расширяет функциональность mysqli
     73class MysqiExtended extends mysqli {
     74       
     75        /// Начать транзакцию
     76        function startTransaction(){
     77                return $this->query("START TRANSACTION");
     78        }
     79       
     80        /// Получить все значения строки из таблицы по ключу в виде массива
     81        /// @param table        Имя таблицы
     82        /// @param key_value    Значение ключа, по которому производится выборка. Будет приведено к целому типу.
     83        /// @return             В случае успеха возвращает ассоциативный массив с данными. В случае sql ошибки вернёт false. В случае, если искомой строки нет в таблице, вернет 0
     84        function selectRow($table, $key_value) {
     85                settype($key_value,'int');
     86                $res=$this->query('SELECT * FROM `'.$table.'` WHERE `id`='.$key_value);
     87                if(!$res)               return false;
     88                if(!$res->num_rows)     return 0;
     89                return  $res->fetch_assoc();
     90        }
     91       
     92        /// Получить заданные значения строки из таблицы по ключу в виде массива
     93        /// @param table        Имя таблицы
     94        /// @param key_value    Значение ключа, по которому производится выборка. Будет приведено к целому типу.
     95        /// @param array        Массив со значениями, содержащими имена полей
     96        /// @return             В случае успеха возвращает ассоциативный массив с данными. В случае, если искомой строки нет в таблице, вернет массив со значениями, равными ''
     97        function selectRowA($table, $key_value, $array) {
     98                settype($key_value,'int');
     99                $q=$f='';
     100                foreach($array as $value) {
     101                        if($f)  $q.=',`'.$value.'`';
     102                        else {  $q='`'.$value.'`'; $f=1;}
     103                }
     104                $res = $this->query('SELECT '.$q.' FROM `'.$table.'` WHERE `id`='.$key_value);
     105                if(!$res->num_rows){
     106                        $info = array();
     107                        foreach ($array as $value)
     108                                $info[$value] = '';
     109                        return $info;
     110                }
     111                return  $res->fetch_assoc();
     112        }
     113       
     114                /// Получить заданные значения строки из таблицы по ключу в виде массива
     115        /// @param table        Имя таблицы
     116        /// @param key_value    Значение ключа, по которому производится выборка. Будет приведено к целому типу.
     117        /// @param array        Массив с ключами, содержащими имена полей
     118        /// @return             В случае успеха возвращает ассоциативный массив с данными. В случае, если искомой строки нет в таблице, вернет исходный массив
     119        function selectRowAi($table, $key_value, $array) {
     120                settype($key_value,'int');
     121                $q=$f='';
     122                foreach($array as $key => $value) {
     123                        if($f)  $q.=',`'.$key.'`';
     124                        else {  $q='`'.$key.'`'; $f=1;}
     125                }
     126                $res=$this->query('SELECT '.$q.' FROM `'.$table.'` WHERE `id`='.$key_value);
     127                if(!$res->num_rows)     return $array;
     128                return  $res->fetch_assoc();
     129        }
     130       
     131        /// Получить значения столбца из таблицы структуры ключ/param/value по ключу в виде массива
     132        /// @param table        Имя таблицы
     133        /// @param key_value    Значение ключа, по которому производится выборка. Будет приведено к целому типу.
     134        /// @param array        Массив со значениями, содержащими имена полей
     135        /// @return             В случае успеха возвращает ассоциативный массив с данными. В случае sql ошибки вернёт false. В случае, если искомого значения нет в таблице, вернет пустую строку для такого значения
     136        function selectFieldKA($table, $key_name, $key_value, $array) {
     137                settype($key_value,'int');
     138                $a=array_fill_keys($array, '');
     139                $res=$this->query('SELECT `param`, `value` FROM `'.$table.'` WHERE `'.$key_name.'`='.$key_value);
     140                if(!$res)       return false;
     141                while($line=$res->fetch_row())
     142                {
     143                        if(array_key_exists($line[0], $a))
     144                                $a[$line[0]]=$line[1];
     145                }
     146                return $a;
     147        }
     148       
     149        /// Вставить строку в заданную таблицу
     150        /// @param table        Имя таблицы
     151        /// @param array        Ассоциативный массив вставляемых данных
     152        /// @return id вставленной строки или false в случае ошибки
     153        function insertA($table, $array) {
     154                $cols=$values='';
     155                $f=0;
     156                foreach($array as $key=>$value){
     157                        if($value!=='NULL')
     158                                $value = '\''.$this->real_escape_string($value).'\'';
     159                        if(!$f){
     160                                $cols = '`'.$key.'`';
     161                                $values = $value;
     162                                $f=1;
     163                        }
     164                        else {
     165                                $cols .= ', `'.$key.'`';
     166                                $values .= ', '.$value;
     167                        }
     168                }
     169                if(!$this->query("INSERT INTO `$table` ($cols) VALUES ($values)"))
     170                        return false;
     171                return $this->insert_id;
     172        }
     173
     174
     175        /// Обновить данные в заданной таблице
     176        /// @param table        Имя таблицы
     177        /// @param key_value    Значение ключа, по которому будет произведено обновление. Будет приведено к целому типу.
     178        /// @param field        Название поля таблицы
     179        /// @param value        Новое значение поля таблицы. Автоматически экранируется.
     180        /// @return Возвращаемое значение аналогично mysqli::query
     181        function update($table, $key_value, $field, $value){
     182                settype($key_value,'int');
     183                if($value!=='NULL')
     184                        $value = '\''.$this->real_escape_string($value).'\'';
     185                return $this->query("UPDATE `$table` SET `$field`=$value WHERE `id`=$key_value");
     186        }
     187       
     188        /// Обновить данные в заданной таблице данными из массива по ключу с именем id
     189        /// @param table        Имя таблицы
     190        /// @param key_value    Значение ключа, по которому будет произведено обновление. Будет приведено к целому типу.
     191        /// @param array        Ассоциативный массив ключ/значение для обновления. Значения автоматически экранируется.
     192        /// @return             Возвращаемое значение аналогично mysql::query
     193        function updateA($table, $key_value, $array){
     194                settype($key_value,'int');
     195                $q=$this->updatePrepare($array);
     196                return $this->query("UPDATE `$table` SET $q WHERE `id`=$key_value");
     197        }
     198
     199        /// Обновить данные в заданной таблице данными из массива по ключу с заданным именем
     200        /// @param table        Имя таблицы
     201        /// @param key_name     Имя ключа таблицы
     202        /// @param key_value    Значение ключа, по которому будет произведено обновление. Будет приведено к целому типу.
     203        /// @param array        Ассоциативный массив ключ/значение для обновления. Значения автоматически экранируется.
     204        /// @return Возвращаемое значение аналогично mysqli::query
     205        function updateKA($table, $key_name, $key_value, $array) {
     206                settype($key_value,'int');
     207                $q=$this->updatePrepare($array);
     208                return $this->query("UPDATE `$table` SET $q WHERE `id`=$key_value");
     209        }
     210       
     211        /// Заменить данные в заданной таблице данными из массива по ключу с заданным именем
     212        /// @param table        Имя таблицы
     213        /// @param key_name     Имя ключа таблицы
     214        /// @param key_value    Значение ключа, по которому будет произведено обновление. Будет приведено к целому типу.
     215        /// @param array        Ассоциативный массив ключ/значение для обновления. Значения автоматически экранируется.
     216        /// @return Возвращаемое значение аналогично mysqli::query
     217        function replaceKA($table, $key_name, $key_value, $array) {
     218                settype($key_value,'int');
     219                $q=$f='';
     220                foreach($array as $key => $value) {
     221                        if($value!=='NULL')
     222                                $value = '\''.$this->real_escape_string($value).'\'';
     223                        if($f)  $q.=',(\''.$key_value.'\',\''.$key.'\','.$value.')';
     224                        else {  $q='(\''.$key_value.'\',\''.$key.'\','.$value.')'; $f=1;}
     225                }
     226                return $this->query('REPLACE `'.$table.'` (`'.$key_name.'`, `param`, `value`) VALUES '.$q);
     227        }
     228       
     229        /// Удалить из заданной тоаблицы строку с указанным id
     230        /// @param key_value    Значение ключа, по которому будет произведено обновление. Будет приведено к целому типу.
     231        public function delete($table, $key_value) {
     232                settype($key_value,'int');
     233                return $this->query('DELETE FROM `'.$table.'` WHERE `id`='.$key_value);
     234        }
     235       
     236        /// Подготавливает данные для update запросов
     237        /// @param array Ассоциативный массив ключ/значение для обновления. Значения автоматически экранируется.
     238        private function updatePrepare($array) {
     239                $q=$f='';
     240                foreach($array as $key => $value) {
     241                        if($value!=='NULL')
     242                                $value = '\''.$this->real_escape_string($value).'\'';
     243                        if($f)  $q.=',`'.$key.'`='.$value;
     244                        else {  $q='`'.$key.'`='.$value; $f=1;}
     245                }
     246                return $q;
     247        }
     248};
     249
    57250
    58251?>
  • common/priceloader.php

    r03d943c rb490b46  
    6060       
    6161        /// Определение принадлежности прайс-листа по сигнатуре
    62         public function detectFirm()
    63         {
    64                 $res=mysql_query("SELECT `id`, `name`, `signature`, `currency` FROM `firm_info`");
    65                 if(mysql_errno())       throw new MysqlException("Не удалось получить данные фирмы");
    66                 while($nxt=mysql_fetch_row($res))
    67                 {
    68                         if($this->findSignature($nxt[2]))
    69                         {
    70                                 $this->def_currency=$nxt[3];
    71                                 return  $this->firm_id=$nxt[0];
     62        public function detectFirm() {
     63                global $db;
     64                $res = $db->query("SELECT `id`, `name`, `signature`, `currency` FROM `firm_info`");
     65                while ($nxt = $res->fetch_row()) {
     66                        if ($this->findSignature($nxt[2])) {
     67                                $this->def_currency = $nxt[3];
     68                                return $this->firm_id = $nxt[0];
    7269                        }
    7370                }
     
    7673       
    7774        /// Определение совпадений фирмы с несколькими сигнатурами. Для выполнения анализа для нужной фирмы использовать useFirmAndCurency(firm_id, currency_id)
    78         public function detectSomeFirm()
    79         {
    80                 $firm_list=array();
    81                 $res=mysql_query("SELECT `id`, `name`, `signature`, `currency` FROM `firm_info`");
    82                 if(mysql_errno())       throw new MysqlException("Не удалось получить данные фирмы");
    83                 while($nxt=mysql_fetch_row($res))
    84                 {
    85                         if($this->findSignature($nxt[2]))
    86                                 $firm_list[]=array('firm_id'=>$nxt[0], 'firm_name'=>$nxt[1], 'curency_id'=>$nxt[3]);
     75        public function detectSomeFirm() {
     76                global $db;
     77                $firm_list = array();
     78                $res = $db->query("SELECT `id`, `name`, `signature`, `currency` FROM `firm_info`");
     79                while ($nxt = $res->fetch_row()) {
     80                        if ($this->findSignature($nxt[2]))
     81                                $firm_list[] = array('firm_id' => $nxt[0], 'firm_name' => $nxt[1], 'curency_id' => $nxt[3]);
    8782                }
    8883                return $firm_list;
     
    9085       
    9186        /// Выбрать фирму и валюту для последующей загрузки прайса в базу
    92         public function useFirmAndCurency($firm_id, $currency_id)
    93         {
    94                 $this->firm_id=$firm_id;
    95                 $this->def_currency=$currency_id;               
     87        public function useFirmAndCurency($firm_id, $currency_id) {
     88                $this->firm_id = $firm_id;
     89                $this->def_currency = $currency_id;
    9690        }
    97        
     91
    9892        /// Запуск анализа
    99         public function Run()
    100         {
    101                 $this->line_cnt=0;
    102                 if(($this->firm_id==0) && $this->insert_to_database)            throw new Exception("Принадлежность прайс-листа к фирме не задана");   
    103                 $this->table_parsing=0;
    104                 $this->html='';
     93        public function Run() {
     94                global $db;
     95                $this->line_cnt = 0;
     96                if (($this->firm_id == 0) && $this->insert_to_database)
     97                        throw new Exception("Принадлежность прайс-листа к фирме не задана");
     98                $this->table_parsing = 0;
     99                $this->html = '';
    105100
    106                 if($this->insert_to_database)
    107                 {
    108                         mysql_query("DELETE FROM `price` WHERE `firm` = '{$this->firm_id}'");
    109                         if(mysql_errno())       throw new MysqlException("Не удалось удалить старый прайс фирмы {$this->firm_id}");
    110                         mysql_query("UPDATE `firm_info` SET `last_update`=NOW() WHERE `id`='{$this->firm_id}'");
    111                         if(mysql_errno())       throw new MysqlException("Не удалось установить дату обновления прайса фирмы {$this->firm_id}");
    112                         $res=mysql_query("SELECT `id`, `name` FROM `currency`");
    113                         if(mysql_errno())       throw new MysqlException("Не удалось получить список валют");
    114                         $this->currencies=array();
    115                         while($nxt=mysql_fetch_row($res))
    116                                 $this->currencies[$nxt[1]]=strtoupper($nxt[0]);
     101                if ($this->insert_to_database) {
     102                        $db->query("DELETE FROM `price` WHERE `firm` = '{$this->firm_id}'");
     103                        $db->query("UPDATE `firm_info` SET `last_update`=NOW() WHERE `id`='{$this->firm_id}'");
     104                        $res = $db->query("SELECT `id`, `name` FROM `currency`");
     105                        $this->currencies = array();
     106                        while ($nxt = $res->fetch_row())
     107                                $this->currencies[$nxt[1]] = strtoupper($nxt[0]);
    117108                }
    118                
    119109                $this->parse();
    120 
    121110                return $this->line_cnt;
    122111        }
     
    124113// ===================== Функции, вызываемые парсером в процессе работы =============================================
    125114       
    126         protected function tableBegin($table_name)
    127         {
    128                                
    129                 if($this->insert_to_database)
    130                 {
    131                         $sql_table_name=mysql_real_escape_string($table_name);
    132                         $res=mysql_query("SELECT `art`, `name`, `cost`, `nal`, `currency`, `info` FROM `firm_info_struct` WHERE `firm_id`='{$this->firm_id}' AND `table_name` LIKE '$sql_table_name'");
    133                         if(mysql_errno())       throw new MysqlException("Ошибка получения данных фирмы для листа *$sql_table_name*");
    134                         if(!mysql_num_rows($res))
    135                         {
    136                                 $res=mysql_query("SELECT `art`, `name`, `cost`, `nal`, `currency`, `info` FROM `firm_info_struct` WHERE `firm_id`='{$this->firm_id}' AND `table_name` = ''");
    137                                 if(mysql_errno())       throw new MysqlException("Ошибка получения данных фирмы для листа по умолчанию");
     115        protected function tableBegin($table_name) {
     116                global $db;
     117                if ($this->insert_to_database) {
     118                        $sql_table_name = $db->real_escape_string($table_name);
     119                        $res = $db->query("SELECT `art`, `name`, `cost`, `nal`, `currency`, `info` FROM `firm_info_struct` WHERE `firm_id`='{$this->firm_id}' AND `table_name` LIKE '$sql_table_name'");
     120                        if (!$res->num_rows) {
     121                                $res = $db->query("SELECT `art`, `name`, `cost`, `nal`, `currency`, `info` FROM `firm_info_struct` WHERE `firm_id`='{$this->firm_id}' AND `table_name` = ''");
    138122                        }
    139                         if(!mysql_num_rows($res))       
    140                                 //настройки для листа не найдены
    141                                 $this->table_parsing=0;
    142                         else
    143                         {
    144                                 $this->firm_cols=mysql_fetch_assoc($res);
    145                                 $this->table_parsing=1;
    146                                
     123                        if (!$res->num_rows)
     124                        //настройки для листа не найдены
     125                                $this->table_parsing = 0;
     126                        else {
     127                                $this->firm_cols = mysql_fetch_assoc($res);
     128                                $this->table_parsing = 1;
    147129                        }
    148130                }
    149                 if($this->build_html_data)
    150                 {
     131                if ($this->build_html_data) {
    151132                        $this->html.="<table class='list'><caption>$table_name</caption><thead><tr>";
    152                         for($i=1;$i<=$this->build_html_data;$i++)
    153                         {
     133                        for ($i = 1; $i <= $this->build_html_data; $i++) {
    154134                                $this->html.="<th>$i</th>";
    155135                        }
     
    157137                }
    158138        }
    159        
    160         protected function tableEnd()
    161         {
    162                 if($this->build_html_data)      $this->html.="</tbody></table><br>";
     139
     140        protected function tableEnd() {
     141                if ($this->build_html_data)
     142                        $this->html.="</tbody></table><br>";
    163143        }
    164        
    165         protected function rowBegin()
    166         {
     144
     145        protected function rowBegin() {
    167146                // Пока пусто
    168147        }
    169        
    170         protected function rowEnd()
    171         {
    172                 if($this->insert_to_database && $this->table_parsing && isset($this->line[$this->firm_cols['cost']]))
    173                 {
    174                         $cost=$this->line[$this->firm_cols['cost']];
    175                         $cost=preg_replace("/[^,.\d]+/","",$cost);
    176                         $cost=str_replace(",",".",$cost);
    177                         settype($cost,"double");
    178                        
    179                         if(@$this->line[$this->firm_cols['name']] && (@$this->line[$this->firm_cols['nal']] || @$this->line[$this->firm_cols['cost']]) )
    180                         {
     148
     149        protected function rowEnd() {
     150                global $db;
     151                if ($this->insert_to_database && $this->table_parsing && isset($this->line[$this->firm_cols['cost']])) {
     152                        $cost = $this->line[$this->firm_cols['cost']];
     153                        $cost = preg_replace("/[^,.\d]+/", "", $cost);
     154                        $cost = str_replace(",", ".", $cost);
     155                        settype($cost, "double");
     156
     157                        if (@$this->line[$this->firm_cols['name']] && (@$this->line[$this->firm_cols['nal']] || @$this->line[$this->firm_cols['cost']])) {
    181158                                $this->line_cnt++;
    182                                 $name=mysql_real_escape_string(@$this->line[$this->firm_cols['name']]);
    183                                 $art=mysql_real_escape_string(@$this->line[$this->firm_cols['art']]);
    184                                 $nal=mysql_real_escape_string(@$this->line[$this->firm_cols['nal']]);
    185                                 $curr=strtoupper(trim(@$this->line[$this->firm_cols['currency']]));
    186                                 $info=mysql_real_escape_string(@$this->line[$this->firm_cols['info']]);
    187                                 if(strpos($curr, '$')!==false)          $curr='USD';
    188                                 else if(stripos($curr, 'р')!==false)    $curr='RUR';   
    189                                 if(isset($this->currencies[$curr]))     $curr=$this->currencies[$curr];
    190                                 else                                    $curr=$this->def_currency;
    191                                 mysql_query("INSERT INTO `price`
    192                                 (`name`,`cost`,`firm`,`art`,`date`, `nal`, `currency`, `info`) VALUES
     159                                $name = $db->real_escape_string(@$this->line[$this->firm_cols['name']]);
     160                                $art = $db->real_escape_string(@$this->line[$this->firm_cols['art']]);
     161                                $nal = $db->real_escape_string(@$this->line[$this->firm_cols['nal']]);
     162                                $curr = strtoupper(trim(@$this->line[$this->firm_cols['currency']]));
     163                                $info = $db->real_escape_string(@$this->line[$this->firm_cols['info']]);
     164                                if (strpos($curr, '$') !== false)
     165                                        $curr = 'USD';
     166                                else if (stripos($curr, 'р') !== false)
     167                                        $curr = 'RUR';
     168                                if (isset($this->currencies[$curr]))
     169                                        $curr = $this->currencies[$curr];
     170                                else
     171                                        $curr = $this->def_currency;
     172                                $db->query("INSERT INTO `price` (`name`,`cost`,`firm`,`art`,`date`, `nal`, `currency`, `info`) VALUES
    193173                                ('$name', '$cost', '{$this->firm_id}', '$art', NOW(), '$nal', '$curr', '$info')");
    194                                 if(mysql_errno())       throw new MysqlException("Не удалось вставить строку прайса в базу!");
    195174                        }
    196175                }
    197                 if($this->build_html_data)
    198                 {
     176                if ($this->build_html_data) {
    199177                        $this->html.="<tr>";
    200                         for($i=1;$i<=$this->build_html_data;$i++)
    201                         {
    202                                 $val = @htmlentities($this->line[$i], ENT_COMPAT, 'UTF-8');
     178                        for ($i = 1; $i <= $this->build_html_data; $i++) {
     179                                $val = @htmlentities($this->line[$i], ENT_COMPAT, 'UTF-8');
    203180                                $this->html.="<td>$val</td>";
    204181                        }
     
    206183                }
    207184        }
     185
    208186}
    209187
  • config_all.sample.php

    r03d943c rb490b46  
    99$CONFIG['site']['default_firm'] = 1;                            // Организация по умолчанию для работы сайта
    1010$CONFIG['site']['default_bank'] = 6;                            // Банк по умолчанию для работы сайта. Если парамер не указан - будет выбран произвольный банк организации
     11$CONFIG['site']['default_agent']= 1;
     12$CONFIG['site']['default_sklad']= 1;
    1113$CONFIG['location']             = '/usr/share/multimag';
    1214$CONFIG['site']['location']     = $CONFIG['location'].'/web';
  • config_site.sample.php

    r03d943c rb490b46  
    6565$CONFIG['doc']['notify_sms']            = false;// Информировать покупателей о статусе заказа по sms. Требует настроек sms шлюза
    6666$CONFIG['doc']['default_unit']          = 135;  // ID единицы измерения по умолчанию
     67$CONFIG['doc']['op_time']               = 365;  // Срок действительности документа *предложение поставщика*
    6768
    6869//$CONFIG['doc']['pie']                 = '';   // Текст отправляемой покупателю благодарности. Если текст задан, в заявке появится кнопка.
  • web/.htaccess

    r03d943c rb490b46  
    4040
    4141<IfModule mod_expires.c>
    42 #Header set Cache-Control "public"
     42Header set Cache-Control "public"
    4343ExpiresActive on
    4444# устанавливаем значения кэширования по умолчанию
  • web/adm_comments.php

    r03d943c rb490b46  
    33//      MultiMag v0.1 - Complex sales system
    44//
    5 //      Copyright (C) 2005-2010, BlackLight, TND Team, http://tndproject.org
     5//      Copyright (C) 2005-2013, BlackLight, TND Team, http://tndproject.org
    66//
    77//      This program is free software: you can redistribute it and/or modify
     
    2525
    2626need_auth($tmpl);
    27 $tmpl->SetTitle("Администрирование коментариев");
     27$tmpl->setTitle("Администрирование коментариев");
    2828if(!isAccess('admin_comments','view'))  throw new AccessException("Недостаточно привилегий");
     29
     30$mode=request($mode);
    2931
    3032if($mode=='')
    3133{
    32         $res=mysql_query("SELECT `comments`.`id`, `date`, `object_name`, `object_id`, `autor_name`, `autor_email`, `autor_id`, `text`, `rate`, `ip`, `user_agent`, `comments`.`response`, `users`.`name` AS `user_name`, `users`.`reg_email` AS `user_email`
     34        $res=$db->query("SELECT `comments`.`id`, `date`, `object_name`, `object_id`, `autor_name`, `autor_email`, `autor_id`, `text`, `rate`, `ip`, `user_agent`, `comments`.`response`, `users`.`name` AS `user_name`, `users`.`reg_email` AS `user_email`
    3335        FROM `comments`
    3436        INNER JOIN `users` ON `users`.`id`=`comments`.`autor_id`
    3537        ORDER BY `comments`.`id` DESC");
    36         if(mysql_errno())       throw new MysqlException("Не удалось получить коментарии");
    37         $tmpl->AddText("<h1 id='page-title'>Последние коментарии</h1>
     38        if(!$res)       throw new MysqlException("Не удалось получить коментарии");
     39
     40        $tmpl->addContent("<h1 id='page-title'>Последние коментарии</h1>
    3841        <table class='list' width='100%'>
    3942        <tr><th>ID</th><th>Дата</th><th>Объект</th><th>Автор</th><th>e-mail</th><th>Текст коментария</th><th>Оценка</th><th>Ответ</th><th>IP адрес</th><th>user-agent</th></tr>");
    40         while($line=mysql_fetch_assoc($res))
     43        while($line=$res->fetch_assoc($res))
    4144        {
    4245                $object="{$line['object_name']}:{$line['object_id']}";
     
    4548                $email="<a href='mailto:$email'>$email</a>";
    4649                $autor=$line['autor_id']?"{$line['autor_id']}:<a href='/adm_users.php?mode=view&amp;id={$line['autor_id']}'>{$line['user_name']}</a>":$line['autor_name'];
    47                 $response=$line['response']?$line['response']."<br><a href='?mode=response&amp;id={$line['id']}'>Правка</a>":"<a href='?mode=response&amp;id={$line['id']}'>Ответить</a>";
    48 
    49                 $tmpl->AddText("<tr>
     50                $response=$line['response']?html_out($line['response'])."<br><a href='?mode=response&amp;id={$line['id']}'>Правка</a>":"<a href='?mode=response&amp;id={$line['id']}'>Ответить</a>";
     51                $html_text=html_out($line['text']);
     52                $tmpl->addContent("<tr>
    5053                <td>{$line['id']} <a href='?mode=rm&amp;id={$line['id']}'><img src='/img/i_del.png' alt='Удалить'></a></td>
    5154                <td>{$line['date']}</td><td>$object</td><td>$autor</td> <td>$email</td><td>{$line['text']}</td><td>{$line['rate']}</td><td>$response</td><td>{$line['ip']}</td><td>{$line['user_agent']}</td></tr>");
    5255        }
    53         $tmpl->AddText("</table>");
     56        $tmpl->addContent("</table>");
    5457}
    5558else if($mode=='rm')
    5659{
    5760        if(!isAccess('admin_comments','delete'))        throw new AccessException("Недостаточно привилегий");
    58         $id=rcv('id');
    59         mysql_query("DELETE FROM `comments` WHERE `id`='$id'");
    60         if(mysql_errno())                               throw new MysqlException("Не удалось удалить строку");
     61        $id=rcvint('id');
     62
     63        $db->query("DELETE FROM `comments` WHERE `id`='$id'");
     64        if(!$res)                                       throw new MysqlException("Не удалось удалить строку");
    6165        $tmpl->msg("Строка удалена.<br><a href='/adm_comments.php'>Назад</a>","ok");
    6266}
    6367else if($mode=='response')
    6468{
    65         $id=rcv('id');
    66         $opt=rcv('opt');
    67         settype($id,'int');
     69        $id=rcvint('id');
     70        $opt=request('opt');
     71
    6872        if($opt)
    6973        {
    70                 $text=mysql_real_escape_string(@$_POST['text']);
    71                 mysql_query("UPDATE `comments` SET `response`='$text', `responser`='{$_SESSION['uid']}' WHERE `id`='$id'");
    72                 if(mysql_errno())                               throw new MysqlException("Не удалось сохранить коментарий");
    73                 $tmpl->msg("Коментарий сохранён успешно");
    74 
     74                $sql_text=$db->real_escape_string(request('text'));
     75                $res=$db->query("UPDATE `comments` SET `response`='$sql_text', `responser`='{$_SESSION['uid']}' WHERE `id`='$id'");
     76                if(!$res)                               throw new MysqlException("Не удалось сохранить коментарий");
     77                $tmpl->msg("Коментарий сохранён успешно",'ok');
    7578        }
    76         $res=mysql_query("SELECT `comments`.`id`, `date`, `object_name`, `object_id`, `autor_name`, `autor_email`, `autor_id`, `text`, `rate`, `ip`, `user_agent`, `comments`.`response`, `users`.`name` AS `user_name`, `users`.`reg_email` AS `user_email`
     79        $res=$db->query("SELECT `comments`.`id`, `date`, `object_name`, `object_id`, `autor_name`, `autor_email`, `autor_id`, `text`, `rate`, `ip`, `user_agent`, `comments`.`response`, `users`.`name` AS `user_name`, `users`.`reg_email` AS `user_email`
    7780        FROM `comments`
    7881        INNER JOIN `users` ON `users`.`id`=`comments`.`autor_id`
    7982        WHERE `comments`.`id`='$id'");
    80         if(mysql_errno())       throw new MysqlException("Не удалось получить коментарии");
    81         $line=mysql_fetch_assoc($res);
     83        if(!$res)               throw new MysqlException("Не удалось получить коментарии");
     84        $line=$res->fetch_assoc();
    8285        if(!$line)              throw new Exception("Коментарий не найден!");
    8386        $autor=$line['autor_id']?"{$line['autor_id']}:<a href='/adm_users.php?mode=view&amp;id={$line['autor_id']}'>{$line['user_name']}</a>":$line['autor_name'];
    8487        $object="{$line['object_name']}:{$line['object_id']}";
    85         $tmpl->AddText("<h1 id='page-title'>Ответ на коментарий N{$line['id']}</h1>
    86         <div>{$line['date']} $autor для $object пишет:<br>{$line['text']}</div>
     88        $html_text=html_out($line['text']);
     89        $html_response=html_out($line['response']);
     90        $tmpl->addContent("<h1 id='page-title'>Ответ на коментарий N{$line['id']}</h1>
     91        <div>{$line['date']} $autor для $object пишет:<br>$html_text</div>
    8792        <form action='' method='post'>
    8893        <input type='hidden' name='id' value='{$line['id']}'>
    8994        <input type='hidden' name='opt' value='save'>
    9095        Ваш ответ (500 символов максимум):<br>
    91         <textarea name='text' class='text'>{$line['response']}</textarea><br>
     96        <textarea name='text' class='text'>$html_response</textarea><br>
    9297        <button type='submit'>Сохранить</button>
    9398        </form><br>
    9499        <a href='/adm_comments.php'>Вернуться к общему списку коментариев</a>");
    95 
    96100}
    97101
     
    101105catch(Exception $e)
    102106{
    103         mysql_query("ROLLBACK");
    104         $tmpl->AddText("<br><br>");
     107        global $db, $tmpl;
     108        $db->query("ROLLBACK");
     109        $tmpl->addContent("<br><br>");
    105110        $tmpl->logger($e->getMessage());
    106111}
  • web/adm_users.php

    r03d943c rb490b46  
    33//      MultiMag v0.1 - Complex sales system
    44//
    5 //      Copyright (C) 2005-2010, BlackLight, TND Team, http://tndproject.org
     5//      Copyright (C) 2005-2013, BlackLight, TND Team, http://tndproject.org
    66//
    77//      This program is free software: you can redistribute it and/or modify
     
    2525
    2626need_auth($tmpl);
    27 $tmpl->SetTitle("Администрирование пользователей");
     27$tmpl->setTitle("Администрирование пользователей");
    2828if(!isAccess('admin_users','view'))     throw new AccessException("Недостаточно привилегий");
    2929
     30$mode=request('mode');
     31
    3032if($mode=='')
    3133{
    32         $res=mysql_query("SELECT `users`.`id`, `users`.`name`, `users`.`reg_email`, `users`.`reg_email_confirm`, `users`.`reg_email_subscribe`, `users`.`reg_phone`, `users`.`reg_phone_confirm`, `users`.`reg_phone_subscribe`, `users`.`reg_date`, `users_worker_info`.`worker`,
     34        $order='`users`.`id`';
     35        $res=$db->query("SELECT `users`.`id`, `users`.`name`, `users`.`reg_email`, `users`.`reg_email_confirm`, `users`.`reg_email_subscribe`, `users`.`reg_phone`, `users`.`reg_phone_confirm`, `users`.`reg_phone_subscribe`, `users`.`reg_date`, `users_worker_info`.`worker`,
    3336        ( SELECT `date` FROM `users_login_history` WHERE `user_id`=`users`.`id` ORDER BY `date` DESC LIMIT 1) AS `lastlogin_date`,
    3437        ( SELECT `user_id` FROM `users_openid` WHERE `user_id`=`users`.`id` LIMIT 1) AS `openid`
    3538        FROM `users`
    3639        LEFT JOIN `users_worker_info` ON `users_worker_info`.`user_id`=`users`.`id`
    37         ");
    38         if(mysql_errno())                       throw new MysqlException("Не удалось получить данные пользователей");
    39         $tmpl->AddText("<h1 id='page-title'>Список пользователей</h1>
     40        ORDER BY $order");
     41        if(!$res)                       throw new MysqlException("Не удалось получить данные пользователей");
     42        $tmpl->addContent("<h1 id='page-title'>Список пользователей</h1>
    4043        <table class='list' width='100%'>
    4144        <tr><th rowspan='2'>ID</th>
     
    5356        </tr>
    5457        ");
    55         while($line=mysql_fetch_assoc($res))
     58        while($line=$res->fetch_assoc())
    5659        {
    5760                $econfirm=$line['reg_email_confirm']=='1'?'Да':'Нет';
     
    6669                $worker=$line['worker']?'Да':'Нет';
    6770
    68                 @$tmpl->AddText("<tr><td><a href='?mode=view&amp;id={$line['id']}'>{$line['id']}</a></td><td>{$line['name']}</td>
     71                @$tmpl->addContent("<tr><td><a href='?mode=view&amp;id={$line['id']}'>{$line['id']}</a></td><td>{$line['name']}</td>
    6972                <td>$p_email</td><td>$econfirm</td><td>$esubscribe</td>
    7073                <td>{$line['reg_phone']}</td><td>$pconfirm</td><td>$psubscribe</td>
     
    7275                <td>{$line['lastlogin_date']}</td><td>$worker</td><td>{$line['reg_date']}</td></tr>");
    7376        }
    74         $tmpl->AddText("</table>");
     77        $tmpl->addContent("</table>");
    7578}
    7679else if($mode=='view')
    7780{
    7881        if(!isAccess('admin_users','view'))     throw new AccessException("Недостаточно привилегий");
    79         $id=rcv('id');
    80         $res=mysql_query("SELECT * FROM `users`
     82        $id=rcvint('id');
     83        $res=$db->query("SELECT * FROM `users`
    8184        LEFT JOIN `users_worker_info` ON `users_worker_info`.`user_id`=`users`.`id`
    8285        WHERE `id`='$id'");
    83         if(mysql_errno())                       throw new MysqlException("Не удалось получить данные пользователя");
    84         if(mysql_num_rows($res)<=0)             throw new Exception("Пользователь не найден!");
    85         $line=mysql_fetch_assoc($res);
     86        if(!$res)                       throw new MysqlException("Не удалось получить данные пользователя");
     87        if(!$res->num_rows)             throw new Exception("Пользователь не найден!");
     88        $line=$res->fetch_assoc();
    8689
    8790        $passch=$line['pass_change']?'Да':'Нет';
     
    108111        $worker=$line['worker']?'Да':'Нет';
    109112
    110         $tmpl->AddText("<h1 id='page-title'>Данные пользователя</h1>
     113        $tmpl->addContent("<h1 id='page-title'>Данные пользователя</h1>
    111114        <table class='list'>
    112115        <tr><th colspan='2'>Основная информация</th></tr>
    113116        <tr><td>ID</td><td>{$line['id']}</td></tr>
    114         <tr><td>Имя</td><td>{$line['name']}</td></tr>
     117        <tr><td>Имя</td><td>".html_out($line['name'])."</td></tr>
    115118        <tr><td>Дата регистрации</td><td>{$line['reg_date']}</td></tr>
    116119        <tr><td>Заблокирован (забанен)</td><td>$diasbled</td></tr>
     
    127130        <tr><td>телефон подписан?</td><td>$psubscribe</td></tr>
    128131        <tr><td>Jabber ID</td><td>{$line['jid']}</td></tr>
    129         <tr><td>Настоящее имя</td><td>{$line['real_name']}</td></tr>
    130         <tr><td>Адрес доставки заказов</td><td>{$line['real_address']}</td></tr>
     132        <tr><td>Настоящее имя</td><td>".html_out($line['real_name'])."</td></tr>
     133        <tr><td>Адрес доставки заказов</td><td>".html_out($line['real_address'])."</td></tr>
    131134        <tr><th colspan='2'>Связь с агентами</th></tr>");
    132135        if(!$line['agent_id'])
    133136        {
    134                 $tmpl->AddText("<tr><td>Связь отсутствует</td><td><a href='/adm_users.php?mode=agent&amp;id=$id'>Установить</a></td></tr>");
     137                $tmpl->addContent("<tr><td>Связь отсутствует</td><td><a href='/adm_users.php?mode=agent&amp;id=$id'>Установить</a></td></tr>");
    135138        }
    136139        else
    137140        {
    138                 $res=mysql_query("SELECT `id`, `name`, `fullname`, `tel`, `fax_phone`, `sms_phone`, `adres`, `data_sverki` FROM `doc_agent` WHERE `id`='{$line['agent_id']}'");
    139                 if(mysql_errno())                       throw new MysqlException("Не удалось получить данные агента");
    140                 $adata=mysql_fetch_assoc($res);
    141                 $tmpl->AddText("
     141                $res=$db->query("SELECT `id`, `name`, `fullname`, `tel`, `fax_phone`, `sms_phone`, `adres`, `data_sverki` FROM `doc_agent` WHERE `id`='{$line['agent_id']}'");
     142                if(!$res)                       throw new MysqlException("Не удалось получить данные агента");
     143                $adata=$res->fetch_assoc();
     144                $tmpl->addContent("
    142145                <tr><td>ID агента</td><td><a href='/docs.php?l=agent&mode=srv&opt=ep&pos={$adata['id']}'>{$adata['id']}</a> - <a href='/adm_users.php?mode=agent&amp;id=$id'>Убрать связь</a></td></tr>
    143                 <tr><td>Краткое название</td><td>{$adata['name']}</td></tr>
    144                 <tr><td>Полное название</td><td>{$adata['fullname']}</td></tr>
    145                 <tr><td>Телефон</td><td>{$adata['tel']}</td></tr>
    146                 <tr><td>Факс</td><td>{$adata['fax_phone']}</td></tr>
    147                 <tr><td>Телефон для SMS</td><td>{$adata['sms_phone']}</td></tr>
    148                 <tr><td>Адрес</td><td>{$adata['adres']}</td></tr>
    149                 <tr><td>Дата сверки</td><td>{$adata['data_sverki']}</td></tr>
     146                <tr><td>Краткое название</td><td>".html_out($adata['name'])."</td></tr>
     147                <tr><td>Полное название</td><td>".html_out($adata['fullname'])."</td></tr>
     148                <tr><td>Телефон</td><td>".html_out($adata['tel'])."</td></tr>
     149                <tr><td>Факс</td><td>".html_out($adata['fax_phone'])."</td></tr>
     150                <tr><td>Телефон для SMS</td><td>".html_out($adata['sms_phone'])."</td></tr>
     151                <tr><td>Адрес</td><td>".html_out($adata['adres'])."}</td></tr>
     152                <tr><td>Дата сверки</td><td>".html_out($adata['data_sverki'])."</td></tr>
    150153                ");
    151154        }
    152         $tmpl->AddText("
     155        $tmpl->addContent("
    153156        <tr><th colspan='2'>Карточка сотрудника (<a href='/adm_users.php?mode=we&amp;id=$id'>править</a>)</th></tr>
    154         <tr><td>Является сотрудником</td><td>$worker</td></tr>
    155         <tr><td>Рабочий email</td><td><a href='mailto:{$line['worker_email']}'>{$line['worker_email']}</a></td></tr>
    156         <tr><td>Рабочий телефон</td><td>{$line['worker_phone']}</td></tr>
    157         <tr><td>Рабочий Jabber</td><td>{$line['worker_jid']}</td></tr>
    158         <tr><td>Рабочее имя</td><td>{$line['worker_real_name']}</td></tr>
    159         <tr><td>Рабочий адрес</td><td>{$line['worker_real_address']}</td></tr>
    160         <tr><th colspan='2'>Дополнительная информация</th></tr>");
    161         $res=mysql_query("SELECT `param`, `value` FROM `users_data` WHERE `uid`='$id'");
    162         if(mysql_errno())                       throw new MysqlException("Не удалось получить дополнительные данные пользователя");
    163         while($line=mysql_fetch_row($res))
    164         {
    165                 $tmpl->AddText("<tr><td>$line[0]</td><td>$line[1]</td></tr>");
    166         }
    167         $tmpl->AddText("<tr><th colspan='2'><a href='/adm_users.php?mode=view_login_history&amp;id=$id'>История входов</a></th></tr>");
    168         $tmpl->AddText("</table>");
     157        <tr><td>Является сотрудником</td><td>$worker</td></tr>");
     158        if($line['worker'])
     159                $tmpl->addContent("<tr><td>Рабочий email</td><td><a href='mailto:{$line['worker_email']}'>{$line['worker_email']}</a></td></tr>
     160                <tr><td>Рабочий телефон</td><td>".html_out($line['worker_phone'])."</td></tr>
     161                <tr><td>Рабочий Jabber</td><td>".html_out($line['worker_jid'])."</td></tr>
     162                <tr><td>Рабочее имя</td><td>".html_out($line['worker_real_name'])."</td></tr>
     163                <tr><td>Рабочий адрес</td><td>".html_out($line['worker_real_address'])."</td></tr>");
     164
     165        $tmpl->addContent("<tr><th colspan='2'>Дополнительная информация</th></tr>");
     166        $res=$db->query("SELECT `param`, `value` FROM `users_data` WHERE `uid`='$id'");
     167        if(!$res)                       throw new MysqlException("Не удалось получить дополнительные данные пользователя");
     168        while($line=$res->fetch_row())
     169        {
     170                $tmpl->addContent("<tr><td>$line[0]</td><td>".html_out($line[1])."</td></tr>");
     171        }
     172        $tmpl->addContent("<tr><th colspan='2'><a href='/adm_users.php?mode=view_login_history&amp;id=$id'>История входов</a></th></tr>");
     173        $tmpl->addContent("</table>");
    169174}
    170175else if($mode=='view_login_history')
    171176{
    172177        if(!isAccess('admin_users','view'))     throw new AccessException("Недостаточно привилегий");
    173         $id=rcv('id');
    174         $tmpl->AddText("<h1 id='page-title'>Данные пользователя</h1>
     178        $id=rcvint('id');
     179        $tmpl->addContent("<h1 id='page-title'>Данные пользователя</h1>
    175180        <table class='list'>
    176181        <tr><th colspan='2'><a href='/adm_users.php?mode=view&amp;id=$id'>Основная информация</a></th></tr>
    177182        <tr><th colspan='2'>История входов</th></tr>");
    178         $res=mysql_query("SELECT `date`, CONCAT(`ip`,' - ',`method`) FROM `users_login_history` WHERE `user_id`='$id' ORDER BY `date` DESC");
    179         if(mysql_errno())                       throw new MysqlException("Не удалось получить информацию об истории входов");
    180         while($line=mysql_fetch_row($res))
    181         {
    182                 $tmpl->AddText("<tr><td>$line[0]</td><td>$line[1]</td></tr>");
    183         }
    184 
    185         $tmpl->AddText("</table>");
     183        $res=$db->query("SELECT `date`, CONCAT(`ip`,' - ',`method`) FROM `users_login_history` WHERE `user_id`='$id' ORDER BY `date` DESC");
     184        if(!$res)                       throw new MysqlException("Не удалось получить информацию об истории входов");
     185        while($line=$res->fetch_row())
     186        {
     187                $tmpl->addContent("<tr><td>$line[0]</td><td>$line[1]</td></tr>");
     188        }
     189
     190        $tmpl->addContent("</table>");
    186191}
    187192else if($mode=='agent')
    188193{
    189194        if(!isAccess('admin_users','edit'))     throw new AccessException("Недостаточно привилегий");
    190         $id=rcv('id');
     195        $id=rcvint('id');
    191196        if(isset($_REQUEST['opt']))
    192197        {
     
    197202                }
    198203                else    $agent_id='NULL';
    199                 mysql_query("UPDATE `users` SET `agent_id`=$agent_id WHERE `id`='$id'");
    200                 if(mysql_errno())                       throw new MysqlException("Не удалось обновить привязку");
     204                $res=$db->query("UPDATE `users` SET `agent_id`=$agent_id WHERE `id`='$id'");
     205                if(!$res)                       throw new MysqlException("Не удалось обновить привязку");
    201206                $tmpl->msg("Привязка выполнена!",'ok');
    202207        }
    203         $res=mysql_query("SELECT `users`.`agent_id`, `doc_agent`.`name` FROM `users`
     208        $res=$db->query("SELECT `users`.`agent_id`, `doc_agent`.`name` FROM `users`
    204209        LEFT JOIN `doc_agent` ON `doc_agent`.`id`=`users`.`agent_id`
    205210        WHERE `users`.`id`='$id'");
    206         if(mysql_errno())                       throw new MysqlException("Не удалось получить данные пользователя");
    207         if(mysql_num_rows($res)<=0)             throw new Exception("Пользователь не найден!");
    208         $line=mysql_fetch_assoc($res);
    209         $tmpl->AddText("<h1 id='page-title'>Привязка пользователя к агенту</h1>
     211        if(!$res)                       throw new MysqlException("Не удалось получить данные пользователя");
     212        if(!$res->num_rows)             throw new Exception("Пользователь не найден!");
     213        $line=$res->fetch_assoc($res);
     214        $tmpl->addContent("<h1 id='page-title'>Привязка пользователя к агенту</h1>
    210215        <div id='page-info'><a href='/adm_users.php?mode=view&amp;id=$id'>Назад</a></div>
    211216        <form action='' method='post'>
     
    217222        <script type='text/javascript' src='/css/jquery/jquery.autocomplete.js'></script>
    218223        <input type='hidden' name='agent_id' id='agent_id' value='{$line['agent_id']}'>
    219         <input type='text' id='agent_nm' name='agent_nm'  style='width: 450px;' value='{$line['name']}'><br>
     224        <input type='text' id='agent_nm' name='agent_nm'  style='width: 450px;' value='".html_out($line['name'])."'><br>
    220225
    221226        <script type=\"text/javascript\">
     
    256261catch(Exception $e)
    257262{
    258         mysql_query("ROLLBACK");
    259         $tmpl->AddText("<br><br>");
     263        $db->query("ROLLBACK");
     264        $tmpl->addContent("<br><br>");
    260265        $tmpl->logger($e->getMessage());
    261266}
  • web/adv_search.php

    r03d943c rb490b46  
    22//      MultiMag v0.1 - Complex sales system
    33//
    4 //      Copyright (C) 2005-2010, BlackLight, TND Team, http://tndproject.org
     4//      Copyright (C) 2005-2013, BlackLight, TND Team, http://tndproject.org
    55//
    66//      This program is free software: you can redistribute it and/or modify
     
    5151include_once("core.php");
    5252include_once("include/doc.core.php");
    53 $analog=rcv('analog');
    54 $proizv=rcv('proizv');
    55 $type=rcv('type');
    56 $di_min=rcv('di_min');
    57 $di_max=rcv('di_max');
    58 $de_min=rcv('de_min');
    59 $de_max=rcv('de_max');
    60 $size_min=rcv('size_min');
    61 $size_max=rcv('size_max');
    62 $m_min=rcv('m_min');
    63 $m_max=rcv('m_max');
    64 $cost_min=rcv('cost_min');
    65 $cost_max=rcv('cost_max');
    66 $name=rcv('name');
     53$name=request('name');
     54$analog=rcvint('analog');
     55$proizv=request('proizv');
     56$type=request('type');
     57$di_min=rcvrounded('di_min');
     58$di_max=rcvrounded('di_max');
     59$de_min=rcvrounded('de_min');
     60$de_max=rcvrounded('de_max');
     61$size_min=rcvrounded('size_min');
     62$size_max=rcvrounded('size_max');
     63$m_min=rcvrounded('m_min');
     64$m_max=rcvrounded('m_max');
     65$cost_min=rcvrounded('cost_min');
     66$cost_max=rcvrounded('cost_max');
    6767
    6868if(!$name)
    6969{
    70         $name=rcv('s');
     70        $name=request('s');
    7171        if($name)
    7272        {
     
    7676}
    7777
    78 if(@$_SESSION['uid'])   $res=mysql_query("SELECT `id` FROM `doc_cost` WHERE `vid`='-1'");
    79 else                    $res=mysql_query("SELECT `id` FROM `doc_cost` WHERE `vid`='1'");
    80 if(mysql_errno())       throw new MysqlException('Не удалось выбрать цену для пользователя');
    81 $cost_id=               mysql_result($res,0,0);
    82 if(!$cost_id)   $cost_id=1;
     78$name_html=html_out($name);
     79$name_sql=$db->real_escape_string($name);
     80$proizv_html=html_out($proizv);
     81$proizv_sql=$db->real_escape_string($proizv);
    8382
    84 $cstr=rcv('cstr');
     83if($type!=='')  settype($type,'int');
     84
     85$cost_id=getCurrentUserCost();
     86
     87$cstr=rcvint('cstr');
    8588if(($cstr<=0)||($cstr>500)) $cstr=500;
    8689
    87 $tmpl->SetTitle("Поиск товара ".$name);
     90$tmpl->setTitle("Поиск товара ".$name);
    8891
    8992if($analog) $an_ch='checked'; else $an_ch='';
    9093
    91 $tmpl->AddText("<h1>Поиск товаров</h1>
     94
     95$tmpl->addContent("<h1>Поиск товаров</h1>
    9296<form action='/adv_search.php' method='get'>
    9397<input type='hidden' name='mode' value='s'>
     
    97101<th>Тип
    98102<tr>
    99 <td colspan='2'><input type='text' name='name' value='$name'><br>
     103<td colspan='2'><input type='text' name='name' value='$name_html'><br>
    100104<td colspan='2'>
    101 <input type=text name='proizv' value='$proizv'><br>
     105<input type=text name='proizv' value='$proizv_html'><br>
    102106<td><input type='text' name='type' value='$type'>
    103107<tr>
     
    128132        if($name)
    129133        {
    130                 $sql.="AND (`doc_base_dop`.`analog` LIKE '%$name%' OR `doc_base`.`name` LIKE '%$name%' OR `doc_base`.`desc` LIKE '%$name%')";
     134                $sql.="AND (`doc_base_dop`.`analog` LIKE '%$name_sql%' OR `doc_base`.`name` LIKE '%$name_sql%' OR `doc_base`.`desc` LIKE '%$name_sql%')";
    131135        }
    132         if($proizv)             $sql.="AND `doc_base`.`proizv` LIKE '%$proizv%'";
     136        if($proizv)             $sql.="AND `doc_base`.`proizv` LIKE '%$proizv_sql%'";
    133137        if($type)               $sql.="AND `doc_base_dop`.`type` = '$type'";
    134138        if($di_min)             $sql.="AND `doc_base_dop`.`d_int` >= '$di_min'";
     
    143147        if($cost_max)           $sql.="AND `doc_base`.`cost` <= '$cost_max'";
    144148
    145         $sql.=" LIMIT 1000";
    146         $res=mysql_query($sql);
    147         if(mysql_errno())       throw new MysqlException("Не удалось сделать выборку товаров");
    148         if($row=mysql_numrows($res))
     149        $sql.=" LIMIT 2000";
     150        $res=$db->query($sql);
     151        if(!$res)       throw new MysqlException("Не удалось сделать выборку товаров");
     152        if($row=$res->num_rows)
    149153        {
    150154                $s="По запросу найдено $row товаров";
    151                 if($row>=1000)  $s="Показаны только первые $row товаров, используйте более строгий запрос!";
    152                 $tmpl->AddText("<h1 id='page-title'>Результаты поиска</h1><div id='page-info'>$s</div>
     155                if($row>=2000)  $s="Показаны только первые $row товаров, используйте более строгий запрос!";
     156                $tmpl->addContent("<h1 id='page-title'>Результаты поиска</h1><div id='page-info'>$s</div>
    153157                <table class='list'><tr><th>Наименование<th>Производитель<th>Аналог<th>Наличие
    154158                <th>Цена, руб<th>d, мм<th>D, мм<th>B, мм<th>m, кг<th>");
     
    156160                $cl="lin0";
    157161                $basket_img="/skins/".$CONFIG['site']['skin']."/basket16.png";
    158                 while($nxt=mysql_fetch_row($res))
     162                while($nxt=$res->fetch_row())
    159163                {
    160164                        if($CONFIG['site']['recode_enable'])    $link= "/vitrina/ip/$nxt[0].html";
    161165                        else                                    $link= "/vitrina.php?mode=product&amp;p=$nxt[0]";
    162166
    163                         $cost=GetCostPos($nxt[0], $cost_id);
     167                        $cost=getCostPos($nxt[0], $cost_id);
    164168                        if($cost<=0)    $cost='уточняйте';
    165169                        $nal=GetCountInfo($nxt[12], $nxt[13]);                 
    166170                        $cce=(strtotime($nxt[5])<(time()-60*60*24*30*6))?" style='color:#888'":'';
    167                         $tmpl->AddText("<tr><td><a href='$link'>$nxt[1] $nxt[2]</a>
    168                         <td>$nxt[3]<td>$nxt[6]<td>$nal<td $cce>$cost<td>$nxt[8]<td>$nxt[9]<td>$nxt[10]<td>$nxt[11]<td>
     171                        $tmpl->addContent("<tr><td><a href='$link'>".html_out($nxt[1].' '.$nxt[2])."</a>
     172                        <td>".html_out($nxt[3])."<td>$nxt[6]<td>$nal<td $cce>$cost<td>$nxt[8]<td>$nxt[9]<td>$nxt[10]<td>$nxt[11]<td>
    169173                        <a href='/vitrina.php?mode=korz_add&amp;p={$nxt[0]}&amp;cnt=1' onclick=\"ShowPopupWin('/vitrina.php?mode=korz_adj&amp;p={$nxt[0]}&amp;cnt=1','popwin'); return false;\" rel='nofollow'><img src='$basket_img' alt='В корзину!'></a>");
    170174                }
    171                 $tmpl->AddText("</table><span style='color:#888'>Серая цена</span> требует уточнения<br>");
     175                $tmpl->addContent("</table><span style='color:#888'>Серая цена</span> требует уточнения<br>");
    172176        }
    173177        else $tmpl->msg("По Вашему запросу ничего не найдено! Попробуйте использовать более мягкие условия поиска!");
  • web/articles.php

    r03d943c rb490b46  
    2828$wikiparser->ignore_images      = false;
    2929
    30 $p=rcv('p');
    31 
    32 if(!$p)
     30if(!isset($_REQUEST['p']))
    3331{
    3432        $arr = @explode( '/' , $_SERVER['REQUEST_URI'] );
    3533        $arr = @explode( '.' , $arr[2] );
    3634        $p=@urldecode(urldecode($arr[0]));
    37 }
     35}       else $p=$_REQUEST('p');
    3836
    3937function articles_form($p,$text='',$type=0)
    4038{
    4139        global $tmpl,$CONFIG;
    42         $types=array(0=>'Wiki (Простая и безопасная разметка, рекомендуется)', 1=>'HTML (Для профессионалов. Может быть небезопасно.)', 'Wiki+HTML');
    43         $tmpl->AddText("
     40        $types=array(0=>'Wiki (Простая и безопасная разметка, рекомендуется)', 1=>'HTML (Для профессионалов. Может быть небезопасно.)', 2=>'Wiki+HTML');
     41        $tmpl->addContent("
    4442        <script type='text/javascript' src='/js/tiny_mce/tiny_mce.js'></script>
    4543        <script type='text/javascript'>
     
    7977        <form action='/articles.php' method='post'>
    8078        <input type='hidden' name='mode' value='save'>
    81         <input type='hidden' name='p' value='$p'>
     79        <input type='hidden' name='p' value='".html_out($p)."'>
    8280        Тип разметки:<br>
    8381        <select name='type' id='select_type' onchange='schange()'>");
     
    8583        {
    8684                $s=($id==$type)?'selected':'';
    87                 $tmpl->AddText("<option value='$id'{$s}>$name</option>");
    88         }
    89 
    90         $tmpl->AddText("</select><label><input type='checkbox' id='tme' onclick='schange()'>Визуальный редактор</label><br>
     85                $tmpl->addContent("<option value='$id'{$s}>$name</option>");
     86        }
     87        $text=html_out($text);
     88        $tmpl->addContent("</select><label><input type='checkbox' id='tme' onclick='schange()'>Визуальный редактор</label><br>
    9189        <textarea class='e_msg' name='text' rows='10' cols='80'>$text</textarea><br>
    9290        <button type='submit'>Сохранить</button>
     
    102100        if($p=="")
    103101        {
    104                 //if(!isAccess('generic_articles','view'))      throw new AccessException("");
    105                 $tmpl->SetText("<h1 id='page-title'>Статьи</h1>Здесь отображаются все статьи сайта. Так-же здесь находятся мини-статьи с объяснением терминов, встречающихся на витрине и в других статьях. В списке Вы видите системные названия статей - в том виде, в котором они создавались, и видны сайту. Реальные заголовки могут отличаться.");
    106                 $tmpl->SetTitle("Статьи");
    107                 $res=mysql_query("SELECT `name` FROM `articles` ORDER BY `name`");
    108                 $tmpl->AddText("<ul>");
    109                 while($nxt=mysql_fetch_row($res))
     102                $tmpl->setContent("<h1 id='page-title'>Статьи</h1>Здесь отображаются все статьи сайта. Так-же здесь находятся мини-статьи с объяснением терминов, встречающихся на витрине и в других статьях, и служебные статьи. В списке Вы видите системные названия статей - в том виде, в котором они создавались, и видны сайту. Реальные заголовки могут отличаться.");
     103                $tmpl->setTitle("Статьи");
     104                $res=$db->query("SELECT `name` FROM `articles` ORDER BY `name`");
     105                if(!$res)       throw new MysqlException("Выборка статей не удалась!");
     106
     107                $tmpl->addContent("<ul>");
     108                while($nxt=$res->fetch_row())
    110109                {
    111110                        $h=$wikiparser->unwiki_link($nxt[0]);
    112                         $tmpl->AddText("<li><a class='wiki' href='/article/$nxt[0].html'>$h</a></li>");
     111                        $tmpl->addContent("<li><a class='wiki' href='/article/$nxt[0].html'>$h</a></li>");
    113112                }
    114                 $tmpl->AddText("</ul>");
     113                $tmpl->addContent("</ul>");
    115114        }
    116115        else
    117116        {
    118                 //if(!isAccess('generic_articles','view'))      throw new AccessException("");
    119                 $res=mysql_query("SELECT `articles`.`name`, `a`.`name`, `articles`.`date`, `articles`.`changed`, `b`.`name`, `articles`.`text`, `articles`.`type`
     117                $page_escaped=$db->real_escape_string($p);
     118                $res=$db->query("SELECT `articles`.`name` AS `article_name`, `a`.`name` AS `author_name`, `articles`.`date`, `articles`.`changed`, `b`.`name` AS `editor_name`, `articles`.`text`, `articles`.`type`
    120119                FROM `articles`
    121120                LEFT JOIN `users` AS `a` ON `a`.`id`=`articles`.`autor`
    122121                LEFT JOIN `users` AS `b` ON `b`.`id`=`articles`.`changeautor`
    123                 WHERE `articles`.`name` LIKE '$p'");
    124                 if(@$nxt=mysql_fetch_row($res))
     122                WHERE `articles`.`name` LIKE '$page_escaped'");
     123                if(!$res)       throw new MysqlException("Выборка статей не удалась!");
     124                if($res->num_rows)
    125125                {
     126                        $nxt=$res->fetch_assoc();
    126127                        $h=$meta_description=$meta_keywords='';
    127                         $text=$nxt[5];
    128                         if($nxt[6]==0)  $text=strip_tags($text, '<nowiki>');
    129                         if($nxt[6]==0 || $nxt[6]==2)
    130                         {
    131                                 $text=$wikiparser->parse(html_entity_decode($text,ENT_QUOTES,"UTF-8"));
     128                        $text=$nxt['text'];
     129                        if($nxt['type']==0)     $text=strip_tags($text, '<nowiki>');
     130                        if($nxt['type']==0 || $nxt['type']==2)
     131                        {
     132                                $text=$wikiparser->parse( html_out($text) );
    132133                                $h=$wikiparser->title;
    133134                                $meta_description=@$wikiparser->definitions['meta_description'];
    134135                                $meta_keywords=@$wikiparser->definitions['meta_keywords'];
    135136                        }
    136                         if($nxt[6]==1 || $nxt[6]==2)    $text=html_entity_decode($text,ENT_QUOTES,"UTF-8");
     137
    137138                        if(!$h)
    138139                        {
     
    140141                                if($h[1])
    141142                                        $h=$wikiparser->unwiki_link($h[1]);
    142                                 else $h=$wikiparser->unwiki_link($p);
     143                                else $h=html_out( $wikiparser->unwiki_link($p) );
    143144                        }
    144145                        if($mode=='')
    145146                        {
    146                                 $tmpl->SetTitle($h);
    147                                 if($nxt[4]) $ch=", последнее изменение - $nxt[4], date $nxt[3]";
     147                                $tmpl->setTitle(strip_tags($h));
     148                                if($nxt['editor_name']) $ch=", последнее изменение - {$nxt['editor_name']}, date {$nxt['changed']}";
    148149                                else $ch="";
    149                                 if($nxt[6]==0 || $nxt[6]==2)    $tmpl->AddText("<h1 id='page-title'>$h</h1>");
     150                                if($nxt['type']==0 || $nxt['type']==2)  $tmpl->addContent("<h1 id='page-title'>$h</h1>");
    150151                                if(@$_SESSION['uid'])
    151152                                {
    152                                         $tmpl->AddText("<div id='page-info'>Создал: $nxt[1], date: $nxt[2] $ch");
    153                                         if(isAccess('generic_articles','edit')) $tmpl->AddText(", <a href='/articles.php?p=$p&amp;mode=edit'>Исправить</a>");
    154                                         $tmpl->AddText("</div>");
    155                                 }
    156                                 $tmpl->AddText("$text<br><br>");
    157                                 $tmpl->SetMetaKeywords($meta_keywords);
    158                                 $tmpl->SetMetaDescription($meta_description);
    159 
     153                                        $tmpl->addContent("<div id='page-info'>Создал: {$nxt['author_name']}, date: {$nxt['date']} $ch");
     154                                        if(isAccess('generic_articles','edit')) $tmpl->addContent(", <a href='/articles.php?p=".html_out($nxt['article_name'])."&amp;mode=edit'>Исправить</a>");
     155                                        $tmpl->addContent("</div>");
     156                                }
     157                                $tmpl->addContent("$text<br><br>");
     158                                $tmpl->setMetaKeywords($meta_keywords);
     159                                $tmpl->setMetaDescription($meta_description);
    160160                        }
    161161                        else
     
    164164                                {
    165165                                        if(!isAccess('generic_articles','edit'))        throw new AccessException("");
    166                                         $tmpl->AddText("<h1>Правим $h</h1>
     166                                        $tmpl->addContent("<h1>Правим $h</h1>
    167167                                        <h2>=== Оригинальный текст ===</h2>$text<h2>=== Конец оригинального текста ===</h2>");
    168168                                        articles_form($p,$nxt[5],$nxt[6]);
     
    171171                                {
    172172                                        if(!isAccess('generic_articles','edit'))        throw new AccessException("");
    173                                         $type=rcv('type');
    174                                         $text=rcv('text');
    175                                         $res=mysql_query("UPDATE `articles` SET `changeautor`='$uid', `changed`=NOW() ,`text`='$text', `type`='$type'
    176                                         WHERE `name` LIKE '$p'");
    177                                         //echo mysql_error();
    178                                         if($res)
    179                                         {
    180                                                 header("Location: /articles.php?p=".$p);
    181                                                 exit();
    182                                         }
    183                                         else $tmpl->msg("Не удалось сохранить!");
    184 
     173                                        $type=rcvint('type');
     174                                        if($type<0 || $type>2)  $type=0;
     175                                        $text=$db->real_escape_string(@$_REQUEST['text']);
     176
     177                                        $res=$db->query("UPDATE `articles` SET `changeautor`='$uid', `changed`=NOW() ,`text`='$text', `type`='$type'
     178                                        WHERE `name` LIKE '$page_escaped'");
     179                                        if(!$res)                                       throw new MysqlException("Ошибка сохранения");
     180
     181                                        header("Location: /articles.php?p=".$nxt['article_name']);
     182                                        exit();
    185183                                }
    186184                        }
     
    190188                        if($mode=='')
    191189                        {
    192                                 $res=mysql_query("SELECT `name` FROM `articles` WHERE `name` LIKE '$p:%' ORDER BY `name`");
    193                                 if(mysql_num_rows($res))
    194                                 {
    195                                         $tmpl->SetText("<h1>Раздел $p</h1>");
    196                                         $tmpl->SetTitle($p);
    197                                         $tmpl->AddText("<ul>");
     190                                $res=$db->query("SELECT `name` FROM `articles` WHERE `name` LIKE '$page_escaped:%' ORDER BY `name`");
     191                                if($res->num_rows)
     192                                {
     193                                        $tmpl->setContent("<h1>Раздел ".html_out($p)."</h1>");
     194                                        $tmpl->setTitle(strip_tags($p));
     195                                        $tmpl->addContent("<ul>");
    198196                                        while($nxt=mysql_fetch_row($res))
    199197                                        {
    200198                                                $h=explode(":",$nxt[0],2);
    201199                                                $h=$wikiparser->unwiki_link($h[1]);
    202                                                 $tmpl->AddText("<li><a href='/article/$nxt[0].html'>$h</a></li>");
     200                                                $tmpl->addContent("<li><a href='/article/".html_out($nxt[0]).".html'>$h</a></li>");
    203201                                        }
    204                                         $tmpl->AddText("</ul>");
     202                                        $tmpl->addContent("</ul>");
    205203                                }
    206204                                else
    207205                                {
    208                                         $tmpl->msg("Извините, статья $p не найдена на нашем сайте. Возможно, вам дали неверную ссылку, либо статья была удалена или перемещена в другое место. Для того, чтобы найти интересующую Вас информацию, воспользуйтесь ","info");
     206                                        $tmpl->msg("Извините, статья ".html_out($p)." не найдена на нашем сайте. Возможно, вам дали неверную ссылку, либо статья была удалена или перемещена в другое место. Для того, чтобы найти интересующую Вас информацию, воспользуйтесь ","info");
    209207                                        header('HTTP/1.0 404 Not Found');
    210208                                        header('Status: 404 Not Found');
    211209                                        if(isAccess('generic_articles','create', true))
    212                                                 $tmpl->AddText("<a href='/articles.php?p=$p&amp;mode=edit'>Создать</a>");
     210                                                $tmpl->addContent("<a href='/articles.php?p=".html_out(strip_tags($p))."&amp;mode=edit'>Создать</a>");
    213211                                }
    214212                        }
     
    219217                                        if(!isAccess('generic_articles','edit'))        throw new AccessException("");
    220218                                        $h=$wikiparser->unwiki_link($p);
    221                                         $tmpl->AddText("<h1>Создаём $h</h1>");
     219                                        $tmpl->addContent("<h1>Создаём ".html_out($h)."</h1>");
    222220                                        articles_form($p);
    223221                                }
     
    226224                                        if(!isAccess('generic_articles','create'))      throw new AccessException("");
    227225                                        $type=rcvint('type');
    228                                         $text=rcvstrsql('text');
    229                                         $res=mysql_query("INSERT INTO `articles` (`type`, `name`,`autor`,`date`,`text`)
     226                                        $text=$db->real_escape_string($_REQUEST['text']);
     227                                        $res=$db->query("INSERT INTO `articles` (`type`, `name`,`autor`,`date`,`text`)
    230228                                        VALUES ('$type', '$p','$uid', NOW(), '$text')");
    231                                         if(!mysql_errno())
    232                                         {
    233                                                 header("Location: /articles.php?p=".$p);
    234                                                 exit();
    235                                         }
    236                                         else throw new MysqlException("Не удалось создать статью!");
    237 
     229                                        if(!$res)       throw new MysqlException("Не удалось создать статью!");
     230                                        header("Location: /articles.php?p=".$p);
     231                                        exit();
    238232                                }
    239233                        }
     
    243237catch(MysqlException $e)
    244238{
    245         mysql_query("ROLLBACK");
    246         $tmpl->AddText("<br><br>");
     239        $db->query("ROLLBACK");
     240        $tmpl->addContent("<br><br>");
    247241        $tmpl->msg($e->getMessage(),"err");
    248242}
    249243catch(Exception $e)
    250244{
    251         mysql_query("ROLLBACK");
    252         $tmpl->AddText("<br><br>");
    253         $tmpl->logger($e->getMessage());
     245        $db->query("ROLLBACK");
     246        $tmpl->addContent("<br><br>");
     247        $tmpl->msg($e->getMessage(),"err");
    254248}
    255249
  • web/core.php

    r03d943c rb490b46  
    22//      MultiMag v0.1 - Complex sales system
    33//
    4 //      Copyright (C) 2005-2012, BlackLight, TND Team, http://tndproject.org
     4//      Copyright (C) 2005-2013, BlackLight, TND Team, http://tndproject.org
    55//
    66//      This program is free software: you can redistribute it and/or modify
     
    1818//
    1919
     20// памятка по рефакторингу: к удалению:
     21// mysql_
     22// rcv
     23// getright
     24// getpost
     25// проверить insert_id
     26// AddText -> AddContent
     27// SetText -> SetContent
     28// Контроль использования html_in
     29// Для вывода из базы в html использовать html_out
     30
    2031/**
    2132@mainpage Cистема комплексного учёта торговли multimag. Документация разработчика.
     
    3142**/
    3243
    33 if(!function_exists('mysql_connect'))
    34 {
    35         header("500 Internal Server Error");
    36         echo"<h1>500 Внутренняя ошибка сервера</h1>Расширение php-mysql не найдено. Обратитесь к администратору по адресу <a href='mailto:{$CONFIG['site']['admin_email']}'>{$CONFIG['site']['admin_email']}</a> c описанием проблемы.";
    37         exit();
    38 }
    39 
    40 if(!function_exists('mb_internal_encoding'))
    41 {
    42         header("500 Internal Server Error");
    43         echo"<h1>500 Внутренняя ошибка сервера</h1>Расширение php-mbstring не найдено. Обратитесь к администратору по адресу <a href='mailto:{$CONFIG['site']['admin_email']}'>{$CONFIG['site']['admin_email']}</a> c описанием проблемы.";
    44         exit();
    45 }
    46 
    47 $time_start = microtime(true);
    48 session_start();
    49 mb_internal_encoding("UTF-8");
    50 
    51 define('__ROOT__', dirname(dirname(__FILE__)));
    52 $base_path = __ROOT__;
    53 
    54 if(! include_once("$base_path/config_site.php"))
    55 {
    56         header("500 Internal Server Error");
    57         echo"<h1>500 Внутренняя ошибка сервера</h1>Конфигурационный файл не найден! Обратитесь к администратору по адресу <a href='mailto:{$CONFIG['site']['admin_email']}'>{$CONFIG['site']['admin_email']}</a> c описанием проблемы.";
    58         exit();
    59 }
    60 
    61 include_once($CONFIG['location']."/common/core.common.php");
    62 
    63 if($CONFIG['site']['force_https'])
    64 {
    65         header('Location: https://'.$_SERVER["HTTP_HOST"].$_SERVER['REQUEST_URI'], true, 301);
    66 }
    67 
    68 if(!isset($CONFIG['site']['display_name']))     $CONFIG['site']['display_name']=$CONFIG['site']['name'];
    69 
    70 if(!@mysql_connect($CONFIG['mysql']['host'],$CONFIG['mysql']['login'],$CONFIG['mysql']['pass']))
    71 {
    72         header("503 Service temporary unavariable");
    73         echo"<h1>503 Сервис временно недоступен!</h1>Не удалось соединиться с сервером баз данных. Возможно он перегружен, и слишком медленно отвечает на запросы, либо выключен. Попробуйте подключиться через 5 минут. Если проблема сохранится - пожалуйста, напишите письмо по адресу <a href='mailto:{$CONFIG['site']['admin_email']}'>{$CONFIG['site']['admin_email']}</a> c описанием проблемы.";
    74         exit();
    75 }
    76 if(!@mysql_select_db($CONFIG['mysql']['db']))
    77 {
    78     echo"Невозможно активизировать базу данных! Возможно, база данных повреждена. Попробуйте подключиться через 5 минут. Если проблема сохранится - пожалуйста, напишите письмо по адресу <a href='mailto:{$CONFIG['site']['admin_email']}'>{$CONFIG['site']['admin_email']}</a> c описанием проблемы.";
    79     exit();
    80 }
    81 
    82 mysql_query("SET CHARACTER SET UTF8");
    83 mysql_query("SET character_set_client = UTF8");
    84 mysql_query("SET character_set_results = UTF8");
    85 mysql_query("SET character_set_connection = UTF8");
    86 
    87 header("X-Powered-By: MultiMag ".MULTIMAG_VERSION);
    88 
    89 $ip=mysql_real_escape_string(getenv("REMOTE_ADDR"));
    90 $ag=mysql_real_escape_string(getenv("HTTP_USER_AGENT"));
    91 $rf=mysql_real_escape_string(urldecode(getenv("HTTP_REFERER")));
    92 $qq=mysql_real_escape_string(urldecode($_SERVER['REQUEST_URI'].'?'.$_SERVER['QUERY_STRING']));
    93 $ff=mysql_real_escape_string($_SERVER['SCRIPT_NAME']);
    94 $tim=time();
    95 
    96 if(!isset($_REQUEST['ncnt'])) @mysql_query("INSERT INTO `counter` (`date`,`ip`,`agent`,`refer`,`query`,`file`) VALUES ('$tim','$ip','$ag','$rf','$qq','$ff')");
    97 
     44
     45/// Класс для работы с IP адресами IPv6
    9846class ipv6
    9947{
     48        /// Является ли строка IPv6 адресом ?
    10049        function is_ipv6($ip = "")
    10150        {
     
    10655        }
    10756
     57        /// Является ли строка IPv4 адресом ?
    10858        function is_ipv4($ip = "")
    10959        {
     
    11262        }
    11363
     64        /// Возвращает IP адрес клиента
    11465        function get_ip()
    11566        {
     
    11768        }
    11869
     70        /// Преобразует заданный IPv6 адрес в полную форму
    11971        function uncompress_ipv6($ip ="")
    12072        {
     
    13587        }
    13688
     89        /// Преобразует заданный IPv6 адрес в краткую форму
    13790        function compress_ipv6($ip ="")
    13891        {
     
    155108}
    156109
     110/// Вычисляет максимально допустимый размер вложений в байтах
    157111function get_max_upload_filesize()
    158112{
     
    185139}
    186140
    187 /// Форматирование номера телефона, записанного в международном формате, в легкочитаемый вид
     141/// @brief Форматирование номера телефона, записанного в международном формате, в легкочитаемый вид.
     142///
    188143/// Номера, не начинающиеся с +, возвращаются без форматирования
    189144function formatPhoneNumber($phone)
     
    200155}
    201156
     157/// @brief Обработчик неперехваченных исключений
     158///
     159/// Записывает событие в журнал ошибок и выдаёт сообщение. При правильной архитектуре программы никогда не должен быть вызван.
    202160function exception_handler($exception)
    203161{
    204         $ip=getenv("REMOTE_ADDR");
    205         $ag=getenv("HTTP_USER_AGENT");
    206         $rf=urldecode(getenv("HTTP_REFERER"));
    207         $ff=$_SERVER['REQUEST_URI'];
    208         $uid=$_SESSION['uid'];
    209         $s=mysql_real_escape_string($exception->getMessage());
    210         $ag=mysql_real_escape_string($ag);
    211         $rf=mysql_real_escape_string($rf);
    212         $ff=mysql_real_escape_string($ff);
    213         mysql_query("INSERT INTO `errorlog` (`page`,`referer`,`msg`,`date`,`ip`,`agent`, `uid`) VALUES
    214         ('$ff','$rf','$s',NOW(),'$ip','$ag', '$uid')");
    215         header('HTTP/1.0 404 Internal error');
    216         header('Status: 404 Internal error');
     162        global $db;
     163        if($db)
     164        {
     165                $uid=@$_SESSION['uid'];
     166                settype($uid,"int");
     167                $ip=$db->real_escape_string(getenv("REMOTE_ADDR"));
     168                $s=$db->real_escape_string($exception->getMessage());
     169                $ag=$db->real_escape_string(getenv("HTTP_USER_AGENT"));
     170                $rf=$db->real_escape_string(urldecode(getenv("HTTP_REFERER")));
     171                $ff=$db->real_escape_string($_SERVER['REQUEST_URI']);
     172                $db->query("INSERT INTO `errorlog` (`page`,`referer`,`msg`,`date`,`ip`,`agent`, `uid`) VALUES
     173                ('$ff','$rf','$s',NOW(),'$ip','$ag', '$uid')");
     174        }
     175        header('HTTP/1.0 500 Internal error');
     176        header('Status: 500 Internal error');
     177        $s=html_out($exception->getMessage());
     178        $ff=html_out($_SERVER['REQUEST_URI']);
    217179        echo"<!DOCTYPE html><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><title>Error 500: Необработанная внутренняя ошибка</title>
    218180        <style type='text/css'>body{color: #000; background-color: #eee; text-align: center;}</style></head><body>
     
    221183set_exception_handler('exception_handler');
    222184
    223 // =================================== Подсветка найденного текста ====================================
     185/// Подсветка подстроки в строке, используя span class=b_selection
     186/// @param str Исходная строка
     187/// @param substr Строка, которую необходимо подсветить
    224188function SearchHilight($str,$substr)
    225189{
     
    230194        {
    231195                if(!$result) $result=$t;
    232                 else $result.='<span class=b_selection>'.$substr.'</span>'.$t;
     196                else $result.="<span class='b_selection'>$substr</span>$t";
    233197        }
    234198        return $result;
    235199}
    236200
    237 // ====================================== Генератор кодов ==================================================
     201/// @brief Генератор псевдоуникального кода.
     202///
     203/// Используется для генерации легкозапоминаемых паролей.
     204/// @param num Если true - использовать только цифры.
     205/// @param minlen Минимальная длина кода.
     206/// @param maxlen Максимальная длина кода.
    238207function keygen_unique($num=0, $minlen=5, $maxlen=12)
    239208{
     
    280249
    281250// ======================================= Обработчики ввода переменных ====================================
    282 /// Переделать: cохранить безопасность записи данных в базу, но убрать преобразование в html-символы
    283 function rcv($varname,$def="")
    284 {
    285         $dt=htmlentities(@$_POST[$varname],ENT_QUOTES,"UTF-8");
    286         if($dt=="") $dt=htmlentities(@$_GET[$varname],ENT_QUOTES,"UTF-8");
    287         if($dt) return $dt;
    288         else return $def;
     251
     252/// Обёртка над $_REQUEST, позволяющая задать значение по умолчанию
     253/// @param varname Имя элемента $_REQUEST
     254/// @param dev Возвращаемое значение, если искомый элемент отсутствует
     255function request($varname,$def='')
     256{
     257        if(isset($_REQUEST[$varname]))  return $_REQUEST[$varname];
     258        return $def;
     259}
     260
     261/// Получает часть массива $_REQUEST, позволяет задать значение по умолчанию для отсутствующих элементов
     262/// @param varname Массив значений ключенй $_REQUEST
     263/// @param dev Возвращаемое значение, если искомый элемент отсутствует
     264function requestA($var_array, $def='')
     265{
     266        $a=array_fill_keys($var_array, $def);
     267        $v=array_intersect_key($_REQUEST, $a);
     268        $r=array_merge($a,$v);
     269        return $r;
    289270}
    290271
    291272/// Безопасное получение целого значения
    292 function rcvint($varname,$def=0)
     273function rcvint($varname, $def=0)
    293274{
    294275        if(isset($_REQUEST[$varname]))  return intval($_REQUEST[$varname]);
     
    296277}
    297278
    298 /// Получение строкового значения для записи в базу
    299 function rcvstrsql($varname,$def='')
    300 {
    301         if(isset($_REQUEST[$varname]))  return mysql_real_escape_string($_REQUEST[$varname]);
     279/// Безопасное получение числа заданной точности
     280function rcvrounded($varname, $round=3, $def=0)
     281{
     282        if(isset($_REQUEST[$varname]))  return round($_REQUEST[$varname],$round);
    302283        return $def;
    303284}
    304285
    305 
    306 function unhtmlentities ($string)
    307 {
    308         return html_entity_decode ($string,ENT_QUOTES,"UTF-8");
    309 }
    310 
     286/// Безопасное получение строки с датой
     287function rcvdate($varname, $def='1970-01-01')
     288{
     289        if(isset($_REQUEST[$varname]))  return date("Y-m-d", strtotime($_REQUEST[$varname]));
     290        return $def;
     291}
     292
     293/// Безопасное получение строки с временем
     294function rcvtime($varname, $def='1970-01-01')
     295{
     296        if(isset($_REQUEST[$varname]))  return date("H:i:s", strtotime($_REQUEST[$varname]));
     297        return $def;
     298}
     299
     300/// Безопасное получение строки с датой и временем
     301function rcvdatetime($varname, $def='1970-01-01')
     302{
     303        if(isset($_REQUEST[$varname]))  return date("Y-m-d H:i:s", strtotime($_REQUEST[$varname]));
     304        return $def;
     305}
     306
     307/// Преобразование HTML сущностей в их ASCII представление. Обёртка над html_entity_decode.
     308function html_in($data)
     309{
     310        return html_entity_decode($data, ENT_QUOTES, "UTF-8");
     311}
     312
     313/// Обёртка над htmlentities
     314function html_out($data)
     315{
     316        return htmlentities($data, ENT_QUOTES, "UTF-8");
     317}
     318
     319/// Получение пользовательского воода GET или POST методом
     320/// TODO: Уже неакутально. Заменить на request в местах использования и удалить.
    311321function getpost($varname,$def="")
    312322{
     323        $bt=debug_backtrace();
     324        trigger_error("Function ".__FUNCTION__." is deprecated (called {$bt[0]['file']}:{$bt[0]['line']}) \n", E_USER_WARNING);
    313325        if(isset($_POST[$varname]))     return $_POST[$varname];
    314326        if(isset($_GET[$varname]))      return $_GET[$varname];
     
    316328}
    317329
    318 /// INSERT данных из массива c экранированием
    319 function mysql_escaped_insert($table,$array_data)
    320 {
    321         $keys='';
    322         $values='';
    323         foreach($array_data as $id => $data)
    324         {
    325                 if($keys)
    326                 {
    327                         $keys.=', ';
    328                         $values.=', ';
    329                 }
    330                 $keys.='`'.mysql_real_escape_string($id).'`';
    331                 if(is_int($data))       $values.=$data;
    332                 else                    $values.='\''.mysql_real_escape_string($data).'\'';
    333         }
    334         mysql_query("INSERT INTO `$table` ($keys) VALUES ($values)");
    335 }
    336 
    337330// =================================== Аутентификация и контроль привилегий ============================================
    338 /// Требование аутентификации
     331/// @brief Требование аутентификации.
     332///
     333/// Выполняет редирект на страницу аутентификации, если аутентификация не пройдена.
    339334function need_auth()
    340335{
     
    342337        if(!auth())
    343338        {
    344                 $SESSION['last_page']=$ff.$qq;
     339                $_SESSION['last_page']=$_SERVER['REQUEST_URI'];
    345340                $_SESSION['cook_test']='data';
    346341                header('Location: /login.php');
     
    352347}
    353348
    354 // Проверка аутентификации
     349/// Проверка аутентификации
    355350function auth()
    356351{
     
    358353}
    359354
    360 // Получить привилегии (read, write, edit, delete) доступа к указанному объекту.
    361 // Не используется для остальных
    362 // Не рекомендуется к использованию с версии 0.0.1r221
     355/// @brief Получить список привилегий (read, write, edit, delete) доступа к указанному объекту.
     356/// Не используется для остальных.
     357/// @param object Имя объекта, для которого необходимо получить список
     358/// @param uid  ID пользователя, для которого необходимо получить список
     359/// TODO: Устарело. Не рекомендуется к использованию с версии 0.0.1r221. Убрать использование и функцию.
    363360function getright($object,$uid)
    364361{
     362        $bt=debug_backtrace();
     363        trigger_error("Function ".__FUNCTION__." is deprecated (called {$bt[0]['file']}:{$bt[0]['line']}) \n", E_USER_WARNING);
     364        global $db;
    365365        //throw new Exception("Проверка привилений доступа через удаляемую функцию getright($object,$uid)");
    366366        if($uid==1)
     
    372372                return $nxt;
    373373        }
    374         $res=mysql_query("
     374        return $db->query("
    375375        SELECT MAX(`users_grouprights`.`a_read`) AS `read`, MAX(`users_grouprights`.`a_write`) AS `write`, MAX(`users_grouprights`.`a_edit`) AS `edit`, MAX(`users_grouprights`.`a_delete`) AS `delete`
    376376        FROM `users_grouprights`
     
    378378        OR `users_groups`.`uid`='0')
    379379        WHERE `users_grouprights`.`object`='$object'
    380         GROUP BY `users_grouprights`.`object`");
    381 
    382         $nxt=mysql_fetch_assoc($res);
    383         return $nxt;
    384 }
    385 
    386 // Есть ли право доступа к указанному объекту для указанной операции
     380        GROUP BY `users_grouprights`.`object`")->fetch_assoc($res);;
     381}
     382
     383/// Есть ли привилегия доступа к указанному объекту для указанной операции
     384/// @param object Имя объекта, для которого нужно проверить привилегии
     385/// @param action Имя действия, для осуществления которого нужно проверить привилегии
     386/// @param no_redirect Если false - то в случае отсутствия привилегий, и если не пройдена аутентификация, выполняет редирект на страницу аутентификации
    387387function isAccess($object, $action,$no_redirect=false)
    388388{
     389        global $db;
    389390        $uid=@$_SESSION['uid'];
    390391        if($uid==1)     return true;
    391         $res=mysql_query("(
     392        $res=$db->query("(
    392393        SELECT `users_acl`.`id` FROM `users_acl` WHERE `uid`='$uid' AND `object`='$object' AND `action`='$action'
    393394        ) UNION (
     
    401402        UNION(
    402403        SELECT `users_acl`.`id` FROM `users_acl` WHERE `uid`='0' AND `object`='$object' AND `action`='$action')");
    403         if(mysql_errno())       throw new MysqlException("Выборка привилегий не удалась");
    404         $access=(mysql_num_rows($res)>0)?true:false;
     404        if(!$res)       throw new MysqlException("Выборка привилегий не удалась");
     405        $access=($res->num_rows>0)?true:false;
    405406        if((!$uid) && (!$access) && (!$no_redirect))    need_auth();
    406407        return $access;
    407408}
    408409
    409 // Транслитерация
     410/// Транслитерация строки
    410411function translitIt($str)
    411412{
     
    425426        "ы"=>"yi","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya"
    426427    );
    427     return strtr($str,$tr);
     428   
     429    foreach($tr as $s=>$r)
     430        $str=mb_ereg_replace ($s, $r, $str);   
     431    return $str;
    428432}
    429433
     
    431435
    432436// ==================================== Рассылка ===================================================
     437
     438/// @brief Выполнение рассылки сообщения на электронную почту по базе агентов и зарегистрированных пользователей.
     439///
     440/// В текст рассылки автоматически добавляется информация о том, как отказаться от рассылки
     441/// @param tema Тема сообщения
     442/// @param msg Тело сообщения
    433443function SendSubscribe($tema,$msg)
    434444{
    435         global $CONFIG;
    436         $res=mysql_query("SELECT `firm_name` FROM `doc_vars` WHERE `id`='{$CONFIG['site']['default_firm']}'");
    437         if(mysql_errno())       throw new MysqlException("Ошибка получения наименования организации");
    438         $firm_name=mysql_result($res,0,0);
    439         $res=mysql_query("(SELECT `name`, `reg_email`, `real_name` FROM `users` WHERE `reg_email_subscribe`='1' AND `reg_email_confirm`='1')
     445        global $CONFIG, $db;
     446        $res=$db->query("SELECT `firm_name` FROM `doc_vars` WHERE `id`='{$CONFIG['site']['default_firm']}'");
     447        if(!$res)       throw new MysqlException("Ошибка получения наименования организации");
     448        list($firm_name)=$res->fetch_row();
     449        $res=$db->query("(SELECT `name`, `reg_email` AS `email`, `real_name` FROM `users` WHERE `reg_email_subscribe`='1' AND `reg_email_confirm`='1')
    440450        UNION
    441         (SELECT `name`, `email`, `fullname` AS `rname` FROM `doc_agent` WHERE `no_mail`='0' AND `email`!='')
     451        (SELECT `name`, `email`, `fullname` AS `real_name` FROM `doc_agent` WHERE `no_mail`='0' AND `email`!='')
    442452        ");
    443         if(mysql_errno())       throw new MysqlException("Ошибка получения списка подписчиков");
    444         while($nxt=mysql_fetch_row($res))
    445         {
    446                 if($nxt[2])     $nxt[0]="$nxt[2] ($nxt[0])";
     453        if(!$res)       throw new MysqlException("Ошибка получения списка подписчиков");
     454        while($nxt=$res->fetch_assoc($res))
     455        {
     456                if($nxt['real_name'])   $nxt['name']="{$nxt['real_name']} ({$nxt['name']})";
    447457                $txt="
    448 Здравствуйте, $nxt[0]!
     458Здравствуйте, {$nxt['name']}!
    449459
    450460$tema
     
    456466
    457467Вы получили это письмо потому что подписаны на рассылку сайта {$CONFIG['site']['display_name']} ( http://{$CONFIG['site']['name']} ), либо являетесь клиентом $firm_name.
    458 Отказаться от рассылки можно, перейдя по ссылке http://{$CONFIG['site']['name']}/login.php?mode=unsubscribe&email=$nxt[1]
     468Отказаться от рассылки можно, перейдя по ссылке http://{$CONFIG['site']['name']}/login.php?mode=unsubscribe&email={$nxt['email']}
    459469";
    460                 mail($nxt[1],$tema." - {$CONFIG['site']['name']}", $txt ,"Content-type: text/plain; charset=UTF-8\nFrom: {$CONFIG['site']['display_name']} <{$CONFIG['site']['admin_email']}>");
    461         }
    462 }
    463 
     470                mailto($nxt['email'], $tema." - {$CONFIG['site']['name']}", $txt);
     471                //mail($nxt['email'],$tema." - {$CONFIG['site']['name']}", $txt ,"Content-type: text/plain; charset=UTF-8\nFrom: {$CONFIG['site']['display_name']} <{$CONFIG['site']['admin_email']}>");
     472        }
     473}
     474
     475/// Отправляет оповещение администратору сайта по всем доступным каналам связи
     476/// @param text Тело сообщения
     477/// @param subject Тема сообщения
    464478function sendAdmMessage($text,$subject='')
    465479{
     
    468482
    469483        if($CONFIG['site']['doc_adm_email'])
    470                 mailto($CONFIG['site']['doc_adm_email'],$subject ,$text, $from);
     484                mailto($CONFIG['site']['doc_adm_email'],$subject ,$text);
    471485
    472486        if($CONFIG['site']['doc_adm_jid'] && $CONFIG['xmpp']['host'])
     
    475489                {
    476490                        require_once($CONFIG['location'].'/common/XMPPHP/XMPP.php');
    477 
    478                         $xmppclient = new XMPPHP_XMPP( $CONFIG['xmpp']['host'], $CONFIG['xmpp']['port'], $CONFIG['xmpp']['login'], $CONFIG['xmpp']['pass'], 'xmpphp', '', $printlog=false, $loglevel=XMPPHP_Log::LEVEL_INFO);
     491                        $xmppclient = new XMPPHP_XMPP( $CONFIG['xmpp']['host'], $CONFIG['xmpp']['port'], $CONFIG['xmpp']['login'], $CONFIG['xmpp']['pass'], 'xmpphp', '');
    479492                        $xmppclient->connect();
    480493                        $xmppclient->processUntil('session_start');
     
    490503}
    491504
    492 function date_day($date)
    493 {
    494    $ee=date("d M Y 00:00:00",$date);
    495    $tm=strtotime($ee);
    496    return $tm;
    497 }
    498 
     505/// Получить ID цены текущего пользователя
     506function getCurrentUserCost()
     507{
     508        global $db;
     509        if(@$_SESSION['uid'])   $res=$db->query("SELECT `id` FROM `doc_cost` WHERE `vid`='-1'");
     510        else                    $res=$db->query("SELECT `id` FROM `doc_cost` WHERE `vid`='1'");
     511        if(!$res)               throw new MysqlException('Не удалось выбрать цену для пользователя');
     512        if($res->num_rows<1)    throw new Exception("Не найдено связанных с пользователем цен!");
     513        $row=$res->fetch_row();
     514        return $row[0];
     515}
     516
     517
     518/// Загрузка шаблона с заданным названием
    499519function SafeLoadTemplate($template)
    500520{
    501521        global $tmpl, $CONFIG;
    502         if($template)   $tmpl->LoadTemplate($template);
     522        if($template)   $tmpl->loadTemplate($template);
    503523}
    504524
     
    506526function getUserProfile($uid)
    507527{
     528        global $db;
    508529        settype($uid,'int');
    509530        $user_profile=array();
     
    511532        $user_profile['dop']=array();
    512533
    513         $res=mysql_query("SELECT * FROM `users` WHERE `id`='$uid'");
    514         if(mysql_errno())       throw new MysqlException("Не удалось получить основные данные пользователя!");
    515         if(! mysql_num_rows($res))      return $user_profile;   // Если не найден
    516         $user_profile['main']   = mysql_fetch_assoc($res);
     534        $res=$db->query("SELECT * FROM `users` WHERE `id`='$uid'");
     535        if(!$res)       throw new MysqlException("Не удалось получить основные данные пользователя!");
     536        if(!$res->num_rows)     return $user_profile;   // Если не найден
     537        $user_profile['main']   = $res->fetch_assoc();
    517538        unset($user_profile['main']['pass']);   // В целях безопасности
    518539        unset($user_profile['main']['pass_change']);
    519         $rr=mysql_query("SELECT `param`,`value` FROM `users_data` WHERE `uid`='$uid'");
    520         if(mysql_errno())       throw new MysqlException("Не удалось получить дополнительные данные пользователя!");
    521         while($nn=mysql_fetch_row($rr))
     540        $res=$db->query("SELECT `param`,`value` FROM `users_data` WHERE `uid`='$uid'");
     541        if(!$res)       throw new MysqlException("Не удалось получить дополнительные данные пользователя!");
     542        while($nn=$res->fetch_row())
    522543        {
    523544                $user_profile['dop'][$nn[0]]=$nn[1];
    524545        }
    525        
    526546        return $user_profile;
    527547}
     
    536556        var $hide_blocks=array();       ///< Скрытые блоки. Блоки, отображать которые не нужно
    537557
    538         function BETemplate()
     558        function __construct()
    539559        {
    540560                global $CONFIG;
    541                 if($CONFIG['site']['skin'])     $this->LoadTemplate($CONFIG['site']['skin']);
    542                 else                            $this->LoadTemplate('default');
     561                if($CONFIG['site']['skin'])     $this->loadTemplate($CONFIG['site']['skin']);
     562                else                            $this->loadTemplate('default');
    543563        }
    544564        /// Загрузка шаблона по его имени
    545         function LoadTemplate($s)
     565        function loadTemplate($s)
    546566        {
    547567                $this->tplname=$s;
     
    556576
    557577        /// Установить флаг скрытия заданной части страницы
    558         function HideBlock($block)
     578        /// @param block Имя блока страницы
     579        function hideBlock($block)
    559580        {
    560581                $this->hide_blocks[$block]=true;
     
    562583
    563584        /// Снять флаг скрытия заданной части страницы
    564         function ShowBlock($block)
     585        /// @param block Имя блока страницы
     586        function showBlock($block)
    565587        {
    566588                unset($this->hide_blocks[$block]);
     
    568590
    569591        /// Задать HTML содержимое шапки страницы
    570         function SetTop($s)
     592        function setTop($s)
    571593        {
    572594                @$this->page_blocks['top']=$s;
     
    574596
    575597        /// Добавить HTML содержимое в конец шапки страницы
    576         function AddTop($s)
     598        function addTop($s)
    577599        {
    578600                @$this->page_blocks['top'].=$s;
     
    580602
    581603        /// Задать HTML содержимое правой колонки страницы
    582         function SetRight($s)
     604        function setRight($s)
    583605        {
    584606                @$this->page_blocks['right']=$s;
     
    586608
    587609        /// Вставить HTML содержимое в начало правой колонки страницы
    588         function InsRight($s)
     610        function insRight($s)
    589611        {
    590612                @$this->page_blocks['right']=$s.$this->page_blocks['right'];
     
    592614
    593615        /// Добавить HTML содержимое в конец правой колонки страницы
    594         function AddRight($s)
     616        function addRight($s)
    595617        {
    596618                @$this->page_blocks['right'].=$s;
     
    598620
    599621        /// Вставить HTML содержимое в начало левой колонки страницы
    600         function AddLeft($s)
     622        function addLeft($s)
    601623        {
    602624                @$this->page_blocks['left'].=$s;
     
    604626
    605627        /// Задать HTML содержимое левой колонки страницы
    606         function SetLeft($s)
     628        function setLeft($s)
    607629        {
    608630                @$this->page_blocks['left']=$s;
     
    610632
    611633        /// Задать текст заголовка (обычно тэг title) страницы
    612         function SetTitle($s)
     634        function setTitle($s)
    613635        {
    614636                @$this->page_blocks['title']=$s;
     
    616638
    617639        /// Задать содержимое мета-тэга keywords
    618         function SetMetaKeywords($s)
     640        function setMetaKeywords($s)
    619641        {
    620642                @$this->page_blocks['meta_keywords']=$s;
     
    622644
    623645        /// Задать содержимое мета-тэга description
    624         function SetMetaDescription($s)
     646        function setMetaDescription($s)
    625647        {
    626648                @$this->page_blocks['meta_description']=$s;
    627649        }
    628650
     651        /// Задать HTML содержимое основного блока страницы (content)
     652        function setContent($s)
     653        {
     654                @$this->page_blocks['content']=$s;
     655        }
     656
    629657        /// Добавить HTML содержимое к основному блоку страницы (content)
    630         /// Не рекомендуется к использованию. Вместо этого используйте SetContent
    631         /// @sa SetContent
    632         function SetText($s)
    633         {
    634                 @$this->page_blocks['content']=$s;
    635         }
    636 
    637         /// Задать HTML содержимое основного блока страницы (content)
    638         /// Не рекомендуется к использованию. Вместо этого используйте AddContent
    639         /// @sa AddContent
    640         function AddText($s)
     658        function addContent($s)
    641659        {
    642660                @$this->page_blocks['content'].=$s;
    643661        }
    644662
    645         /// Задать HTML содержимое основного блока страницы (content)
    646         function SetContent($s)
    647         {
    648                 @$this->page_blocks['content']=$s;
    649         }
    650 
    651         /// Добавить HTML содержимое к основному блоку страницы (content)
    652         function AddContent($s)
    653         {
    654                 @$this->page_blocks['content'].=$s;
    655         }
    656 
    657663        /// Добавить содержимое к таблице стилей страницы (тэг style)
    658         function AddStyle($s)
     664        function addStyle($s)
    659665        {
    660666                @$this->page_blocks['stylesheet'].=$s;
     
    664670        /// @param block_name Имя блока. Не должно совпадать с именами стандартных блоков.
    665671        /// @param data HTML данные блока
    666         function SetCustomBlockData($block_name, $data)
     672        function setCustomBlockData($block_name, $data)
    667673        {
    668674                @$this->page_blocks[$block_name]=$data;
     
    671677        /// @param block_name Имя блока. Не должно совпадать с именами стандартных блоков.
    672678        /// @param data HTML данные блока
    673         function AddCustomBlockData($block_name, $data)
     679        function addCustomBlockData($block_name, $data)
    674680        {
    675681                @$this->page_blocks[$block_name].=$data;
     
    736742                $time = microtime(true) - $time_start;
    737743                if($time>=3)
    738                         $this->logger("Exec time: $time",1);
     744                        $this->logger("Exec time: $time",1);    /// Записывам ошибку, если скрипт долго работает
    739745        }
    740746
     
    743749        /// @param silent Если TRUE, то сообщение не выводится на страницу. FALSE по умолчанию.
    744750        /// @param hidden_data Скрытый текст сообщения об ошибке. Заносится в журнал, на страницу не выводится.
     751        /// TODO: нужен класс регистрации ошибок, с уровнями ошибок, возможностью записи в файл, отправки на email, jabber, sms и пр.
    745752        function logger($s, $silent=0, $hidden_data='')
    746753        {
    747                 $ip=getenv("REMOTE_ADDR");
    748                 $ag=getenv("HTTP_USER_AGENT");
    749                 $rf=getenv("HTTP_REFERER");
    750                 $ff=$_SERVER['REQUEST_URI'];
    751                 $uid=@$_SESSION['uid'];
    752                 $s=mysql_real_escape_string($s);
    753                 $hidden_data=mysql_real_escape_string($hidden_data);
    754                 $ag=mysql_real_escape_string($ag);
    755                 $rf=mysql_real_escape_string($rf);
    756                 $ff=mysql_real_escape_string($ff);
    757                 mysql_query("INSERT INTO `errorlog` (`page`,`referer`,`msg`,`date`,`ip`,`agent`, `uid`) VALUES
    758                 ('$ff','$rf','$s $hidden_data',NOW(),'$ip','$ag', '$uid')");
     754                global $db;
     755                if(isset($_SESSION['uid']))     $uid=$_SESSION['uid'];
     756                else $uid=0;
     757                settype($uid, "int");
     758                $ip=$db->real_escape_string(getenv("REMOTE_ADDR"));
     759                $s_sql=$db->real_escape_string($s);
     760                $ag=$db->real_escape_string(getenv("HTTP_USER_AGENT"));
     761                $rf=$db->real_escape_string(urldecode(getenv("HTTP_REFERER")));
     762                $ff=$db->real_escape_string($_SERVER['REQUEST_URI']);
     763                $db->query("INSERT INTO `errorlog` (`page`,`referer`,`msg`,`date`,`ip`,`agent`, `uid`) VALUES
     764                ('$ff','$rf','$s_sql',NOW(),'$ip','$ag', '$uid')");
    759765
    760766                if(!$silent)
    761                 $this->msg("$s<br>Страница:$ff<br>Сообщение об ошибке передано администратору","err","Внутренняя ошибка!");
     767                {
     768                        $s=html_out($s);
     769                        $ff=html_out($_SERVER['REQUEST_URI']);
     770                        $this->msg("$s<br>Страница:$ff<br>Сообщение об ошибке передано администратору","err","Внутренняя ошибка!");
     771                }
     772                return $db->insert_id;
    762773        }
    763774};
     
    787798        var $sql_error;
    788799        var $sql_errno;
    789         function __construct($text)
    790         {
    791                 $this->sql_error=mysql_error();
    792                 $this->sql_errno=mysql_errno();
     800        var $db;
     801        function __construct($text,$_db=0)
     802        {
     803                global $db;
     804                if(!$_db)       $_db=$db;
     805                $this->db=$_db;
     806                $this->sql_error=$this->db->error;
     807                $this->sql_errno=$this->db->errno;
    793808                switch($this->sql_errno)
    794809                {
     
    801816
    802817        /// Записывает событие в журнал ошибок
     818        /// TODO: нужен класс регистрации ошибок, с уровнями ошибок, возможностью записи в файл, отправки на email, jabber, sms и пр.
    803819        function WriteLog()
    804820        {
    805                 $ip=getenv("REMOTE_ADDR");
    806                 $ag=getenv("HTTP_USER_AGENT");
    807                 $rf=getenv("HTTP_REFERER");
    808                 $qq=$_SERVER['QUERY_STRING'];
    809                 $ff=$_SERVER['PHP_SELF'];
    810                 $uid=@$_SESSION['uid'];
    811                 $s=mysql_real_escape_string($this->message);
    812                 $hidden_data=mysql_real_escape_string($this->sql_errno).": ".mysql_real_escape_string($this->sql_error);
    813                 $ag=mysql_real_escape_string($ag);
    814                 $rf=mysql_real_escape_string($rf);
    815                 $qq=mysql_real_escape_string($qq);
    816                 $ff=mysql_real_escape_string($ff);
    817                 @mysql_query("INSERT INTO `errorlog` (`page`,`referer`,`msg`,`date`,`ip`,`agent`, `uid`) VALUES
    818                 ('$ff $qq','$rf','$s $hidden_data',NOW(),'$ip','$ag', '$uid')");
     821                global $db;
     822                $uid=@$_SESSION['uid'];
     823                settype($uid,"int");
     824                $ip=$db->real_escape_string(getenv("REMOTE_ADDR"));
     825                $s=$db->real_escape_string(get_class($this).': '.$this->message .' '. $this->sql_errno . ': ' . $this->sql_error);
     826                $ag=$db->real_escape_string(getenv("HTTP_USER_AGENT"));
     827                $rf=$db->real_escape_string(urldecode(getenv("HTTP_REFERER")));
     828                $ff=$db->real_escape_string($_SERVER['REQUEST_URI']);
     829                $db->query("INSERT INTO `errorlog` (`page`,`referer`,`msg`,`date`,`ip`,`agent`, `uid`) VALUES
     830                ('$ff','$rf','$s',NOW(),'$ip','$ag', '$uid')");
    819831        }
    820832};
    821833
    822 global $tmpl;
    823 global $uid;
    824 global $mode;
     834
     835/// Базовый класс для создания автожурналируемых исключений
     836class AutoLoggedException extends Exception
     837{
     838        function __construct($text='')
     839        {
     840                parent::__construct($text);
     841                $this->WriteLog();
     842        }
     843
     844        /// Записывает событие в журнал ошибок
     845        /// TODO: нужен класс регистрации ошибок, с уровнями ошибок, возможностью записи в файл, отправки на email, jabber, sms и пр.
     846        protected function WriteLog()
     847        {
     848                global $db;
     849                $uid=$_SESSION['uid'];
     850                settype($uid,"int");
     851                $ip=$db->real_escape_string(getenv("REMOTE_ADDR"));
     852                $s=$db->real_escape_string (get_class($this).': '.$this->message);
     853                $ag=$db->real_escape_string(getenv("HTTP_USER_AGENT"));
     854                $rf=$db->real_escape_string(urldecode(getenv("HTTP_REFERER")));
     855                $ff=$db->real_escape_string($_SERVER['REQUEST_URI']);
     856                $db->query("INSERT INTO `errorlog` (`page`,`referer`,`msg`,`date`,`ip`,`agent`, `uid`) VALUES
     857                ('$ff','$rf','$s',NOW(),'$ip','$ag', '$uid')");
     858        }
     859};
     860
     861//class DB extends MysqiExtended {
     862//      protected static $_instance;
     863//      private function __construct(){}
     864//      private function __clone() {}
     865//      private function __wakeup() {}
     866//     
     867//      public static function getInstance(){
     868//              if (self::$_instance === null) {
     869//              self::$_instance = new self;   
     870//              }
     871//      return self::$_instance;
     872//      }
     873//};
     874
     875
     876if(!function_exists('mysqli_query'))
     877{
     878        header("HTTP/1.0 500 Internal Server Error");
     879        die("<h1>500 Внутренняя ошибка сервера</h1>Расширение php-mysqli не найдено. Программа установлена некорректно. Обратитесь к администратору c описанием проблемы.");
     880}
     881
     882if(!function_exists('mb_internal_encoding'))
     883{
     884        header("HTTP/1.0 500 Internal Server Error");
     885        die("<h1>500 Внутренняя ошибка сервера</h1>Расширение php-mbstring не найдено. Программа установлена некорректно. Обратитесь к администратору c описанием проблемы.");
     886}
     887
     888$time_start = microtime(true);
     889if(!function_exists('mb_internal_encoding'))
     890{
     891        header("HTTP/1.0 500 Internal Server Error");
     892        die("<h1>500 Внутренняя ошибка сервера</h1>Расширение mbstring не установлено! Программа установлена некорректно. Обратитесь к администратору c описанием проблемы.");
     893}
     894
     895session_start();
     896mb_internal_encoding("UTF-8");
     897
     898$base_path = dirname(dirname(__FILE__));
     899if(! include_once("$base_path/config_site.php"))
     900{
     901        header("HTTP/1.0 500 Internal Server Error");
     902        die("<h1>500 Внутренняя ошибка сервера</h1>Конфигурационный файл не найден! Программа установлена некорректно. Обратитесь к администратору c описанием проблемы.");
     903}
     904
     905include_once($CONFIG['location']."/common/core.common.php");
     906
     907if($CONFIG['site']['force_https'])
     908        header('Location: https://'.$_SERVER["HTTP_HOST"].$_SERVER['REQUEST_URI'], true, 301);
     909
     910if(!isset($CONFIG['site']['display_name']))     $CONFIG['site']['display_name']=$CONFIG['site']['name'];
     911
     912
     913
     914$db = @ new MysqiExtended($CONFIG['mysql']['host'], $CONFIG['mysql']['login'], $CONFIG['mysql']['pass'], $CONFIG['mysql']['db']);
     915
     916
     917
     918if($db->connect_error)
     919{
     920        header("HTTP/1.0 503 Service temporary unavariable");
     921        die("<h1>503 Сервис временно недоступен!</h1>Не удалось соединиться с сервером баз данных. Возможно он перегружен, и слишком медленно отвечает на запросы, либо выключен. Попробуйте подключиться через 5 минут. Если проблема сохранится - пожалуйста, напишите письмо <a href='mailto:{$CONFIG['site']['admin_email']}'>{$CONFIG['site']['admin_email']}</a> c описанием проблемы: ErrorCode: {$db->connect_errno} ({$db->connect_error})");
     922}
     923
     924// Включаем автоматическую генерацию исключений для mysql
     925mysqli_report(MYSQLI_REPORT_STRICT | MYSQLI_REPORT_ERROR);
     926
     927if(!$db->set_charset("utf8"))
     928{
     929    header("HTTP/1.0 503 Service temporary unavariable");
     930    die("<h1>503 Сервис временно недоступен!</h1>Невозможно задать кодировку соединения с базой данных: ".$db->error);
     931}
     932
     933
     934// m_ysql_query("SET CHARACTER SET UTF8");
     935// m_ysql_query("SET character_set_client = UTF8");
     936// m_ysql_query("SET character_set_results = UTF8");
     937// m_ysql_query("SET character_set_connection = UTF8");
     938
     939header("X-Powered-By: MultiMag ".MULTIMAG_VERSION);
     940
     941/// TODO: Убрать обращения этих переменных из других файлов, и сделать их локальными
     942$tim=time();
     943$ip=$db->real_escape_string(getenv("REMOTE_ADDR"));
     944$ag=$db->real_escape_string(getenv("HTTP_USER_AGENT"));
     945$rf=$db->real_escape_string(urldecode(getenv("HTTP_REFERER")));
     946$qq=$db->real_escape_string(urldecode($_SERVER['REQUEST_URI'].'?'.$_SERVER['QUERY_STRING']));
     947$ff=$db->real_escape_string($_SERVER['SCRIPT_NAME']);
     948
     949if(!isset($_REQUEST['ncnt']))
     950{
     951        $db->query("INSERT INTO `counter` (`date`,`ip`,`agent`,`refer`,`query`,`file`) VALUES ('$tim','$ip','$ag','$rf','$qq','$ff')");
     952}
     953
     954/// TODO: Пересмотреть принцип работы со скидками
     955$skidka="";
     956
    825957$tmpl=new BETemplate;
    826958
     
    831963/// Нужно вычистить глобальную переменную UID везде
    832964if(isset($_SESSION['uid']))     $uid=$_SESSION['uid'];
    833 if($uid=='') $uid=0;
     965else                            $uid=0;
    834966
    835967/// Должно быть убрано, должно подключаться и создаваться по необходимости
  • web/counter.php

    r03d943c rb490b46  
    22//      MultiMag v0.1 - Complex sales system
    33//
    4 //      Copyright (C) 2005-2010, BlackLight, TND Team, http://tndproject.org
     4//      Copyright (C) 2005-2013, BlackLight, TND Team, http://tndproject.org
    55//
    66//      This program is free software: you can redistribute it and/or modify
     
    2020require_once("../config_site.php");
    2121
    22 if(!@mysql_connect($CONFIG['mysql']['host'],$CONFIG['mysql']['login'],$CONFIG['mysql']['pass']))
     22$db = @ new mysqli($CONFIG['mysql']['host'], $CONFIG['mysql']['login'], $CONFIG['mysql']['pass'], $CONFIG['mysql']['db']);
     23if($db->connect_error)
    2324{
    24         //echo"<h1>503 Сервис временно недоступен!</h1>Не удалось соединиться с сервером баз данных. Возможно он перегружен, и слишком медленно отвечает на запросы, либо выключен. Попробуйте подключиться через 5 минут. Если проблема сохранится - пожалуйста, напишите письмо по адресу <a href='mailto:{$CONFIG['site']['admin_email']}'>{$CONFIG['site']['admin_email']}</a> c описанием проблемы.";
     25        header("HTTP/1.0 503 Service temporary unavariable");
    2526        exit();
    2627}
    27 if(!@mysql_select_db($CONFIG['mysql']['db']))
     28
     29if(!$db->set_charset("utf8"))
    2830{
    29     //echo"Невозможно активизировать базу данных! Возможно, база данных повреждена. Попробуйте подключиться через 5 минут. Если проблема сохранится - пожалуйста, напишите письмо по адресу <a href='mailto:{$CONFIG['site']['admin_email']}'>{$CONFIG['site']['admin_email']}</a> c описанием проблемы.";
    30     exit();
     31        header("HTTP/1.0 503 Service temporary unavariable");
     32        exit();
    3133}
    32 
    33 mysql_query("SET CHARACTER SET UTF8");
    34 mysql_query("SET character_set_results = UTF8");
    35 
    36 $ip=getenv("REMOTE_ADDR");
    37 $ag=getenv("HTTP_USER_AGENT");
    38 $rf=getenv("HTTP_REFERER");
    39 $qq=$_SERVER['QUERY_STRING'];
    40 $ff=$_SERVER['PHP_SELF'];
    41 $tim=time();
    42 $skidka="";
    4334
    4435$cc=@$_GET['cc'];
     
    4839$tim=time();
    4940$tt=$tim-60*60*24;
    50 $res=mysql_query("SELECT `id` FROM `counter` WHERE `date`>'$tt'");
    51 echo mysql_error();
    52 $all=mysql_num_rows($res);
    53 $res=mysql_query("SELECT `id` FROM `counter` WHERE `date`>'$tt' GROUP by `ip`");
    54 $pip=mysql_num_rows($res);
     41$res=$db->query("SELECT `id` FROM `counter` WHERE `date`>'$tt'");
     42$all=$res->num_rows;
     43$res=$db->query("SELECT `id` FROM `counter` WHERE `date`>'$tt' GROUP by `ip`");
     44$pip=$res->num_rows;
    5545$tt=$tim-60*60*24*7;
    56 $res=mysql_query("SELECT `id` FROM `counter` WHERE `date`>'$tt' GROUP by `ip`");
    57 $ww=mysql_num_rows($res);
    58 $res=mysql_query("SELECT `id` FROM `counter` WHERE `date`>'$tt'");
    59 $aw=mysql_num_rows($res);
     46$res=$db->query("SELECT `id` FROM `counter` WHERE `date`>'$tt' GROUP by `ip`");
     47$ww=$res->num_rows;
     48$res=$db->query("SELECT `id` FROM `counter` WHERE `date`>'$tt'");
     49$aw=$res->num_rows;
    6050
    6151
  • web/css/doc_script.js

    r03d943c rb490b46  
    439439                error:   function() { jAlert('Ошибка соединения!','Сохранение данных',null,'icon_err'); },
    440440        });
     441}
     442
     443function PrintMenu(event,doc)
     444{
     445        var menu=CreateContextMenu(event);
     446        function pickItem(event)
     447        {
     448                var fname=event.target.fname;
     449                menu.parentNode.removeChild(menu);
     450                window.location="/doc.php?mode=print&doc="+doc+"&opt="+fname;
     451        }
     452
     453        function rcvDataSuccess(msg)
     454        {
     455                try
     456                {
     457                        var json=eval('('+msg+')');
     458                        if(json.response=='err')
     459                        {
     460                                jAlert(json.text,"Ошибка", {}, 'icon_err');
     461                                menu.parentNode.removeChild(menu);
     462                        }
     463                        else if(json.response=='item_list')
     464                        {
     465                                menu.innerHTML=''
     466                                fax_number=json.faxnum
     467                                for(var i=0;i<json.content.length;i++)
     468                                {
     469                                        var elem=document.createElement('div')
     470                                        elem.innerHTML=json.content[i].desc
     471                                        elem.fname=json.content[i].name
     472                                        elem.onclick=pickItem
     473                                        menu.appendChild(elem)
     474                                }
     475                        }
     476                        else
     477                        {
     478                                jAlert("Обработка полученного сообщения не реализована<br>"+msg, "Печать", {},  'icon_err');
     479                                menu.parentNode.removeChild(menu)
     480                        }
     481                }
     482                catch(e)
     483                {
     484                        jAlert("Критическая ошибка!<br>Если ошибка повторится, уведомите администратора о том, при каких обстоятельствах возникла ошибка!"+
     485                        "<br><br><i>Информация об ошибке</i>:<br>"+e.name+": "+e.message+"<br>"+msg, "Печать", {},  'icon_err');
     486                        menu.parentNode.removeChild(menu)
     487                }
     488        }
     489
     490        $.ajax({
     491                type:   'GET',
     492               url:    '/doc.php',
     493               data:   'mode=fax&doc='+doc,
     494               success: function(msg) { rcvDataSuccess(msg) },
     495               error:   function() { jAlert('Ошибка соединения!','Печать',{},'icon_err'); menu.parentNode.removeChild(menu);},
     496        });
     497        return false
    441498}
    442499
  • web/css/poseditor.js

    r03d943c rb490b46  
    134134                if(poslist.editable)    linehtml+="<input type='text' name='sum' value='"+sum+"'>"
    135135                else                    linehtml+=sum
    136                 linehtml+="</td><td>"+data.sklad_cnt+"</td><td>"+data.mesto+"</td>"
     136                linehtml+="</td><td>"+data.sklad_cnt+"</td><td>"+data.place+"</td>"
    137137                if(poslist.show_column['sn']>0) linehtml+="<td id='sn"+row.lineIndex+"'>"+data.sn+"</td>"
    138138                if(poslist.show_column['gtd']>0)linehtml+="<td id='gtd"+row.lineIndex+"'>"+data.gtd+"</td>"
     
    669669                pos_sum.innerHTML=data.cost*data.cnt
    670670                pos_sklad_cnt.innerHTML=data.sklad_cnt
    671                 pos_mesto.innerHTML=data.mesto
     671                pos_mesto.innerHTML=data.place
    672672                if(data.line_id>0)      $('#pladd').addClass('error')
    673673        }
  • web/doc.php

    r03d943c rb490b46  
    22//      MultiMag v0.1 - Complex sales system
    33//
    4 //      Copyright (C) 2005-2010, BlackLight, TND Team, http://tndproject.org
     4//      Copyright (C) 2005-2013, BlackLight, TND Team, http://tndproject.org
    55//
    66//      This program is free software: you can redistribute it and/or modify
     
    2323SafeLoadTemplate($CONFIG['site']['inner_skin']);
    2424
    25 $tmpl->HideBlock('left');
     25$tmpl->hideBlock('left');
     26$mode = request('mode');
     27$doc = rcvint("doc");
    2628
    27 $GLOBALS['m_left']=0;
    28 $mode=rcv('mode');
    29 $doc=rcvint("doc");
    30 
    31 $tmpl->AddTop("
    32 <script src='/css/jquery/jquery.js' type='text/javascript'></script>
     29$tmpl->addTop("
     30<script type='text/javascript' src='/css/jquery/jquery.js'></script>
    3331<script type='text/javascript' src='/css/jquery/jquery.autocomplete.js'></script>
     32<script type='text/javascript' src='/css/jquery/jquery.alerts.js'></script>
    3433<script type='text/javascript' src='/css/doc_script.js'></script>
    35 
    36 <!-- Core files -->
    37 <script src='/css/jquery/jquery.alerts.js' type='text/javascript'></script>
    38 <link href='/css/jquery/jquery.alerts.css' rel='stylesheet' type='text/css' media='screen' />
     34<link href='/css/jquery/jquery.alerts.css' rel='stylesheet' type='text/css' media='screen'>
    3935");
    4036
    4137try
    4238{
    43 if($mode=="")
    44 {
    45         doc_menu();
    46         $tmpl->AddText("<h1>Создание нового документа</h1><h3>Выберите тип документа</h3><ul>");
    47         $res=mysql_query("SELECT `id`, `name` FROM `doc_types` ORDER BY `name`");
    48         while($nxt=mysql_fetch_row($res))
     39        if($mode=="")
    4940        {
    50                 $tmpl->AddText("<li><a href='?mode=new&amp;type=$nxt[0]'>$nxt[1]</a></li>");
     41                doc_menu();
     42                $tmpl->addContent("<h1>Создание нового документа</h1><h3>Выберите тип документа</h3><ul>");
     43                $res=$db->query("SELECT `id`, `name` FROM `doc_types` ORDER BY `name`");
     44                while($nxt=$res->fetch_row())
     45                {
     46                        $tmpl->addContent("<li><a href='?mode=new&amp;type=$nxt[0]'>".html_out($nxt[1])."</a></li>");
     47                }
     48                $tmpl->addContent("</ul>");
    5149        }
    52         $tmpl->AddText("</ul>");
     50        else if($mode=='new')
     51        {
     52                $type=rcvint('type');
     53                $document=AutoDocumentType($type, 0);
     54                $document->head();
     55        }
     56        else if($mode=="heads")
     57        {
     58                if(!$doc)
     59                {
     60                        $type= request('type');
     61                        $document = AutoDocumentType($type, 0);
     62                }
     63                else    $document=AutoDocument($doc);
     64                $document->head_submit($doc);
     65        }
     66        else if($mode=="jheads")
     67        {
     68                if(!$doc)
     69                {
     70                        $type= request('type');
     71                        $document=AutoDocumentType($type, 0);
     72                }
     73                else    $document=AutoDocument($doc);
     74                $document->json_head_submit($doc);
     75        }
     76        else if($mode=="ehead")
     77        {
     78                $document=AutoDocument($doc);
     79                $document->head($doc);
     80        }
     81        else if($mode=="body")
     82        {
     83                $document=AutoDocument($doc);
     84                $document->body($doc);
     85        }
     86        else if($mode=="srv")
     87        {
     88                $document=AutoDocument($doc);
     89                $document->Service($doc);
     90        }
     91        else if($mode=='applyj')
     92        {
     93                $document=AutoDocument($doc);
     94                $tmpl->ajax=1;
     95                $tmpl->setContent($document->ApplyJson());
     96        }
     97        else if($mode=='cancelj')
     98        {
     99                $document=AutoDocument($doc);
     100                $tmpl->ajax=1;
     101                $tmpl->setContent($document->CancelJson());
     102        }
     103        else if($mode=='conn')
     104        {
     105                $document=AutoDocument($doc);
     106                $tmpl->ajax=1;
     107                $p_doc=rcvint('p_doc');
     108                $tmpl->setContent($document->ConnectJson($p_doc));
     109        }
     110        else if($mode=='forcecancel')
     111        {
     112                $document=AutoDocument($doc);
     113                $document->ForceCancel();
     114        }
     115        else if($mode=='print')
     116        {
     117                $document=AutoDocument($doc);
     118                $opt=request('opt');
     119                $document->PrintForm($opt);
     120        }
     121        else if($mode=='fax')
     122        {
     123                $document=AutoDocument($doc);
     124                $opt=request('opt');
     125                $document->SendFax($opt);
     126        }
     127        else if($mode=='email')
     128        {
     129                $document=AutoDocument($doc);
     130                $opt=request('opt');
     131                $document->SendEmail($opt);
     132        }
     133        else if($mode=='morphto')
     134        {
     135                $document=AutoDocument($doc);
     136                $target_type=request('tt');
     137                $document->MorphTo($target_type);
     138        }
     139        else if($mode=='getinfo')
     140        {
     141                $document=AutoDocument($doc);
     142                $document->GetInfo();
     143        }
     144        else if($mode=="incnum")
     145        {
     146                $tmpl->ajax=1;
     147                $type=request('type');
     148                $sub=request('sub');
     149                $date=rcvdate('date');
     150                $firm=rcvint('firm');
     151                if(!$doc)
     152                {
     153                        $document=AutoDocumentType($type, 0);
     154                }
     155                else    $document=AutoDocument($doc);
     156
     157                $altnum=$document->getNextAltNum($type,$sub,$date,$firm);
     158                echo "$altnum";
     159                exit(0);
     160        }
     161        else $tmpl->msg("ERROR $mode","err");
    53162}
    54 else if($mode=='new')
    55 {
    56         $type=rcvint('type');
    57         $document=AutoDocumentType($type, 0);
    58         $document->head();
    59 }
    60 else if($mode=="heads")
    61 {
    62         if(!$doc)
    63         {
    64                 $type=rcv('type');
    65                 $document=AutoDocumentType($type, 0);
    66         }
    67         else    $document=AutoDocument($doc);
    68         $document->head_submit($doc);
    69 }
    70 else if($mode=="jheads")
    71 {
    72         if(!$doc)
    73         {
    74                 $type=rcv('type');
    75                 $document=AutoDocumentType($type, 0);
    76         }
    77         else    $document=AutoDocument($doc);
    78         $document->json_head_submit($doc);
    79 }
    80 else if($mode=="ehead")
    81 {
    82         $document=AutoDocument($doc);
    83         $document->head($doc);
    84 }
    85 else if($mode=="body")
    86 {
    87         $document=AutoDocument($doc);
    88         $document->body($doc);
    89 }
    90 else if($mode=="srv")
    91 {
    92         $document=AutoDocument($doc);
    93         $document->Service($doc);
    94 }
    95 else if($mode=='applyj')
    96 {
    97         $document=AutoDocument($doc);
    98         $tmpl->ajax=1;
    99         $tmpl->SetText($document->ApplyJson());
    100 }
    101 else if($mode=='cancelj')
    102 {
    103         $document=AutoDocument($doc);
    104         $tmpl->ajax=1;
    105         $tmpl->SetText($document->CancelJson());
    106 }
    107 else if($mode=='conn')
    108 {
    109         $document=AutoDocument($doc);
    110         $tmpl->ajax=1;
    111         $p_doc=rcv('p_doc');
    112         $tmpl->SetText($document->ConnectJson($p_doc));
    113 }
    114 else if($mode=='forcecancel')
    115 {
    116         $document=AutoDocument($doc);
    117         $document->ForceCancel();
    118 }
    119 else if($mode=='print')
    120 {
    121         $document=AutoDocument($doc);
    122         $opt=rcv('opt');
    123         $document->PrintForm($doc, $opt);
    124 }
    125 else if($mode=='fax')
    126 {
    127         $document=AutoDocument($doc);</