Changeset 3ff8da1
- Timestamp:
- Apr 2, 2015, 5:55:15 PM (8 years ago)
- Branches:
- master
- Children:
- d218185
- Parents:
- 9bc0e68
- Files:
-
- 5 added
- 20 edited
Legend:
- Unmodified
- Added
- Removed
-
cli/async.php
r9bc0e68 r3ff8da1 27 27 28 28 try { 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']}'"); 38 49 } 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 26 26 require_once($CONFIG['location']."/common/async/dbcheck.php"); 27 27 try { 28 $worker = new DbCheckWorker(0);28 $worker = new dbcheck(0); 29 29 $worker->run(); 30 30 } catch (Exception $e) { -
cli/ps_parser.php
r9bc0e68 r3ff8da1 26 26 27 27 try { 28 $worker=new PsParserWorker(0);28 $worker=new psparser(0); 29 29 $worker->run(); 30 30 } -
common/async/dbcheck.php
r9bc0e68 r3ff8da1 24 24 25 25 /// Ассинхронный обработчик. Перепроводка документов и перерасчёт контрольных значений в таблицах базы данных. 26 class DbCheckWorkerextends AsyncWorker {26 class dbcheck extends AsyncWorker { 27 27 28 28 function getDescription() { … … 103 103 $buy_time = date("Y-m-d H:i:s", $doc_info[0]); 104 104 //echo "$buy_time\n"; 105 break; 105 106 } 106 107 $db->query("INSERT INTO `buytime_tmp` VALUES ({$pos_data[0]}, '$buy_time')"); -
common/async/psparser.php
r9bc0e68 r3ff8da1 24 24 25 25 /// Ассинхронный обработчик. Анализ статистики переходов на сайт и выборка информации о переходах с поисковиков, и текстах запросов 26 class PsParserWorker extends AsyncWorker {26 class psparser extends AsyncWorker { 27 27 28 29 30 28 function getDescription() { 29 return "Анализ статистики переходов на сайт и выборка информации о переходах с поисковиков"; 30 } 31 31 32 33 32 function run() { 33 global $CONFIG, $db; 34 34 35 35 $res = $db->query("select `data` from `ps_parser` where `parametr` = 'last_time_counter'"); 36 36 37 38 37 if ($last_time_counter = $res->fetch_row()) { 38 $last_time_counter = intval($last_time_counter[0]); 39 39 40 41 42 43 44 45 46 47 48 49 50 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 .= " )"; 51 51 52 53 54 55 56 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); // У меня в локале были проблемы, так что тоже может быть ненужным 57 57 58 59 58 $str = trim($str); 59 //echo $str."\n"; 60 60 61 61 $last_time_counter = intval($refer_query_data[0]); 62 62 63 63 $true_ref = false; 64 64 65 66 67 68 69 70 71 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"; 72 72 73 73 $true_ref = true; 74 74 75 76 77 78 79 80 81 82 83 84 85 86 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 } 88 88 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 } 104 105 105 function finalize() { 106 } 106 function finalize() { 107 108 } 107 109 108 110 } 109 110 ;111 ?> -
common/asyncworker.php
r9bc0e68 r3ff8da1 60 60 } 61 61 62 } ;62 } 63 63 64 64 65 ?> -
common/core.common.php
r9bc0e68 r3ff8da1 18 18 // 19 19 20 define("MULTIMAG_REV", "7 50");20 define("MULTIMAG_REV", "760"); 21 21 define("MULTIMAG_VERSION", "0.2.".MULTIMAG_REV); 22 22 … … 286 286 /// @param key_value Значение ключа, по которому производится выборка. Будет приведено к целому типу. 287 287 /// @param array Массив со значениями, содержащими имена полей 288 /// @return В случае успеха возвращает ассоциативный массив с данными. В случае sql ошибки вернёт false. В случае, если искомого значения нет в таблице, вернет пустую строку для такого значения288 /// @return В случае успеха возвращает ассоциативный массив с данными. В случае, если искомого значения нет в таблице, вернет пустую строку для такого значения 289 289 function selectFieldKA($table, $key_name, $key_value, $array) { 290 290 settype($key_value, 'int'); 291 291 $a = array_fill_keys($array, ''); 292 292 $res = $this->query('SELECT `param`, `value` FROM `' . $table . '` WHERE `' . $key_name . '`=' . $key_value); 293 if (!$res) {294 return false;295 }296 293 while ($line = $res->fetch_row()) { 297 294 if (array_key_exists($line[0], $a)) { … … 415 412 416 413 } 414 415 /// @brief Возвращает строку с информацией о различиях между двумя наборами данных в массивах 416 /// Массив new должен содержать все индексы массива old 417 /// Используется для внесения информации в журнал 418 /// @param old Старый набор данных (массив) 419 /// @param new Новый набор данных (массив) 420 function 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 167 167 UNLOCK TABLES; 168 168 169 170 171 DROP TABLE IF EXISTS `comments`; 172 CREATE 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 169 193 -- 170 194 -- Table structure for table `class_country` 171 195 -- 172 173 196 DROP TABLE IF EXISTS `class_country`; 174 197 /*!40101 SET @saved_cs_client = @@character_set_client */; … … 2035 2058 LOCK TABLES `ps_settings` WRITE; 2036 2059 /*!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);2060 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); 2038 2061 /*!40000 ALTER TABLE `ps_settings` ENABLE KEYS */; 2039 2062 UNLOCK TABLES; … … 2497 2520 KEY `jid` (`jid`), 2498 2521 KEY `agent_id` (`agent_id`) 2499 ) ENGINE=InnoDB AUTO_INCREMENT=1210DEFAULT CHARSET=utf8 PACK_KEYS=1;2522 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=1; 2500 2523 /*!40101 SET character_set_client = @saved_cs_client */; 2501 2524 … … 2849 2872 /*!40101 SET character_set_client = utf8 */; 2850 2873 CREATE TABLE `variables` ( 2851 `corrupted` tinyint(4) NOT NULL COMMENT ' Признак Ð½Ð°Ñ€ÑƒÑˆÐµÐ½Ð¸Ñ Ñ†ÐµÐ»Ð¾ÑтноÑти',2874 `corrupted` tinyint(4) NOT NULL COMMENT 'Служебные переменные системы', 2852 2875 `recalc_active` int(9) NOT NULL 2853 2876 ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -
web/1c_sync.php
r9bc0e68 r3ff8da1 21 21 include_once("include/doc.core.php"); 22 22 23 class NotAuthException extends Exception { 24 25 } 26 23 27 // Проверка необходимости перехода на https 24 28 if(!@$_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']); 27 30 } 28 29 30 31 31 32 try { 32 33 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("Неверная пара логин / пароль. Попробуйте снова."); 43 52 } 44 53 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']; 48 67 49 $db->startTransaction(); 68 if(!isAccess('doc_1csync', 'exec', true)) { 69 throw new \Exception("Отсутствуют необходимые привилегии" ); 70 } 50 71 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'); 55 76 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 65 107 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 } 109 catch (NotAuthException $e) { 110 header('WWW-Authenticate: Basic realm="' . @$CONFIG['site']['name'] . '"'); 111 header('HTTP/1.0 401 Unauthorized'); 112 echo $e->getMessage(); 113 } 114 catch (Exception $e) { 133 115 $dom = new domDocument("1.0", "utf-8"); 134 116 $root = $dom->createElement("multimag_exchange"); // Создаём корневой элемент … … 146 128 echo $dom->saveXML(); 147 129 } 130 131 unset($_SESSION['uid']); -
web/core.php
r9bc0e68 r3ff8da1 315 315 $_SESSION['last_page']=$_SERVER['REQUEST_URI']; 316 316 $_SESSION['cook_test']='data'; 317 header('Location:/login.php');318 $tmpl->msg("Для продолжения необходимо выполнить вход!","info","Требуется аутентификация");317 redirect('/login.php'); 318 //$tmpl->msg("Для продолжения необходимо выполнить вход!","info","Требуется аутентификация"); 319 319 $tmpl->write(); 320 320 exit(); … … 352 352 if((!$uid) && (!$access) && (!$no_redirect)) need_auth(); 353 353 return $access; 354 } 355 356 // Проверка, не принадлежит ли текущая сессия другому пользователю 357 function 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 } 354 370 } 355 371 … … 912 928 913 929 $tmpl=new BETemplate; 930 testForeignSession(); 914 931 915 932 $dop_status=array('new'=>'Новый', 'err'=>'Ошибочный', 'inproc'=>'В процессе', 'ready'=>'Готов', 'ok'=>'Отгружен'); -
web/include/authenticator.php
r9bc0e68 r3ff8da1 43 43 `reg_email`, `reg_phone`, `reg_email_confirm`, `reg_phone_confirm`, `reg_email_subscribe`, `reg_phone_subscribe`, 44 44 `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` 46 47 FROM `users` 47 48 LEFT JOIN `users_worker_info` ON `user_id`=`users`.`id` "; -
web/include/doc.core.php
r9bc0e68 r3ff8da1 606 606 /// @sa DocPodZakaz DocVPuti 607 607 /// 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` 608 function 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` 615 614 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 616 615 AND `doc_list`.`id` NOT IN (SELECT DISTINCT `p_doc` FROM `doc_list` … … 619 618 WHERE `doc_list_pos`.`tovar`=$pos_id 620 619 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; 626 626 } 627 627 … … 631 631 /// @sa DocRezerv DocVPuti 632 632 /// 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` 633 function 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` 641 642 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' ) 642 643 WHERE `doc_list_pos`.`tovar`=$pos_id 643 644 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; 648 651 } 649 652 … … 653 656 /// @sa DocPodZakaz DocVPuti 654 657 /// 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` 658 function 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` 662 664 INNER JOIN `doc_list` ON `doc_list`.`type`='12' AND `doc_list`.`ok`>'0' AND `doc_list`.`id`!=$doc_id 663 665 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' ) 664 666 WHERE `doc_list_pos`.`tovar`=$pos_id 665 667 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; 670 674 } 671 675 672 676 /// Создаёт класс документа по ID документа, используя AutoDocumentType 673 677 /// @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 678 function 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); 682 686 } 683 687 … … 685 689 /// @sa selectAgentGroup 686 690 function selectAgentGroupRecursive($group_id, $prefix, $selected, $leaf_only) { 687 688 689 690 691 while($line = $res->fetch_row()) {692 $sel = ($selected==$line[0])?' selected':'';693 $deep = selectAgentGroupRecursive($line[0], $prefix.'| ', $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 697 698 699 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 . '| ', $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; 700 704 } 701 705 … … 708 712 /// @param leaf_only Флаг возможности выбора только "листьев" в дереве групп 709 713 /// @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; 714 function 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; 716 721 } 717 722 … … 719 724 /// @sa selectGroupPos 720 725 function selectGroupPosRecursive($group_id, $prefix, $selected, $leaf_only) { 721 722 723 724 725 while($line = $res->fetch_row()) {726 $sel = ($selected==$line[0])?' selected':'';727 $deep = selectGroupPosRecursive($line[0], $prefix.'| ', $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 731 732 733 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 . '| ', $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; 734 739 } 735 740 … … 742 747 /// @param leaf_only Флаг возможности выбора только "листьев" в дереве групп 743 748 /// @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 ?> 749 function 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 320 320 $pdf->Cell(0,4,$str,'B',1,'L',0); 321 321 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 324 325 $str = iconv('UTF-8', 'windows-1251', "Сумма"); 325 326 $pdf->Cell(90,4,'','B',0,'L',0); … … 424 425 $pdf->MultiCell(0,4,$str_osn,0,'L',0); 425 426 $pdf->SetY($y+8); 426 $sum_r = floor($this->doc_data['sum']); 427 $sum_c = round(($this->doc_data['sum']-$sum_r)*100); 427 428 428 $str = iconv('UTF-8', 'windows-1251', "Сумма"); 429 429 $pdf->Cell(10,4,$str,0,0,'L',0); -
web/include/doc_scripts/zp_s_prodaj.php
r9bc0e68 r3ff8da1 182 182 $incost = getInCost($nxt_tov['tovar'], $nxt['date']); 183 183 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 ); 185 185 } else { 186 186 $nach_sum += ($nxt_tov['cost'] - $incost) * $this->coeff * $nxt_tov['cnt']; -
web/include/modules/site/cabinet.php
r9bc0e68 r3ff8da1 47 47 } 48 48 49 /// Отобразить страницу новостей50 /// @param mode: '' - список новостей49 /// Отобразить страницу личного кабинета 50 /// @param mode: раздел личного кабинета 51 51 public function ExecMode($mode = '') { 52 52 global $tmpl, $CONFIG, $db; … … 243 243 } 244 244 245 /// Сформировать HTML код формы запроса на доработку 245 246 public function getFeedbackForm($token, $fields) { 246 247 $a = $this->getFormAction(); … … 343 344 } 344 345 346 /// Обработчик обновления пользовательского профиля 345 347 public function tryShowProfile() { 346 348 global $tmpl, $db; … … 378 380 } 379 381 382 /// Обработчик смены адреса электронной почты 380 383 public function tryChangeEmail() { 381 384 global $tmpl; … … 398 401 } 399 402 403 /// Обработчик смены номера телефона 400 404 public function tryChangePhone() { 401 405 global $tmpl; … … 449 453 } 450 454 455 /// Получить PDF форму документа 451 456 public function getDocPdf() { 452 457 global $db, $CONFIG; … … 476 481 } 477 482 483 /// Отобразить журнал ошибок 478 484 public function viewErrorLog() { 479 485 global $tmpl, $db, $CONFIG; … … 572 578 } 573 579 574 580 /// Отобразить форму запроса на доработку 575 581 public function viewFeedbackForm() { 576 582 global $tmpl, $CONFIG; … … 651 657 } 652 658 659 /// Отправить запрос на доработку программы 653 660 public function sendFeedback() { 654 661 global $tmpl, $CONFIG; -
web/include/modules/site/login.php
r9bc0e68 r3ff8da1 142 142 $err_msgs = array_merge($err_msgs, $errors); 143 143 } 144 var_dump($err_msgs);145 144 146 145 $form_action = $this->getFormAction(); … … 296 295 297 296 /// Сформировать HTML код формы выбора вариантов восстановления забытого пароля 297 /// @param $session_key Сессионный ключ 298 /// @param $email Адрес электронной почты 299 /// @param $phone Номер телефона 300 /// @param $openid_list Массив с openid идентификаторами 298 301 public function getPassRecoveryTypesForm($session_key, $email, $phone, $openid_list) { 299 302 $form_action = $this->getFormAction(); … … 556 559 else { 557 560 $user_info = $auth->getUserInfo(); 561 $db->update('users', $user_info['id'], 'last_session_id', session_id()); 558 562 $auth->addHistoryLine('password'); 563 unset($_SESSION['another_device']); 559 564 $_SESSION['uid'] = $user_info['id']; 560 565 $_SESSION['name'] = $user_info['name']; … … 577 582 } 578 583 if($need_form) { 584 if(@$_SESSION['another_device']) { 585 $tmpl->errorMessage("Выполнен вход с другого устройства! Для продолжения работы необходимо пройти повторную аутентификацию, " 586 . "либо <a href='/login.php?mode=logout'>прервать сессию</a>!"); 587 } 579 588 if (isset($_REQUEST['cont'])) { 580 589 $tmpl->addContent("<div id='page-info'>Для доступа в этот раздел Вам необходимо пройти аутентификацию.</div>"); … … 963 972 unset($_SESSION['uid']); 964 973 unset($_SESSION['name']); 974 unset($_SESSION['another_device']); 965 975 redirect("/index.php"); 966 976 } -
web/include/pricecalc.php
r9bc0e68 r3ff8da1 446 446 } 447 447 448 449 ?> -
web/include/sync/dataexport.php
r9bc0e68 r3ff8da1 19 19 namespace sync; 20 20 21 class DataExport { 22 protected $db; 23 21 class 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 24 29 /// Конструктор 25 30 /// @param $db Объект связи с базой данных 26 31 public function __construct($db) { 27 32 $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 30 70 protected function getDataFromMysqlQuery($query) { 31 71 $ret = array(); … … 60 100 return 'doveren'; 61 101 case 11: 62 return ' redlojenie';102 return 'predlojenie'; 63 103 case 12: 64 104 return 'v_puti'; … … 118 158 119 159 /// Получить данные справочника списка агентов 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`, 123 165 `pfio` AS `cpreson_fio`, `pdol` AS `cperson_post`, `okved` AS `okved`, `okpo` AS `okpo`, `ogrn` AS `ogrn`, `pasp_num` AS `passport_num`, 124 166 `pasp_date` AS `passport_date`, `pasp_kem` AS `passport_source_info`, `comment`, `data_sverki` AS `revision_date`, 125 167 `dishonest` AS `dishonest`, `p_agent` AS `p_agent_id`, `price_id` AS `price_id`, `tel`, `sms_phone`, `fax_phone`, `alt_phone`, `email`, 126 168 `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 129 178 while($line = $res->fetch_assoc()) { 130 179 // Тип агента … … 258 307 259 308 /// Получить документы 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` 264 314 FROM `doc_list` 265 WHERE `date`>=' $from_date' AND `date`<='$to_date'");315 WHERE `date`>='{$this->start_time}' AND `date`<='{$this->end_time}'"); 266 316 while($line = $res->fetch_assoc()) { 267 317 $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']); 268 322 // Дополнительные данные документа - преобразование в корректную форму 269 323 $dop_res = $this->db->query("SELECT `param`, `value` FROM `doc_dopdata` WHERE `doc`='{$line['id']}'"); … … 314 368 $line['positions'] = $positions; 315 369 } 316 317 370 $ret[$line['id']] = $line; 318 371 } -
web/include/sync/xml1cdataexport.php
r9bc0e68 r3ff8da1 20 20 21 21 /// Класс формирования XML файла для обмена с 1с 22 class Xml1cDataExport extends \sync\DataExport { 23 public $dom; //< Объект DOMDocument 24 22 class Xml1cDataExport extends \sync\dataexport { 23 protected $dom; //< Объект DOMDocument 24 protected $rootNode; //< Корневой элемент 25 26 25 27 /// Преобразовывает ассоциативный многоуровневый массив $data в DOMElement 26 28 /// @param $group_node_name Имя создвавемого элемента списка … … 48 50 return $res_node; 49 51 } 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 } 50 140 } -
web/user.php
r9bc0e68 r3ff8da1 160 160 $cn=explode('.',$file); 161 161 include_once("$dir/$file"); 162 $class_name=$cn[0] ."Worker";162 $class_name=$cn[0]; 163 163 $class=new $class_name(0); 164 164 $nm=$class->getDescription();
Note: See TracChangeset
for help on using the changeset viewer.