1
Changeset 3ff8da1 – MultiMag

Changeset 3ff8da1


Ignore:
Timestamp:
Apr 2, 2015, 5:55:15 PM (8 years ago)
Author:
Blacklight <blacklight@…>
Branches:
master
Children:
d218185
Parents:
9bc0e68
Message:
  • Добавлено ограничение входа с нескольких устройств
  • Разработка асинхронного расчёта зарплаты (в процессе)
  • разработка синхронизации с 1с (в процессе)
Files:
5 added
20 edited

Legend:

Unmodified
Added
Removed
  • cli/async.php

    r9bc0e68 r3ff8da1  
    2727
    2828try {
    29         $res = $db->query("SELECT `id`, `task` FROM `async_workers_tasks` WHERE `needrun`=1 LIMIT 1");
    30         while ($ainfo = $res->fetch_assoc()) {
    31                 $db->query("UPDATE `async_workers_tasks` SET `needrun`=0, `textstatus`='Запускается' WHERE `id`='{$ainfo['id']}'");
    32                 require_once($CONFIG['location'] . "/common/async/" . strtolower($ainfo['task']) . ".php");
    33                 $classname = $ainfo['task'] . "Worker";
    34                 $worker = new $classname($ainfo['id']);
    35                 $worker->run();
    36                 $worker->end();
    37         }
     29    $res = $db->query("SELECT `id`, `task` FROM `async_workers_tasks` WHERE `needrun`=1 LIMIT 1");
     30    while ($ainfo = $res->fetch_assoc()) {
     31        $db->query("UPDATE `async_workers_tasks` SET `needrun`=0, `textstatus`='Запускается' WHERE `id`='{$ainfo['id']}'");
     32        require_once($CONFIG['location'] . "/common/async/" . strtolower($ainfo['task']) . ".php");
     33        $classname = $ainfo['task'];
     34        $worker = new $classname($ainfo['id']);
     35        $worker->run();
     36        $worker->end();
     37    }
     38} catch (Exception $e) {
     39    if ($worker) {
     40        try {
     41            $worker->finalize();
     42        } catch (Exception $e) {
     43            echo $e->getMessage() . "\n";
     44            $db->query("UPDATE `async_workers_tasks` SET `needrun`=0, `textstatus`='" . $e->getMessage() . "' WHERE `id`='{$ainfo['id']}'");
     45        }
     46    }
     47    echo $e->getMessage();
     48    $db->query("UPDATE `async_workers_tasks` SET `needrun`=0, `textstatus`='" . $db->real_escape_string($e->getMessage()) . "' WHERE `id`='{$ainfo['id']}'");
    3849}
    39 catch (Exception $e) {
    40         if ($worker) {
    41                 try {
    42                         $worker->finalize();
    43                 } catch (Exception $e) {
    44                         echo $e->getMessage() . "\n";
    45                         $db->query("UPDATE `async_workers_tasks` SET `needrun`=0, `textstatus`='" . $e->getMessage() . "' WHERE `id`='{$ainfo['id']}'");
    46                 }
    47         }
    48         echo $e->getMessage();
    49         $db->query("UPDATE `async_workers_tasks` SET `needrun`=0, `textstatus`='" . $db->real_escape_string($e->getMessage()) . "' WHERE `id`='{$ainfo['id']}'");
    50 }
    51 
    52 ?>
  • cli/db_optimize.php

    r9bc0e68 r3ff8da1  
    2626require_once($CONFIG['location']."/common/async/dbcheck.php");
    2727try {
    28         $worker = new DbCheckWorker(0);
     28        $worker = new dbcheck(0);
    2929        $worker->run();
    3030} catch (Exception $e) {
  • cli/ps_parser.php

    r9bc0e68 r3ff8da1  
    2626
    2727try {
    28         $worker=new PsParserWorker(0);
     28        $worker=new psparser(0);
    2929        $worker->run();
    3030}
  • common/async/dbcheck.php

    r9bc0e68 r3ff8da1  
    2424
    2525/// Ассинхронный обработчик. Перепроводка документов и перерасчёт контрольных значений в таблицах базы данных.
    26 class DbCheckWorker extends AsyncWorker {
     26class dbcheck extends AsyncWorker {
    2727
    2828        function getDescription() {
     
    103103                                $buy_time = date("Y-m-d H:i:s", $doc_info[0]);
    104104                                //echo "$buy_time\n";
     105                                break;
    105106                            }
    106107                            $db->query("INSERT INTO `buytime_tmp` VALUES ({$pos_data[0]}, '$buy_time')");
  • common/async/psparser.php

    r9bc0e68 r3ff8da1  
    2424
    2525/// Ассинхронный обработчик. Анализ статистики переходов на сайт и выборка информации о переходах с поисковиков, и текстах запросов
    26 class PsParserWorker extends AsyncWorker {
     26class psparser extends AsyncWorker {
    2727
    28         function getDescription() {
    29                 return "Анализ статистики переходов на сайт и выборка информации о переходах с поисковиков";
    30         }
     28    function getDescription() {
     29        return "Анализ статистики переходов на сайт и выборка информации о переходах с поисковиков";
     30    }
    3131
    32         function run() {
    33                 global $CONFIG, $db;
     32    function run() {
     33        global $CONFIG, $db;
    3434
    35                 $res = $db->query("select `data` from `ps_parser` where `parametr` = 'last_time_counter'");
     35        $res = $db->query("select `data` from `ps_parser` where `parametr` = 'last_time_counter'");
    3636
    37                 if ($last_time_counter = $res->fetch_row()) {
    38                         $last_time_counter = intval($last_time_counter[0]);
     37        if ($last_time_counter = $res->fetch_row()) {
     38            $last_time_counter = intval($last_time_counter[0]);
    3939
    40                         $refer_query = "select `date`, `refer` from `counter` where `date`>'$last_time_counter' and ( ";
    41                         $refer_query_first_like = true;
    42                         $ps_settings = $db->query("select `id`, `name`, `template`, `template_like` from `ps_settings` order by `prioritet`");
    43                         while ($ps_settings_data = $ps_settings->fetch_row()) {
    44                                 if ($refer_query_first_like)
    45                                         $refer_query .= "`refer` like '" . $ps_settings_data[3] . "'";
    46                                 else
    47                                         $refer_query .= " or `refer` like '" . $ps_settings_data[3] . "'";
    48                                 $refer_query_first_like = false;
    49                         }
    50                         $refer_query .= " )";
     40            $refer_query = "select `date`, `refer` from `counter` where `date`>'$last_time_counter' and ( ";
     41            $refer_query_first_like = true;
     42            $ps_settings = $db->query("select `id`, `name`, `template`, `template_like` from `ps_settings` order by `prioritet`");
     43            while ($ps_settings_data = $ps_settings->fetch_row()) {
     44                if ($refer_query_first_like)
     45                    $refer_query .= "`refer` like '" . $ps_settings_data[3] . "'";
     46                else
     47                    $refer_query .= " or `refer` like '" . $ps_settings_data[3] . "'";
     48                $refer_query_first_like = false;
     49            }
     50            $refer_query .= " )";
    5151
    52                         $refer_query = $db->query($refer_query);
    53                         while ($refer_query_data = $refer_query->fetch_row()) {
    54                                 //$str= urldecode ($refer_query_data[1]); // Договорились сразу писать декодированные рефы, так что это должно быть ненужным
    55                                 $str = $refer_query_data[1];
    56                                 //$str = iconv("UTF-8", "cp1251", $str); // У меня в локале были проблемы, так что тоже может быть ненужным
     52            $refer_query = $db->query($refer_query);
     53            while ($refer_query_data = $refer_query->fetch_row()) {
     54                //$str= urldecode ($refer_query_data[1]); // Договорились сразу писать декодированные рефы, так что это должно быть ненужным
     55                $str = $refer_query_data[1];
     56                //$str = iconv("UTF-8", "cp1251", $str); // У меня в локале были проблемы, так что тоже может быть ненужным
    5757
    58                                 $str = trim($str);
    59                                 //echo $str."\n";
     58                $str = trim($str);
     59                //echo $str."\n";
    6060
    61                                 $last_time_counter = intval($refer_query_data[0]);
     61                $last_time_counter = intval($refer_query_data[0]);
    6262
    63                                 $true_ref = false;
     63                $true_ref = false;
    6464
    65                                 $ps_settings = $db->query("select `id`, `name`, `template`, `template_like` from `ps_settings` order by `prioritet`"); // Избыточность: под каждый запрос мы постоянно запрашиваем одни и теже данные по шаблонам ПС, хотя мы их запросили в 44 строке, но не нашел как после прохода mysql _fetch_row возвращать маркер на первую строчку
    66                                 while ($ps_settings_data = $ps_settings->fetch_row()) {
    67                                         preg_match($ps_settings_data[2], $str, $matches);
    68                                         if (count($matches) > 0) {
    69                                                 //echo "\n";
    70                                                 //print_r($matches);
    71                                                 //echo "\nПоисковик: ".$ps_settings_data[1]."\n";
     65                $ps_settings = $db->query("select `id`, `name`, `template`, `template_like` from `ps_settings` order by `prioritet`"); // Избыточность: под каждый запрос мы постоянно запрашиваем одни и теже данные по шаблонам ПС, хотя мы их запросили в 44 строке, но не нашел как после прохода mysql _fetch_row возвращать маркер на первую строчку
     66                while ($ps_settings_data = $ps_settings->fetch_row()) {
     67                    preg_match($ps_settings_data[2], $str, $matches);
     68                    if (count($matches) > 0) {
     69                        //echo "\n";
     70                        //print_r($matches);
     71                        //echo "\nПоисковик: ".$ps_settings_data[1]."\n";
    7272
    73                                                 $true_ref = true;
     73                        $true_ref = true;
    7474
    75                                                 $matches = trim($db->real_escape_string($matches[1]));
    76                                                 if ($matches == '' || $matches == '\"') {
    77                                                         echo "Пустой результат (" . $matches . "): " . $str . "\n";
    78                                                         continue;
    79                                                 }
    80                                                 echo "Добавлено: " . $matches . "\n";
    81                                                 if ($ps_query_data = $db->query("select `id` from `ps_query` where `query`='$matches'")->fetch_row()) {
    82                                                         //echo "Запрос найден в БД\n";
    83                                                 } else {
    84                                                         //echo "Запроса нет, добавляем в БД\n";
    85                                                         $db->query("INSERT INTO `ps_query` (`query`) VALUES ('$matches')");
    86                                                         $ps_query_data = $db->query("select `id` from `ps_query` where `query`='$matches'")->fetch_row();
    87                                                 }
     75                        $matches = trim($db->real_escape_string($matches[1]));
     76                        if ($matches == '' || $matches == '\"') {
     77                            echo "Пустой результат (" . $matches . "): " . $str . "\n";
     78                            continue;
     79                        }
     80                        echo "Добавлено: " . $matches . "\n";
     81                        if ($ps_query_data = $db->query("select `id` from `ps_query` where `query`='$matches'")->fetch_row()) {
     82                            //echo "Запрос найден в БД\n";
     83                        } else {
     84                            //echo "Запроса нет, добавляем в БД\n";
     85                            $db->query("INSERT INTO `ps_query` (`query`) VALUES ('$matches')");
     86                            $ps_query_data = $db->query("select `id` from `ps_query` where `query`='$matches'")->fetch_row();
     87                        }
    8888
    89                                                 if ($db->query("select `counter` from `ps_counter` where `date`='" . date('Y-m-d', $last_time_counter) . "' and `query`='" . $ps_query_data[0] . "' and `ps`='" . $ps_settings_data[0] . "'")->fetch_row()) {
    90                                                         //echo "Счетчик найден в БД\n";
    91                                                         $db->query("UPDATE `ps_counter` SET `counter`=`counter`+1 WHERE `date`='" . date('Y-m-d', $last_time_counter) . "' AND `query`='" . $ps_query_data[0] . "' AND `ps`='" . $ps_settings_data[0] . "'");
    92                                                 } else {
    93                                                         //echo "Счетчик не найден в БД\n";
    94                                                         $db->query("INSERT INTO `ps_counter` (`date`,`query`,`ps`,`counter`) VALUES ('" . date('Y-m-d', $last_time_counter) . "','" . $ps_query_data[0] . "','" . $ps_settings_data[0] . "','1')");
    95                                                 }
    96                                                 break;
    97                                         }
    98                                 }
    99                                 if (!$true_ref)         echo "Нет регулярки: " . $str . "\n";
    100                         }
    101                         $db->query("UPDATE `ps_parser` SET `data`='$last_time_counter' WHERE `parametr`='last_time_counter'");
    102                 }
    103         }
     89                        if ($db->query("select `counter` from `ps_counter` where `date`='" . date('Y-m-d', $last_time_counter) . "' and `query`='" . $ps_query_data[0] . "' and `ps`='" . $ps_settings_data[0] . "'")->fetch_row()) {
     90                            //echo "Счетчик найден в БД\n";
     91                            $db->query("UPDATE `ps_counter` SET `counter`=`counter`+1 WHERE `date`='" . date('Y-m-d', $last_time_counter) . "' AND `query`='" . $ps_query_data[0] . "' AND `ps`='" . $ps_settings_data[0] . "'");
     92                        } else {
     93                            //echo "Счетчик не найден в БД\n";
     94                            $db->query("INSERT INTO `ps_counter` (`date`,`query`,`ps`,`counter`) VALUES ('" . date('Y-m-d', $last_time_counter) . "','" . $ps_query_data[0] . "','" . $ps_settings_data[0] . "','1')");
     95                        }
     96                        break;
     97                    }
     98                }
     99                if (!$true_ref)
     100                    echo "Нет регулярки: " . $str . "\n";
     101            }
     102            $db->query("UPDATE `ps_parser` SET `data`='$last_time_counter' WHERE `parametr`='last_time_counter'");
     103        }
     104    }
    104105
    105         function finalize() {
    106         }
     106    function finalize() {
     107       
     108    }
    107109
    108110}
    109 
    110 ;
    111 ?>
  • common/asyncworker.php

    r9bc0e68 r3ff8da1  
    6060        }
    6161
    62 };
     62}
    6363
    6464
    65 ?>
  • common/core.common.php

    r9bc0e68 r3ff8da1  
    1818//
    1919
    20 define("MULTIMAG_REV", "750");
     20define("MULTIMAG_REV", "760");
    2121define("MULTIMAG_VERSION", "0.2.".MULTIMAG_REV);
    2222
     
    286286    /// @param key_value        Значение ключа, по которому производится выборка. Будет приведено к целому типу.
    287287    /// @param array    Массив со значениями, содержащими имена полей
    288     /// @return                 В случае успеха возвращает ассоциативный массив с данными. В случае sql ошибки вернёт false. В случае, если искомого значения нет в таблице, вернет пустую строку для такого значения
     288    /// @return                 В случае успеха возвращает ассоциативный массив с данными. В случае, если искомого значения нет в таблице, вернет пустую строку для такого значения
    289289    function selectFieldKA($table, $key_name, $key_value, $array) {
    290290        settype($key_value, 'int');
    291291        $a = array_fill_keys($array, '');
    292292        $res = $this->query('SELECT `param`, `value` FROM `' . $table . '` WHERE `' . $key_name . '`=' . $key_value);
    293         if (!$res) {
    294             return false;
    295         }
    296293        while ($line = $res->fetch_row()) {
    297294            if (array_key_exists($line[0], $a)) {
     
    415412
    416413}
     414
     415/// @brief Возвращает строку с информацией о различиях между двумя наборами данных в массивах
     416/// Массив new должен содержать все индексы массива old
     417/// Используется для внесения информации в журнал
     418/// @param old  Старый набор данных (массив)
     419/// @param new  Новый набор данных (массив)
     420function getCompareStr($old, $new) {
     421    $ret = '';
     422    foreach ($old as $key => $value) {
     423        if ($new[$key] !== $value) {
     424            if ($ret)
     425                $ret.=", $key: ( $value => {$new[$key]})";
     426            else {
     427                $ret = ", $key: ( $value => {$new[$key]})";
     428            }
     429        }
     430    }
     431    return $ret;
     432}
  • db_struct.sql

    r9bc0e68 r3ff8da1  
    167167UNLOCK TABLES;
    168168
     169
     170
     171DROP TABLE IF EXISTS `comments`;
     172CREATE TABLE IF NOT EXISTS `comments` (
     173  `id` int(11) NOT NULL AUTO_INCREMENT,
     174  `date` datetime NOT NULL,
     175  `object_name` varchar(16) NOT NULL COMMENT 'Имя(тип) объекта комментирования',
     176  `object_id` int(11) NOT NULL COMMENT 'ID объекта комментирования',
     177  `autor_name` varchar(16) NOT NULL COMMENT 'Имя автора (анонимного)',
     178  `autor_email` varchar(32) NOT NULL COMMENT 'Электронная почта анонимного автора',
     179  `autor_id` int(11) NOT NULL COMMENT 'UID автора',
     180  `text` text NOT NULL COMMENT 'Текст коментария',
     181  `rate` tinyint(4) NOT NULL COMMENT 'Оценка объекта (0-5)',
     182  `ip` varchar(16) NOT NULL,
     183  `user_agent` varchar(128) NOT NULL,
     184  `response` varchar(512) NOT NULL COMMENT 'Ответ администрации',
     185  `responser` int(11) NOT NULL COMMENT 'Автор ответа',
     186  PRIMARY KEY (`id`),
     187  KEY `object_name` (`object_name`),
     188  KEY `object_id` (`object_id`),
     189  KEY `rate` (`rate`),
     190  KEY `date` (`date`)
     191) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Коментарии к товарам, новостям, статьям и пр.';
     192
    169193--
    170194-- Table structure for table `class_country`
    171195--
    172 
    173196DROP TABLE IF EXISTS `class_country`;
    174197/*!40101 SET @saved_cs_client     = @@character_set_client */;
     
    20352058LOCK TABLES `ps_settings` WRITE;
    20362059/*!40000 ALTER TABLE `ps_settings` DISABLE KEYS */;
    2037 INSERT INTO `ps_settings` VALUES (1,'Y','yandex','/.*?yandex.*?text=[\\.\\s]*([-a-zа-я0-9\"\'_!?()\\/\\\\:;]+[-a-zа-я0-9.\\s,\"\'_!?()\\/\\\\:;]*).*[\\.\\s]*($|&.*)/ui','%yandex%text=%',1),(2,'G','google','/.*?google.*?q=[\\.\\s]*([-a-zа-я0-9\"\'_!?()\\/\\\\:;]+[-a-zа-я0-9.\\s,\"\'_!?()\\/\\\\:;]*).*[\\.\\s]*($|&.*)/ui','%google%q=%',2),(3,'M','mail','/.*?mail.*?q=[\\.\\s]*([-a-zа-я0-9\"\'_!?()\\/\\\\:;]+[-a-zа-я0-9.\\s,\"\'_!?()\\/\\\\:;]*).*[\\.\\s]*($|&.*)/ui','%mail%q=%',3),(4,'R','rambler','/.*?rambler.*?query=[\\.\\s]*([-a-zа-я0-9\"\'_!?()\\/\\\\:;]+[-a-zа-я0-9.\\s,\"\'_!?()\\/\\\\:;]*).*[\\.\\s]*($|&.*)/ui','%rambler%query=%',4),(5,'B','bing','/.*?bing.*?q=[\\.\\s]*([-a-zа-я0-9\"\'_!?()\\/\\\\:;]+[-a-zа-я0-9.\\s,\"\'_!?()\\/\\\\:;]*).*[\\.\\s]*($|&.*)/ui','%bing%q=%',5),(6,'Q','qip','/.*?qip.*?query=[\\.\\s]*([-a-zа-я0-9\"\'_!?()\\/\\\\:;]+[-a-zа-я0-9.\\s,\"\'_!?()\\/\\\\:;]*).*[\\.\\s]*($|&.*)/ui','%qip%query=%',6),(7,'N','ngs','/.*?ngs.*?q=[\\.\\s]*([-a-zа-я0-9\"\'_!?()\\/\\\\:;]+[-a-zа-я0-9.\\s,\"\'_!?()\\/\\\\:;]*).*[\\.\\s]*($|&.*)/ui','%ngs%q=%',7);
     2060INSERT INTO `ps_settings` VALUES (1,'Y','yandex', '/.*?yandex.*?text=[\\.\\s]*([-a-zа-я0-9\"\'_!?()\\/\\\\:;]+[-a-zа-я0-9.\\s,\"\'_!?()\\/\\\\:;]*).*[\\.\\s]*($|&.*)/ui','%yandex%text=%',1),(2,'G','google','/.*?google.*?q=[\\.\\s]*([-a-zа-я0-9\"\'_!?()\\/\\\\:;]+[-a-zа-я0-9.\\s,\"\'_!?()\\/\\\\:;]*).*[\\.\\s]*($|&.*)/ui','%google%q=%',2),(3,'M','mail','/.*?mail.*?q=[\\.\\s]*([-a-zа-я0-9\"\'_!?()\\/\\\\:;]+[-a-zа-я0-9.\\s,\"\'_!?()\\/\\\\:;]*).*[\\.\\s]*($|&.*)/ui','%mail%q=%',3),(4,'R','rambler','/.*?rambler.*?query=[\\.\\s]*([-a-zа-я0-9\"\'_!?()\\/\\\\:;]+[-a-zа-я0-9.\\s,\"\'_!?()\\/\\\\:;]*).*[\\.\\s]*($|&.*)/ui','%rambler%query=%',4),(5,'B','bing','/.*?bing.*?q=[\\.\\s]*([-a-zа-я0-9\"\'_!?()\\/\\\\:;]+[-a-zа-я0-9.\\s,\"\'_!?()\\/\\\\:;]*).*[\\.\\s]*($|&.*)/ui','%bing%q=%',5),(6,'Q','qip','/.*?qip.*?query=[\\.\\s]*([-a-zа-я0-9\"\'_!?()\\/\\\\:;]+[-a-zа-я0-9.\\s,\"\'_!?()\\/\\\\:;]*).*[\\.\\s]*($|&.*)/ui','%qip%query=%',6),(7,'N','ngs','/.*?ngs.*?q=[\\.\\s]*([-a-zа-я0-9\"\'_!?()\\/\\\\:;]+[-a-zа-я0-9.\\s,\"\'_!?()\\/\\\\:;]*).*[\\.\\s]*($|&.*)/ui','%ngs%q=%',7);
    20382061/*!40000 ALTER TABLE `ps_settings` ENABLE KEYS */;
    20392062UNLOCK TABLES;
     
    24972520  KEY `jid` (`jid`),
    24982521  KEY `agent_id` (`agent_id`)
    2499 ) ENGINE=InnoDB AUTO_INCREMENT=1210 DEFAULT CHARSET=utf8 PACK_KEYS=1;
     2522) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=1;
    25002523/*!40101 SET character_set_client = @saved_cs_client */;
    25012524
     
    28492872/*!40101 SET character_set_client = utf8 */;
    28502873CREATE TABLE `variables` (
    2851   `corrupted` tinyint(4) NOT NULL COMMENT 'Признак нарушения целостности',
     2874  `corrupted` tinyint(4) NOT NULL COMMENT 'Служебные переменные системы',
    28522875  `recalc_active` int(9) NOT NULL
    28532876) ENGINE=MyISAM DEFAULT CHARSET=latin1;
  • web/1c_sync.php

    r9bc0e68 r3ff8da1  
    2121include_once("include/doc.core.php");
    2222
     23class NotAuthException extends Exception {
     24   
     25}
     26
    2327// Проверка необходимости перехода на https
    2428if(!@$_SERVER['HTTPS'] && (@$CONFIG['site']['force_https'] || @$CONFIG['site']['force_https_login'])) {
    25     header('Location: https://' . $_SERVER["HTTP_HOST"] . $_SERVER['REQUEST_URI'], true, 301);
    26     exit();
     29    redirect('https://' . $_SERVER["HTTP_HOST"] . $_SERVER['REQUEST_URI']);
    2730}
    28 
    29 
    3031
    3132try {
    3233    if (!isset($_SERVER['PHP_AUTH_USER'])) {
    33         header('WWW-Authenticate: Basic realm="' . @$CONFIG['site']['name'] . '"');
    34         header('HTTP/1.0 401 Unauthorized');
    35         echo 'Authentification cancel by user';
    36         exit();
    37     } elseif (@$_SERVER['PHP_AUTH_USER'] != @$CONFIG['1csync']['login'] || @$_SERVER['PHP_AUTH_PW'] != @$CONFIG['1csync']['pass'] ||
    38             !@$CONFIG['1csync']['pass'] || !@$CONFIG['1csync']['login']) {
    39         header('WWW-Authenticate: Basic realm="' . @$CONFIG['site']['name'] . '"');
    40         header('HTTP/1.0 401 Unauthorized');
    41         echo 'Authentification error';
    42         exit();
     34        throw new \NotAuthException("Authentification cancel by user / Аутентификация отменена пользователем.");
     35    }
     36   
     37    $auth = new \authenticator();
     38    $ip = getenv("REMOTE_ADDR");
     39    $at = $auth->attackTest($ip);
     40    if($at == 'ban_net') {           
     41        $db->insertA("users_bad_auth", array('ip' => $ip, 'time' => time() + 60) );
     42        throw new \Exception("Из-за попыток перебора паролей к сайту доступ с вашей подсети заблокирован! Вы сможете авторизоваться через несколько часов после прекращения попыток перебора пароля. Если Вы не предпринимали попыток перебора пароля, обратитесь к Вашему поставщику интернет-услуг - возможно, кто-то другой пытается подобрать пароль, используя ваш адрес.");
     43    }
     44    if($at == 'ban_ip') {
     45        $db->insertA("users_bad_auth", array('ip' => $ip, 'time' => time() + 60) );
     46        throw new \Exception("Из-за попыток перебора паролей к сайту доступ с вашего адреса заблокирован! Вы сможете авторизоваться через несколько часов после прекращения попыток перебора пароля. Если Вы не предпринимали попыток перебора пароля, обратитесь к Вашему поставщику интернет-услуг - возможно, кто-то другой пытается подобрать пароль, используя ваш адрес.");
     47    }
     48   
     49    if(!$auth->loadDataForLogin($_SERVER['PHP_AUTH_USER'])) {  // Не существует
     50        $db->insertA("users_bad_auth", array('ip' => getenv("REMOTE_ADDR"), 'time' => time()) );
     51        throw new \NotAuthException("Неверная пара логин / пароль. Попробуйте снова.");
    4352    }
    4453
    45     $partial_time = rcvint('partial_time', 0); // Если задано, то передаёт только изменения, произошедшие после этой даты
    46     $start_date = rcvdate('start_date', date("Y-m-d"));            // Только для полной синхронизации. Начало интервала.   
    47     $end_date = rcvdate('end_date', date("Y-m-d"));                // Только для полной синхронизации. Конец интервала.
     54    if(!$auth->testPassword($_SERVER['PHP_AUTH_PW'])) {   // Неверный пароль
     55        $db->insertA("users_bad_auth", array('ip' => getenv("REMOTE_ADDR"), 'time' => time()) );
     56        throw new \NotAuthException("Неверная пара логин / пароль. Попробуйте снова.");
     57    }
     58
     59    if ($auth->isDisabled()) {
     60        throw new \Exception("Пользователь заблокирован (забанен). Причина блокировки: " . $auth->getDisabledReason() );
     61    }
     62       
     63    $user_info = $auth->getUserInfo();
     64    $auth->addHistoryLine('1c');
     65    $_SESSION['uid'] = $user_info['id'];
     66    $_SESSION['name'] = $user_info['name'];
    4867   
    49     $db->startTransaction();
     68    if(!isAccess('doc_1csync', 'exec', true)) {
     69        throw new \Exception("Отсутствуют необходимые привилегии" );
     70    }
    5071   
    51     $dom = new domDocument("1.0", "utf-8");
    52     $root = $dom->createElement("multimag_exchange"); // Создаём корневой элемент
    53     $root->setAttribute('version', '1.0');
    54     $dom->appendChild($root);
     72    $partial_time = rcvint('partial_time', 0);              // Если задано, то передаёт только изменения, произошедшие после этой даты
     73    $start_date = rcvdate('start_date', "1970-01-01");      // Только для полной синхронизации. Начало интервала.   
     74    $end_date = rcvdate('end_date', date("Y-m-d"));         // Только для полной синхронизации. Конец интервала.
     75    $mode = request('mode');
    5576   
    56     // Информация о выгрузке
    57     $result = $dom->createElement('result');            // Код возврата
    58     $result_code = $dom->createElement('status', 'ok');
    59     $result_desc = $dom->createElement('message', 'Ok');
    60     $result_timestamp = $dom->createElement('timestamp', time()-1);
    61     $result->appendChild($result_code);
    62     $result->appendChild($result_desc);
    63     $result->appendChild($result_timestamp);
    64     $root->appendChild($result);
     77    if($mode == 'export') {
     78        $db->startTransaction();   
     79        $export = new \sync\Xml1cDataExport($db);
     80        $export->setRefbooksList( request('refbooks', null) );
     81        $export->setDocTypesList( request('doctypes', null) );
     82        $export->setPartialTimeshtamp($partial_time);
     83        $export->setPeriod($start_date, $end_date);
     84        $data = $export->getData();   
     85        header("Content-type: application/xml");
     86        echo $data;
     87    } else if($mode=='import') {
     88        $import = new \sync\simplexml1cdataimport($db);
     89        if( isset($_POST['xmlstring']) ) {
     90            $xmlstring = $_POST['xmlstring'];
     91            $import->loadFromString($_POST['xmlstring']);
     92        } elseif (is_uploaded_file(@$_FILES['xmlfile']['tmp_name'])) {
     93            $import->loadFromFile(@$_FILES['xmlfile']['tmp_name']);
     94        } else {
     95            throw new Exception('Данные не получены.');
     96        }
     97        $db->startTransaction();
     98        $data = $import->importData();
     99        header("Content-type: application/xml");
     100        echo $data;
     101        $db->commit();
     102       
     103    } else {
     104        throw new NotFoundException('Неверный параметр');
     105    }
     106     
    65107   
    66     $refbooks = $dom->createElement('refbooks');    // Узел справочников
    67        
    68     $export = new \sync\Xml1cDataExport($db);
    69    
    70     $export->dom = $dom;
    71    
    72     // Выгрузка справочника собственных организаций
    73     $firms = $export->convertToXmlElement('firms', 'firm', $export->getFirmsData());
    74     $refbooks->appendChild($firms);
    75    
    76     // Выгрузка справочника складов
    77     $stores = $export->convertToXmlElement('stores', 'store', $export->getStoresData());
    78     $refbooks->appendChild($stores);
    79    
    80     // Выгрузка справочника касс
    81     $tills = $export->convertToXmlElement('tills', 'till', $export->getTillsData());
    82     $refbooks->appendChild($tills);
    83    
    84     // Выгрузка справочника банков
    85     $banks = $export->convertToXmlElement('banks', 'bank', $export->getBanksData());
    86     $refbooks->appendChild($banks);
    87    
    88     // Выгрузка справочника цен
    89     $prices = $export->convertToXmlElement('prices', 'price', $export->getPricesData());
    90     $refbooks->appendChild($prices);
    91    
    92     // Выгрузка справочника сотрудников
    93     $workers = $export->convertToXmlElement('workers', 'worker', $export->getWorkersData());
    94     $refbooks->appendChild($workers);
    95    
    96     // Выгрузка справочника агентов
    97     $agents = $dom->createElement('agents');   
    98     $groups = $export->convertToXmlElement('groups', 'group', $export->getAgentGroupsData());
    99     $agents->appendChild($groups);
    100     $items = $export->convertToXmlElement('items', 'item', $export->getAgentsListData());
    101     $agents->appendChild($items);   
    102     $refbooks->appendChild($agents);
    103    
    104     // Выгрузка справочника стран мира (ОКСМ)
    105     $workers = $export->convertToXmlElement('countries', 'country', $export->getCountriesData());
    106     $refbooks->appendChild($workers);
    107    
    108     // Выгрузка справочника единиц измерения (ОКЕИ)
    109     $units = $export->convertToXmlElement('units', 'unit', $export->getUnitsData());
    110     $refbooks->appendChild($units);
    111    
    112     // Выгрузка справочника номенклатуры
    113     $nomenclature = $dom->createElement('nomenclature');
    114     // Номенклатурные группы
    115     $groups = $export->convertToXmlElement('groups', 'group', $export->getNomenclatureGroupsData());
    116     $nomenclature->appendChild($groups);
    117     $items = $export->convertToXmlElement('items', 'item', $export->getNomenclatureListData());
    118     $nomenclature->appendChild($items);   
    119     $refbooks->appendChild($nomenclature);
    120    
    121     $root->appendChild($refbooks);
    122    
    123     $from_date = strtotime($start_date);
    124     $to_date = strtotime($end_date." 23:59:59");
    125     $documents = $export->convertToXmlElement('documents', 'document', $export->getDocumentsData($from_date, $to_date));
    126    
    127     $root->appendChild($documents);
    128    
    129     header("Content-type: application/xml");
    130     echo $dom->saveXML(); 
    131    
    132 } catch (Exception $e) {
     108}
     109catch (NotAuthException $e) {
     110    header('WWW-Authenticate: Basic realm="' . @$CONFIG['site']['name'] . '"');
     111    header('HTTP/1.0 401 Unauthorized');
     112    echo $e->getMessage();
     113}
     114catch (Exception $e) {
    133115    $dom = new domDocument("1.0", "utf-8");
    134116    $root = $dom->createElement("multimag_exchange"); // Создаём корневой элемент
     
    146128    echo $dom->saveXML();
    147129}
     130
     131unset($_SESSION['uid']);
  • web/core.php

    r9bc0e68 r3ff8da1  
    315315                $_SESSION['last_page']=$_SERVER['REQUEST_URI'];
    316316                $_SESSION['cook_test']='data';
    317                 header('Location: /login.php');
    318                 $tmpl->msg("Для продолжения необходимо выполнить вход!","info","Требуется аутентификация");
     317                redirect('/login.php');
     318                //$tmpl->msg("Для продолжения необходимо выполнить вход!","info","Требуется аутентификация");
    319319                $tmpl->write();
    320320                exit();
     
    352352        if((!$uid) && (!$access) && (!$no_redirect))    need_auth();
    353353        return $access;
     354}
     355
     356// Проверка, не принадлежит ли текущая сессия другому пользователю
     357function testForeignSession() {
     358    global $db, $tmpl;
     359    if(auth()) {
     360        $res = $db->query("SELECT `last_session_id` FROM `users` WHERE `id`=".intval($_SESSION['uid']));
     361        if($res->num_rows) {
     362            list($stored_session_id) = $res->fetch_row();
     363            if($stored_session_id != session_id()) {
     364                $_SESSION['another_device'] = 1;
     365                $_SESSION['uid'] = 0;
     366                need_auth();
     367            }
     368        }
     369    }
    354370}
    355371
     
    912928
    913929$tmpl=new BETemplate;
     930testForeignSession();
    914931
    915932$dop_status=array('new'=>'Новый', 'err'=>'Ошибочный', 'inproc'=>'В процессе', 'ready'=>'Готов', 'ok'=>'Отгружен');
  • web/include/authenticator.php

    r9bc0e68 r3ff8da1  
    4343        `reg_email`, `reg_phone`, `reg_email_confirm`, `reg_phone_confirm`, `reg_email_subscribe`, `reg_phone_subscribe`,
    4444        `reg_date`, `disabled`, `disabled_reason`, `bifact_auth`, `jid`, `real_name`, `real_address`, `agent_id`,
    45         `worker`, `worker_email`, `worker_email`, `worker_phone`, `worker_jid`, `worker_real_name`, `worker_real_address`, `worker_post_name`
     45        `worker`, `worker_email`, `worker_email`, `worker_phone`, `worker_jid`, `worker_real_name`, `worker_real_address`, `worker_post_name`,
     46        `last_session_id`
    4647        FROM `users`
    4748        LEFT JOIN `users_worker_info` ON `user_id`=`users`.`id` ";
  • web/include/doc.core.php

    r9bc0e68 r3ff8da1  
    606606/// @sa DocPodZakaz DocVPuti
    607607/// TODO: реализовать кеширование
    608 function DocRezerv($pos_id, $doc_id=0)
    609 {
    610         global $db;
    611         settype($pos_id,'int');
    612         settype($doc_id,'int');
    613 
    614         $res=$db->query("SELECT SUM(`doc_list_pos`.`cnt`) FROM `doc_list_pos`
     608function DocRezerv($pos_id, $doc_id = 0) {
     609    global $db;
     610    settype($pos_id, 'int');
     611    settype($doc_id, 'int');
     612
     613    $res = $db->query("SELECT SUM(`doc_list_pos`.`cnt`) FROM `doc_list_pos`
    615614        INNER JOIN `doc_list` ON `doc_list`.`type`='3' AND `doc_list`.`ok`>'0' AND `doc_list`.`id`=`doc_list_pos`.`doc` AND `doc_list`.`id`!=$doc_id
    616615        AND `doc_list`.`id` NOT IN (SELECT DISTINCT `p_doc` FROM `doc_list`
     
    619618        WHERE `doc_list_pos`.`tovar`=$pos_id
    620619        GROUP BY `doc_list_pos`.`tovar`");
    621         if($res->num_rows)      list($reserved)=$res->fetch_row();
    622         else                    $reserved=0;
    623         $res->free();
    624         return $reserved;
    625 
     620    if ($res->num_rows)
     621        list($reserved) = $res->fetch_row();
     622    else
     623        $reserved = 0;
     624    $res->free();
     625    return $reserved;
    626626}
    627627
     
    631631/// @sa DocRezerv DocVPuti
    632632/// TODO: реализовать кеширование
    633 function DocPodZakaz($pos_id,$doc_id=0)
    634 {
    635         global $db, $CONFIG;
    636         settype($pos_id,'int');
    637         settype($doc_id,'int');
    638         if(@$CONFIG['doc']['op_time'])  $rt=time()-60*60*24*$CONFIG['doc']['op_time'];
    639         else                            $rt=time()-60*60*24*365;
    640         $res=$db->query("SELECT SUM(`doc_list_pos`.`cnt`) FROM `doc_list_pos`
     633function DocPodZakaz($pos_id, $doc_id = 0) {
     634    global $db, $CONFIG;
     635    settype($pos_id, 'int');
     636    settype($doc_id, 'int');
     637    if (@$CONFIG['doc']['op_time'])
     638        $rt = time() - 60 * 60 * 24 * $CONFIG['doc']['op_time'];
     639    else
     640        $rt = time() - 60 * 60 * 24 * 365;
     641    $res = $db->query("SELECT SUM(`doc_list_pos`.`cnt`) FROM `doc_list_pos`
    641642        INNER JOIN `doc_list` ON `doc_list`.`type`='11' AND `doc_list`.`ok`>'0' AND `doc_list`.`id`!=$doc_id AND `doc_list`.`id`=`doc_list_pos`.`doc` AND `doc_list`.`id` NOT IN (SELECT DISTINCT `p_doc` FROM `doc_list` WHERE `ok` != '0' AND `type`='1' )
    642643        WHERE `doc_list_pos`.`tovar`=$pos_id
    643644        GROUP BY `doc_list_pos`.`tovar`");
    644         if($res->num_rows)      list($available)=$res->fetch_row();
    645         else                    $available=0;
    646         $res->free();
    647         return $available;
     645    if ($res->num_rows)
     646        list($available) = $res->fetch_row();
     647    else
     648        $available = 0;
     649    $res->free();
     650    return $available;
    648651}
    649652
     
    653656/// @sa DocPodZakaz DocVPuti
    654657/// TODO: реализовать кеширование
    655 function DocVPuti($pos_id,$doc_id=0)
    656 {
    657         global $db;
    658         settype($pos_id,'int');
    659         settype($doc_id,'int');
    660 
    661         $res=$db->query("SELECT SUM(`doc_list_pos`.`cnt`) FROM `doc_list_pos`
     658function DocVPuti($pos_id, $doc_id = 0) {
     659    global $db;
     660    settype($pos_id, 'int');
     661    settype($doc_id, 'int');
     662
     663    $res = $db->query("SELECT SUM(`doc_list_pos`.`cnt`) FROM `doc_list_pos`
    662664        INNER JOIN `doc_list` ON `doc_list`.`type`='12' AND `doc_list`.`ok`>'0' AND `doc_list`.`id`!=$doc_id
    663665        AND `doc_list`.`id`=`doc_list_pos`.`doc` AND `doc_list`.`id` NOT IN (SELECT DISTINCT `p_doc` FROM `doc_list` WHERE `ok` != '0' AND `type`='1' )
    664666        WHERE `doc_list_pos`.`tovar`=$pos_id
    665667        GROUP BY `doc_list_pos`.`tovar`");
    666         if($res->num_rows)      list($transit)=$res->fetch_row();
    667         else                    $transit=0;
    668         $res->free();
    669         return $transit;
     668    if ($res->num_rows)
     669        list($transit) = $res->fetch_row();
     670    else
     671        $transit = 0;
     672    $res->free();
     673    return $transit;
    670674}
    671675
    672676/// Создаёт класс документа по ID документа, используя AutoDocumentType
    673677/// @sa AutoDocumentType
    674 function AutoDocument($doc_id)
    675 {
    676         global $db;
    677         settype($doc_id,'int');
    678         $res=$db->query("SELECT `type` FROM `doc_list` WHERE `id`=$doc_id");
    679         if(!$res->num_rows)     throw new Exception("Документ не найден");
    680         list($type)=$res->fetch_row();
    681         return AutoDocumentType($type, $doc_id);
     678function AutoDocument($doc_id) {
     679    global $db;
     680    settype($doc_id, 'int');
     681    $res = $db->query("SELECT `type` FROM `doc_list` WHERE `id`=$doc_id");
     682    if (!$res->num_rows)
     683        throw new Exception("Документ не найден");
     684    list($type) = $res->fetch_row();
     685    return AutoDocumentType($type, $doc_id);
    682686}
    683687
     
    685689/// @sa selectAgentGroup
    686690function selectAgentGroupRecursive($group_id, $prefix, $selected, $leaf_only) {
    687         global $db;
    688         // Нет смысла в проверке входных параметров, т.к. функция вызывается только из selectAgentGroup
    689         $res = $db->query("SELECT `id`, `name` FROM `doc_agent_group` WHERE `pid`='$group_id' ORDER BY `id`");
    690         $ret = '';
    691         while($line = $res->fetch_row()) {
    692                 $sel = ($selected==$line[0])?' selected':'';
    693                 $deep = selectAgentGroupRecursive($line[0], $prefix.'|&nbsp;&nbsp;', $selected, $leaf_only);
    694                 $dis = ($deep!='' && $leaf_only)?' disabled':'';
    695                 $ret .= "<option value='$line[0]'{$sel}{$dis}>{$prefix}".htmlentities($line[1],ENT_QUOTES,"UTF-8")."</option>";
    696                 $ret .= $deep;
    697         }
    698         $res->free();
    699         return $ret;
     691    global $db;
     692    // Нет смысла в проверке входных параметров, т.к. функция вызывается только из selectAgentGroup
     693    $res = $db->query("SELECT `id`, `name` FROM `doc_agent_group` WHERE `pid`='$group_id' ORDER BY `id`");
     694    $ret = '';
     695    while ($line = $res->fetch_row()) {
     696        $sel = ($selected == $line[0]) ? ' selected' : '';
     697        $deep = selectAgentGroupRecursive($line[0], $prefix . '|&nbsp;&nbsp;', $selected, $leaf_only);
     698        $dis = ($deep != '' && $leaf_only) ? ' disabled' : '';
     699        $ret .= "<option value='$line[0]'{$sel}{$dis}>{$prefix}" . htmlentities($line[1], ENT_QUOTES, "UTF-8") . "</option>";
     700        $ret .= $deep;
     701    }
     702    $res->free();
     703    return $ret;
    700704}
    701705
     
    708712/// @param leaf_only    Флаг возможности выбора только "листьев" в дереве групп
    709713/// @sa selectGroupPos
    710 function selectAgentGroup($select_name, $selected=0, $not_select=0, $select_id='', $select_class='', $leaf_only=false) {
    711         $ret="<select name='$select_name' id='$select_id' class='$select_class'>";
    712         if($not_select) $ret.="<option value='0'>***не выбрана***</option>";
    713         $ret.=selectAgentGroupRecursive(0, '', $selected, $leaf_only);
    714         $ret.="</select>";
    715         return $ret;
     714function selectAgentGroup($select_name, $selected = 0, $not_select = 0, $select_id = '', $select_class = '', $leaf_only = false) {
     715    $ret = "<select name='$select_name' id='$select_id' class='$select_class'>";
     716    if ($not_select)
     717        $ret.="<option value='0'>***не выбрана***</option>";
     718    $ret.=selectAgentGroupRecursive(0, '', $selected, $leaf_only);
     719    $ret.="</select>";
     720    return $ret;
    716721}
    717722
     
    719724/// @sa selectGroupPos
    720725function selectGroupPosRecursive($group_id, $prefix, $selected, $leaf_only) {
    721         global $db;
    722         // Нет смысла в проверке входных параметров, т.к. функция вызывается только из selectGroupPos
    723         $res = $db->query("SELECT `id`, `name` FROM `doc_group` WHERE `pid`='$group_id' ORDER BY `id`");
    724         $ret = '';
    725         while($line = $res->fetch_row()) {
    726                 $sel = ($selected==$line[0])?' selected':'';
    727                 $deep = selectGroupPosRecursive($line[0], $prefix.'|&nbsp;&nbsp;', $selected, $leaf_only);
    728                 $dis = ($deep!='' && $leaf_only)?' disabled':'';
    729                 $ret .= "<option value='$line[0]'{$sel}{$dis}>{$prefix}".htmlentities($line[1],ENT_QUOTES,"UTF-8")."</option>";
    730                 $ret .= $deep;
    731         }
    732         $res->free();
    733         return $ret;
     726    global $db;
     727    // Нет смысла в проверке входных параметров, т.к. функция вызывается только из selectGroupPos
     728    $res = $db->query("SELECT `id`, `name` FROM `doc_group` WHERE `pid`='$group_id' ORDER BY `id`");
     729    $ret = '';
     730    while ($line = $res->fetch_row()) {
     731        $sel = ($selected == $line[0]) ? ' selected' : '';
     732        $deep = selectGroupPosRecursive($line[0], $prefix . '|&nbsp;&nbsp;', $selected, $leaf_only);
     733        $dis = ($deep != '' && $leaf_only) ? ' disabled' : '';
     734        $ret .= "<option value='$line[0]'{$sel}{$dis}>{$prefix}" . htmlentities($line[1], ENT_QUOTES, "UTF-8") . "</option>";
     735        $ret .= $deep;
     736    }
     737    $res->free();
     738    return $ret;
    734739}
    735740
     
    742747/// @param leaf_only    Флаг возможности выбора только "листьев" в дереве групп
    743748/// @sa selectAgentGroup
    744 function selectGroupPos($select_name, $selected=0, $not_select=false, $select_id='', $select_class='', $leaf_only=false)
    745 {
    746         $ret="<select name='$select_name' id='$select_id' class='$select_class'>";
    747         if($not_select) $ret.="<option value='0'>***не выбран***</option>";
    748         $ret.=selectGroupPosRecursive(0, '', $selected, $leaf_only);
    749         $ret.="</select>";
    750         return $ret;
    751 }
    752 
    753 /// @brief Возвращает строку с информацией о различиях между двумя наборами данных в массивах
    754 /// Массив new должен содержать все индексы массива old
    755 /// Используется для внесения информации в журнал
    756 /// @param old  Старый набор данных (массив)
    757 /// @param new  Новый набор данных (массив)
    758 function getCompareStr($old, $new) {
    759         $ret = '';
    760         foreach ($old as $key => $value) {
    761                 if ($new[$key] !== $value) {
    762                         if ($ret)
    763                                 $ret.=", $key: ( $value => {$new[$key]})";
    764                         else {
    765                                 $ret = ", $key: ( $value => {$new[$key]})";
    766                         }
    767                 }
    768         }
    769         return $ret;
    770 }
    771 
    772 ?>
     749function selectGroupPos($select_name, $selected = 0, $not_select = false, $select_id = '', $select_class = '', $leaf_only = false) {
     750    $ret = "<select name='$select_name' id='$select_id' class='$select_class'>";
     751    if ($not_select)
     752        $ret.="<option value='0'>***не выбран***</option>";
     753    $ret.=selectGroupPosRecursive(0, '', $selected, $leaf_only);
     754    $ret.="</select>";
     755    return $ret;
     756}
     757
     758
  • web/include/doc.pko.php

    r9bc0e68 r3ff8da1  
    320320                $pdf->Cell(0,4,$str,'B',1,'L',0);
    321321
    322                 $sum_r=round($this->doc_data['sum']);
    323                 $sum_c=round(($this->doc_data['sum']-$sum_r)*100);
     322                $sum_r = floor($this->doc_data['sum']);
     323                $sum_c = round(($this->doc_data['sum']-$sum_r)*100);
     324               
    324325                $str = iconv('UTF-8', 'windows-1251', "Сумма");
    325326                $pdf->Cell(90,4,'','B',0,'L',0);
     
    424425                $pdf->MultiCell(0,4,$str_osn,0,'L',0);
    425426                $pdf->SetY($y+8);
    426                 $sum_r = floor($this->doc_data['sum']);
    427                 $sum_c = round(($this->doc_data['sum']-$sum_r)*100);
     427               
    428428                $str = iconv('UTF-8', 'windows-1251', "Сумма");
    429429                $pdf->Cell(10,4,$str,0,0,'L',0);
  • web/include/doc_scripts/zp_s_prodaj.php

    r9bc0e68 r3ff8da1  
    182182                                $incost = getInCost($nxt_tov['tovar'], $nxt['date']);
    183183                                if($use_likv && isset($a_likv[$nxt_tov['tovar']])) {
    184                                     $nach_sum += ($nxt_tov['cost'] - $incost) * $this->coeff * $nxt_tov['cnt'] * (1 - $a_likv[$nxt_tov['tovar']]*$this->coeff/100 );
     184                                    $nach_sum += ($nxt_tov['cost'] - $incost) * $this->coeff * $nxt_tov['cnt'] * (1 - $a_likv[$nxt_tov['tovar']]*$this->l_coeff/100 );
    185185                                } else {
    186186                                    $nach_sum += ($nxt_tov['cost'] - $incost) * $this->coeff * $nxt_tov['cnt'];
  • web/include/modules/site/cabinet.php

    r9bc0e68 r3ff8da1  
    4747    }
    4848
    49     /// Отобразить страницу новостей
    50     /// @param mode: '' - список новостей
     49    /// Отобразить страницу личного кабинета
     50    /// @param mode: раздел личного кабинета
    5151    public function ExecMode($mode = '') {
    5252        global $tmpl, $CONFIG, $db;
     
    243243    }
    244244   
     245    /// Сформировать HTML код формы запроса на доработку
    245246    public function getFeedbackForm($token, $fields) {
    246247        $a = $this->getFormAction();
     
    343344    }
    344345   
     346    /// Обработчик обновления пользовательского профиля
    345347    public function tryShowProfile() {
    346348        global $tmpl, $db;
     
    378380    }
    379381   
     382    /// Обработчик смены адреса электронной почты
    380383    public function tryChangeEmail() {
    381384        global $tmpl;
     
    398401    }
    399402   
     403    /// Обработчик смены номера телефона
    400404    public function tryChangePhone() {
    401405        global $tmpl;       
     
    449453    }
    450454
     455    /// Получить PDF форму документа
    451456    public function getDocPdf() {
    452457        global $db, $CONFIG;
     
    476481    }
    477482   
     483    /// Отобразить журнал ошибок
    478484    public function viewErrorLog() {
    479485        global $tmpl, $db, $CONFIG;
     
    572578    }
    573579
    574    
     580    /// Отобразить форму запроса на доработку
    575581    public function viewFeedbackForm() {
    576582        global $tmpl, $CONFIG;
     
    651657    }
    652658   
     659    /// Отправить запрос на доработку программы
    653660    public function sendFeedback() {
    654661        global $tmpl, $CONFIG;
  • web/include/modules/site/login.php

    r9bc0e68 r3ff8da1  
    142142            $err_msgs = array_merge($err_msgs, $errors);
    143143        }
    144         var_dump($err_msgs);
    145144       
    146145        $form_action = $this->getFormAction();
     
    296295   
    297296    /// Сформировать HTML код формы выбора вариантов восстановления забытого пароля
     297    /// @param $session_key Сессионный ключ
     298    /// @param $email       Адрес электронной почты
     299    /// @param $phone       Номер телефона
     300    /// @param $openid_list Массив с openid идентификаторами
    298301    public function getPassRecoveryTypesForm($session_key, $email, $phone, $openid_list) {
    299302        $form_action = $this->getFormAction();
     
    556559                else {
    557560                    $user_info = $auth->getUserInfo();
     561                    $db->update('users', $user_info['id'], 'last_session_id', session_id());
    558562                    $auth->addHistoryLine('password');
     563                    unset($_SESSION['another_device']);
    559564                    $_SESSION['uid'] = $user_info['id'];
    560565                    $_SESSION['name'] = $user_info['name'];
     
    577582        }
    578583        if($need_form) {
     584            if(@$_SESSION['another_device']) {
     585                $tmpl->errorMessage("Выполнен вход с другого устройства! Для продолжения работы необходимо пройти повторную аутентификацию, "
     586                    . "либо <a href='/login.php?mode=logout'>прервать сессию</a>!");
     587            }
    579588            if (isset($_REQUEST['cont'])) {
    580589                $tmpl->addContent("<div id='page-info'>Для доступа в этот раздел Вам необходимо пройти аутентификацию.</div>");
     
    963972        unset($_SESSION['uid']);
    964973        unset($_SESSION['name']);
     974        unset($_SESSION['another_device']);
    965975        redirect("/index.php");
    966976    }
  • web/include/pricecalc.php

    r9bc0e68 r3ff8da1  
    446446}
    447447
    448 
    449 ?>
  • web/include/sync/dataexport.php

    r9bc0e68 r3ff8da1  
    1919namespace sync;
    2020
    21 class DataExport {
    22     protected $db;
    23    
     21class dataexport {
     22    protected $db;                  //< Ссылка на соединение с базой данных
     23    protected $start_time;          //< Начало дипапзона полной выгрузки
     24    protected $end_time;            //< Конец диапазона полной выгрузки
     25    protected $refbooks_list;       //< Список справочников к выгрузке
     26    protected $doctypes_list;       //< Список типов документов к выгрузке
     27    protected $partial_timeshtamp;  //< Время предыдущей синхронизации для частичной выгрузки
     28
    2429    /// Конструктор
    2530    /// @param $db Объект связи с базой данных
    2631    public function __construct($db) {
    2732        $this->db = $db;
    28     }
    29    
     33        $this->drl = array('firms', 'stores', 'tills', 'banks', 'prices', 'workers', 'agents', 'countries', 'units', 'nomenclature');
     34        $this->refbooks_list = $this->drl;
     35        $this->ddl = array(1=>'postuplenie', 2=>'realizaciya', 3=>'zayavka', 4=>'pbank', 5=>'rbank', 6=>'pko', 7=>'rko', 8=>'peremeshenie', 9=>'perkas');
     36        $this->doctypes_list = $this->ddl;
     37    }
     38   
     39    /// Задать период полной выгрузки
     40    /// @param $start_date  Начальная дата
     41    /// @param $end_date    Конечная дата
     42    public function setPeriod($start_date, $end_date) {
     43        $this->start_time = strtotime($start_date);
     44        $this->end_time = strtotime($end_date." 23:59:59");
     45    }
     46   
     47    /// Задать список справочников для экспорта
     48    /// @param $refbooks_list   Ассоциативный массив с наименованиями справочников или null для выгрузки всех справочников
     49    public function setRefbooksList($refbooks_list = null) {       
     50        $this->refbooks_list = $refbooks_list;
     51        if(!is_array($this->refbooks_list)) {
     52            $this->refbooks_list = $this->drl;
     53        }
     54    }
     55   
     56    public function setDocTypesList($doctypes_list) {       
     57        $this->doctypes_list = $doctypes_list;
     58        if(!is_array($this->doctypes_list)) {
     59            $this->doctypes_list = $this->ddl;
     60        }
     61    }
     62   
     63    /// Задаёт время в unixtime предыдущей синхронизации. Время используется для сокращения объёма синхронизируемых данных.
     64    /// Отсутствие повторной выгрузки синхронизированных данных не гарантируется.
     65    /// @param $time    Время предыдущей синхронизации или 0
     66    public function setPartialTimeshtamp($time) {
     67         $this->partial_timeshtamp = intval($time);
     68    }
     69
    3070    protected function getDataFromMysqlQuery($query) {
    3171        $ret = array();
     
    60100                return 'doveren';
    61101            case 11:
    62                 return 'redlojenie';
     102                return 'predlojenie';
    63103            case 12:
    64104                return 'v_puti';
     
    118158   
    119159    /// Получить данные справочника списка агентов
    120     public function getAgentsListData() {
    121         $ret = array();
    122         $res = $this->db->query("SELECT `id`, `group` AS `group_id`, `type`, `name`, `fullname`, `adres` AS `address`, `real_address`, `inn`, `kpp`, `dir_fio`,
     160    /// @param $partial Вернуть только изменённые с указанной даты в unixtime
     161    public function getAgentsListData($partial = false) {
     162        $ret = array();
     163       
     164        $sql = "SELECT `id`, `group` AS `group_id`, `type`, `name`, `fullname`, `adres` AS `address`, `real_address`, `inn`, `kpp`, `dir_fio`,
    123165                `pfio` AS `cpreson_fio`, `pdol` AS `cperson_post`, `okved` AS `okved`, `okpo` AS `okpo`, `ogrn` AS `ogrn`, `pasp_num` AS `passport_num`,
    124166                `pasp_date` AS `passport_date`, `pasp_kem` AS `passport_source_info`, `comment`, `data_sverki` AS `revision_date`,
    125167                `dishonest` AS `dishonest`, `p_agent` AS `p_agent_id`, `price_id` AS `price_id`, `tel`, `sms_phone`, `fax_phone`, `alt_phone`, `email`,
    126168                `no_mail`, `rs`, `bank`, `ks`, `bik`
    127             FROM `doc_agent`
    128             ORDER BY `id`");
     169            FROM `doc_agent` ";
     170        if($partial) {
     171            $str_date = date("Y-m-d H:i:s", $partial);
     172            $sql .= " WHERE `id` IN ( SELECT `object_id` FROM `doc_log` WHERE `object`='agent' AND `time`>'$str_date' GROUP BY `object_id` )";
     173        }
     174        $sql .= " ORDER BY `id`";
     175       
     176        $res = $this->db->query($sql);
     177       
    129178        while($line = $res->fetch_assoc()) {
    130179            // Тип агента
     
    258307   
    259308    /// Получить документы
    260     public function getDocumentsData($from_date, $to_date) {
    261         $ret = array();
    262         $res = $this->db->query("SELECT `id`, `type`, `date`, `ok`, `sklad` AS `store_id`, `kassa` AS `till_id`, `bank` AS `bank_id`,
    263                 `user` AS `author_id`, `altnum`, `subtype`, `sum`, `nds`, `p_doc` AS `parent_doc_id`, `mark_del`, `firm_id`, `contract` AS `contract_id`, `comment`
     309    public function getDocumentsData() {
     310        $ret = array();
     311        $res = $this->db->query("SELECT `id`, `type`, `agent`, `date`, `ok`, `sklad` AS `store_id`, `kassa` AS `till_id`, `bank` AS `bank_id`,
     312                `user` AS `author_id`, `altnum`, `subtype`, `sum`, `nds`, `p_doc` AS `parent_doc_id`, `mark_del`, `firm_id`, `contract` AS `contract_id`,
     313                `comment`
    264314            FROM `doc_list`
    265             WHERE `date`>='$from_date' AND `date`<='$to_date'");
     315            WHERE `date`>='{$this->start_time}' AND `date`<='{$this->end_time}'");
    266316        while($line = $res->fetch_assoc()) {
    267317            $line['type'] = $this->getNameFromDocType($line['type']);
     318            if(!in_array($line['type'], $this->doctypes_list) ) {
     319                continue;
     320            }
     321            $line['date'] = date("Y-m-d H:i:s", $line['date']);
    268322            // Дополнительные данные документа - преобразование в корректную форму
    269323            $dop_res = $this->db->query("SELECT `param`, `value` FROM `doc_dopdata` WHERE `doc`='{$line['id']}'");
     
    314368                $line['positions'] = $positions;
    315369            }
    316            
    317370            $ret[$line['id']] = $line;
    318371        }
  • web/include/sync/xml1cdataexport.php

    r9bc0e68 r3ff8da1  
    2020
    2121/// Класс формирования XML файла для обмена с 1с
    22 class Xml1cDataExport extends \sync\DataExport {
    23     public $dom;    //< Объект DOMDocument
    24  
     22class Xml1cDataExport extends \sync\dataexport {
     23    protected $dom;                 //< Объект DOMDocument
     24    protected $rootNode;            //< Корневой элемент
     25
     26
    2527    /// Преобразовывает ассоциативный многоуровневый массив $data в DOMElement
    2628    /// @param $group_node_name Имя создвавемого элемента списка
     
    4850        return $res_node;
    4951    }
     52   
     53    /// Получить экспортируемые данные
     54    public function getData() {
     55        $this->createDom();
     56        $refbooks = $this->dom->createElement('refbooks');    // Узел справочников
     57        // Выгрузка справочника собственных организаций
     58        if (in_array('firms', $this->refbooks_list)) {
     59            $firms = $this->convertToXmlElement('firms', 'firm', $this->getFirmsData());
     60            $refbooks->appendChild($firms);
     61        }
     62        // Выгрузка справочника складов
     63        if (in_array('stores', $this->refbooks_list)) {
     64            $stores = $this->convertToXmlElement('stores', 'store', $this->getStoresData());
     65            $refbooks->appendChild($stores);
     66        }
     67        // Выгрузка справочника касс
     68        if (in_array('tills', $this->refbooks_list)) {
     69            $tills = $this->convertToXmlElement('tills', 'till', $this->getTillsData());
     70            $refbooks->appendChild($tills);
     71        }
     72        // Выгрузка справочника банков
     73        if (in_array('banks', $this->refbooks_list)) {
     74            $banks = $this->convertToXmlElement('banks', 'bank', $this->getBanksData());
     75            $refbooks->appendChild($banks);
     76        }
     77        // Выгрузка справочника цен
     78        if (in_array('prices', $this->refbooks_list)) {
     79            $prices = $this->convertToXmlElement('prices', 'price', $this->getPricesData());
     80            $refbooks->appendChild($prices);
     81        }
     82        // Выгрузка справочника сотрудников
     83        if (in_array('workers', $this->refbooks_list)) {
     84            $workers = $this->convertToXmlElement('workers', 'worker', $this->getWorkersData());
     85            $refbooks->appendChild($workers);
     86        }
     87        // Выгрузка справочника стран мира (ОКСМ)
     88        if (in_array('countries', $this->refbooks_list)) {
     89            $workers = $this->convertToXmlElement('countries', 'country', $this->getCountriesData());
     90            $refbooks->appendChild($workers);
     91        }
     92        // Выгрузка справочника единиц измерения (ОКЕИ)
     93        if (in_array('units', $this->refbooks_list)) {
     94            $units = $this->convertToXmlElement('units', 'unit', $this->getUnitsData());
     95            $refbooks->appendChild($units);
     96        }
     97        // Выгрузка справочника агентов
     98        if (in_array('agents', $this->refbooks_list)) {
     99            $agents = $this->dom->createElement('agents');   
     100            $groups = $this->convertToXmlElement('groups', 'group', $this->getAgentGroupsData());
     101            $agents->appendChild($groups);
     102            $items = $this->convertToXmlElement('items', 'item', $this->getAgentsListData());
     103            $agents->appendChild($items);   
     104            $refbooks->appendChild($agents);
     105        }
     106        // Выгрузка справочника номенклатуры
     107        if (in_array('nomenclature', $this->refbooks_list)) {
     108            $nomenclature = $this->dom->createElement('nomenclature');
     109            // Номенклатурные группы
     110            $groups = $this->convertToXmlElement('groups', 'group', $this->getNomenclatureGroupsData());
     111            $nomenclature->appendChild($groups);
     112            $items = $this->convertToXmlElement('items', 'item', $this->getNomenclatureListData());
     113            $nomenclature->appendChild($items);   
     114            $refbooks->appendChild($nomenclature);
     115        }
     116        $this->rootNode->appendChild($refbooks);
     117           
     118        // Документы
     119        $documents = $this->convertToXmlElement('documents', 'document', $this->getDocumentsData() );
     120        $this->rootNode->appendChild($documents);
     121        return $this->dom->saveXML();
     122    }
     123
     124    /// Создаёт базовый DOM
     125    protected function createDom() {
     126        $this->dom = new \domDocument("1.0", "utf-8");
     127        $this->rootNode = $this->dom->createElement("multimag_exchange"); // Создаём корневой элемент
     128        $this->rootNode->setAttribute('version', '1.0');
     129        $this->dom->appendChild($this->rootNode);
     130        // Информация о выгрузке
     131        $result = $this->dom->createElement('result');            // Код возврата
     132        $result_code = $this->dom->createElement('status', 'ok');
     133        $result_desc = $this->dom->createElement('message', 'Ok');
     134        $result_timestamp = $this->dom->createElement('timestamp', time()-1);
     135        $result->appendChild($result_code);
     136        $result->appendChild($result_desc);
     137        $result->appendChild($result_timestamp);
     138        $this->rootNode->appendChild($result);
     139    }
    50140}
  • web/user.php

    r9bc0e68 r3ff8da1  
    160160                                        $cn=explode('.',$file);
    161161                                        include_once("$dir/$file");
    162                                         $class_name=$cn[0]."Worker";
     162                                        $class_name=$cn[0];
    163163                                        $class=new $class_name(0);
    164164                                        $nm=$class->getDescription();
Note: See TracChangeset for help on using the changeset viewer.