PageRenderTime 43ms CodeModel.GetById 30ms RepoModel.GetById 1ms app.codeStats 1ms

/engine/functions/classes/class_cron.php

https://github.com/Pankrashingo/cms-landing
PHP | 4032 lines | 3041 code | 683 blank | 308 comment | 344 complexity | e1d46bcdf34e2989a208985fe1fd66c9 MD5 | raw file
Possible License(s): LGPL-2.1, MPL-2.0-no-copyleft-exception
  1. <?php
  2. include_once(__ENGINE_PATH.'/functions/subfunctions/file_functions.php');
  3. class Cron
  4. {
  5. protected $db;
  6. public function __construct(&$db)
  7. {
  8. $this->db=&$db;
  9. }
  10. /**
  11. * Блок функций для контроля исполнения cron
  12. */
  13. /**
  14. * Запись в базу в момент запуска крона
  15. * @param $name
  16. * @param $interval
  17. * @return int OR false
  18. */
  19. public function cron_start($name, $interval){
  20. $sql="INSERT INTO `cron_report` (`name`,`interval`,`starttime`) VALUES('{$name}', {$interval}, NOW())";
  21. if(!$this->db->query($sql)) {
  22. $this->cron_bugreport("Ошибка старта крон-задания: {$name}.");
  23. return false;
  24. }
  25. return $this->db->get_insert_id();
  26. }
  27. /**
  28. * Промежуточное обновления крон отчёта
  29. * @param $id
  30. * @param $data
  31. * @return bool
  32. */
  33. public function cron_update_report($id, $data){
  34. $sql="UPDATE `cron_report` SET `report_data`='{$data}' WHERE `id`={$id}";
  35. if(!$this->db->query($sql)) return false;
  36. return true;
  37. }
  38. /**
  39. * Получить время последнего выполнения крона по name
  40. * @param $name
  41. * @return datetime OR false
  42. */
  43. public function get_last_runtime($name){
  44. $sql = "SELECT `starttime` FROM `cron_report` WHERE `name`='{$name}' ORDER BY `id` DESC LIMIT 1";
  45. $this->db->query($sql);
  46. $result = $this->db->get_result();
  47. if(count($result)){
  48. return $result[0]['starttime'];
  49. }
  50. return false;
  51. }
  52. /**
  53. *
  54. * Крон завершен - обновить отчёт
  55. * @param $id
  56. * @param $data
  57. * @return bool
  58. */
  59. public function cron_stop($id, $data){
  60. $sql="UPDATE `cron_report` SET `stoptime`=NOW(), `report_data`='{$data}' WHERE `id`={$id}";
  61. if(!$this->db->query($sql)) {
  62. $this->cron_bugreport("Ошибка остановки крон-задания: #{$id}.");
  63. file_put_contents(__LOG_ERROR_PATH.'/cronstop.txt',gmdate('d-m-Y H:i')."SQL: {$sql}, ID: {$id}\n",FILE_APPEND);
  64. return false;
  65. }
  66. return true;
  67. }
  68. /**
  69. * Отправка ошибки админу
  70. * @param $msg
  71. */
  72. public function cron_bugreport($msg){
  73. include_once(__ENGINE_PATH.'/functions/classes/class_mailer.php');
  74. $mailer=new Mailer();
  75. $mailer->mail(__SUPPORT_EMAIL, 'Багрепорт: ошибка при выполнении cron-задачи', $msg);
  76. }
  77. /**
  78. * Список отчётов
  79. * @param string $where
  80. * @return array
  81. */
  82. public function cron_get_reports($where = ''){
  83. $sql = "SELECT * FROM `cron_report`";
  84. if(strlen($where)) $sql .= " WHERE {$where}";
  85. $sql .= " ORDER BY `id` DESC";
  86. $this->db->query($sql);
  87. return $this->db->get_result();
  88. }
  89. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  90. //add remined event to write review
  91. public function remind_users_make_reviews(){
  92. $func_report = array("users_count"=>0, "guest_count"=>0);
  93. $users_no_visits = array();//юзеры, которые возможно долго не заходили на сайт и получается, что не видили первое оповещение(спустя 4 дня)
  94. $user_timetables = array();
  95. $sql="SELECT DISTINCTROW UNIX_TIMESTAMP(t.`date`) as `date`,t.`id` as `timetable_id`,t.`date_text`,a.`id` as `action_id`,a.`type`, a.`alias` as `action_link`, a.`name` as `action_name`,o.`user_id`
  96. FROM `timetable_orders` o force index (`user_id_type`)
  97. INNER JOIN `timetable` t ON o.`timetable_id`=t.`id`
  98. INNER JOIN `actions` a ON t.`action_id`=a.`id`
  99. LEFT JOIN `reviews` r ON r.`user_id`=o.`user_id` AND r.`object_type`=3 AND r.`object_id`=a.`id`
  100. WHERE o.`type`<3 AND
  101. o.`user_id`>0 AND
  102. r.`id` is NULL AND
  103. (
  104. (a.`type` NOT IN(2,3,6) AND (DATE(t.`date`)=DATE(NOW()-INTERVAL 4 DAY) OR DATE(t.`date`)=DATE(NOW()-INTERVAL 14 DAY)) )
  105. OR
  106. (a.`type` IN(2,3) AND DATE(o.`date`)=DATE(NOW()-INTERVAL 14 DAY))
  107. ) AND
  108. o.`user_id`!=a.`owner_id`
  109. ORDER BY o.`user_id`";
  110. $this->db->query($sql);
  111. $result=$this->db->get_result();
  112. if(count($result)){
  113. include_once(__ENGINE_PATH.'/functions/classes/class_eventer.php');
  114. $eventer=new Eventer($this->db);
  115. foreach($result as $item){
  116. //записываем id юзеров, чтобы проверить дату последнего визита сайта
  117. if(gmdate("d", $item["date"]) === gmdate("d", (time()-14*24*3600)) || in_array($item["type"], array(2,3,6))){
  118. $users_no_visits[] = $item["user_id"];
  119. $user_timetables[$item["user_id"]][] = array("action_link"=>$item["action_link"],"action_name"=>$item["action_name"],"timetable_id"=>$item["timetable_id"]);
  120. }
  121. $eventer->add_event(1,10,array($item['user_id']=>$item['user_id']),0,$item['action_id'],3,$item['timetable_id'],6,'',gmdate("Y-m-d",time()));
  122. }
  123. }
  124. //теперь проверим дату последнего посещения
  125. if(count($users_no_visits)){
  126. $sql="SELECT MAX(v.`date`) as `date`, v.`user_id`,u.`email`,u.`name`
  127. FROM `visits` v
  128. JOIN `users` u ON u.`id`=v.`user_id`
  129. WHERE
  130. v.`user_id` IN (".join(", ", $users_no_visits).")
  131. GROUP BY
  132. v.`user_id`
  133. HAVING
  134. MAX( v.`date`) <= (NOW()-INTERVAL 10 DAY)
  135. ORDER BY
  136. v.`date` DESC
  137. ";
  138. $this->db->query($sql);
  139. $result3=$this->db->get_result();
  140. if(count($result3)){
  141. global $object_types;
  142. include_once(__ENGINE_PATH.'/functions/classes/class_mailer.php');
  143. $mailer = new Mailer();
  144. foreach($result3 as $value){
  145. if(!trim($value["email"]))
  146. continue;
  147. foreach($user_timetables[$value["user_id"]] as $timetable_data){
  148. $msg = "";
  149. $subject = "";
  150. $action_link="/".$object_types[3]['url']."/".$timetable_data["action_link"]."/".($timetable_data["timetable_id"] ? "?date=".$timetable_data["timetable_id"] : "");
  151. $action_name=$timetable_data["action_name"];
  152. $user_name=$value["name"];
  153. include(__ENGINE_PATH."/templates/email.user_review_remind.php");
  154. if(@$mailer->mail($value["email"], $subject, $msg)) $func_report["users_count"] += 1;
  155. }
  156. }
  157. }
  158. }
  159. //напоминаем об отзыве гостям, подававшим заявку
  160. $sql = "
  161. SELECT
  162. t.`id` as `timetable_id`, a.`alias` as `action_link`, a.`name` as `action_name`, o.`email`, o.`name` as `guest_name`
  163. FROM `timetable_orders` o
  164. INNER JOIN `timetable` t ON o.`timetable_id`=t.`id`
  165. INNER JOIN `actions` a ON t.`action_id`=a.`id`
  166. WHERE
  167. o.`type`<3
  168. AND o.`user_id`=0
  169. AND o.`email` != ''
  170. AND (
  171. (a.`type` NOT IN(2,3,6) AND DATE(t.`date`)=DATE(NOW()-INTERVAL 4 DAY))
  172. OR
  173. (a.`type` IN(2,3) AND DATE(o.`date`)=DATE(NOW()-INTERVAL 14 DAY))
  174. )
  175. GROUP BY
  176. o.`order_id`
  177. ";
  178. $this->db->query($sql);
  179. $result2=$this->db->get_result();
  180. if(count($result2)){
  181. global $object_types;
  182. include_once(__ENGINE_PATH.'/functions/classes/class_mailer.php');
  183. $mailer = new Mailer();
  184. foreach($result2 as $value){
  185. if(!trim($value["email"]))
  186. continue;
  187. $msg = "";
  188. $subject = "";
  189. $action_link="/".$object_types[3]['url']."/".$value["action_link"]."/".($value["timetable_id"] ? "?date=".$value["timetable_id"] : "");
  190. $action_name=$value["action_name"];
  191. $guest_name=$value["guest_name"];
  192. include(__ENGINE_PATH."/templates/email.guest_review_remind.php");
  193. if(@$mailer->mail($value["email"], $subject, $msg)) $func_report["guest_count"] += 1;
  194. }
  195. }
  196. return "пользователям отправлено писем - ".$func_report["users_count"].", гостям отправлено писем - ".$func_report["guest_count"];
  197. }
  198. //send reminder to check actual information to object`s owners
  199. public function actuality_broodcast($actuality_days=180)
  200. {
  201. $mail_count=0;
  202. $sql='';
  203. global $object_types;
  204. $result=array();
  205. foreach($object_types as $key=>$object_type)
  206. {
  207. if(in_array($key,array(2,3,6,7,8,12,13,14)))continue;
  208. elseif($key==1){
  209. $sql="SELECT UNIX_TIMESTAMP(o.`created`) as `created`,o.`id`,u.`email`,u.`login`,u.`name` as `user_name`,u.`surname` ,COALESCE(h.`action_type`,0) as `action_type`, DATEDIFF( NOW(), MAX(COALESCE(h.`date`,o.`created`) )) AS `exist` ,o.`owner_id`,o.`name`,o.`alias`,{$key} as `object_type`, 0 as `type`, obr.`region`, obr.`id_object_regions`
  210. FROM `{$object_type['class']}` o
  211. LEFT JOIN `users` u ON o.`owner_id`=u.`id`
  212. LEFT JOIN `object_regions` obr ON obr.`object_type` IN(1,5) AND obr.`object_id`=o.`id` AND obr.`main_link`=1
  213. LEFT JOIN `objects_history` h ON h.`object_id`=o.`id` AND h.`object_type`={$key} AND h.`action_type` IN(1,2,3) /*AND h.`user_id`=o.`owner_id`*/
  214. WHERE o.`moderated`=1 AND o.`block`=0 AND o.`is_treiner`=1 AND o.`owner_id`!=30 AND u.`group`=1
  215. GROUP BY o.`id`
  216. HAVING (DATEDIFF(NOW(), MAX(COALESCE(h.`date`,o.`created`)))>0) AND (DATEDIFF(NOW(), MAX(COALESCE(h.`date`,o.`created`)))%{$actuality_days})=0
  217. ORDER BY MAX(COALESCE(h.`date`,o.`created`)) ASC,`id_object_regions` ASC";
  218. $this->db->query($sql);
  219. $result=array_merge($result,$this->db->get_result());
  220. }elseif($key==5){
  221. $sql="SELECT UNIX_TIMESTAMP(o.`created`) as `created`,o.`id`,u.`email`,u.`login`,u.`name` as `user_name`,u.`surname` ,COALESCE(h.`action_type`,0) as `action_type`, DATEDIFF( NOW(), MAX(COALESCE(h.`date`,o.`created`) )) AS `exist` ,o.`owner_id`,o.`name`,o.`alias`,{$key} as `object_type`, 0 as `type`, obr.`region`, obr.`id_object_regions`
  222. FROM `{$object_type['class']}` o
  223. LEFT JOIN `users` u ON o.`owner_id`=u.`id`
  224. LEFT JOIN `object_regions` obr ON obr.`object_type` IN(1,5) AND obr.`object_id`=o.`id` AND obr.`main_link`=1
  225. LEFT JOIN `objects_history` h ON h.`object_id`=o.`id` AND h.`object_type`={$key} AND h.`action_type` IN(1,2,3) /*AND h.`user_id`=o.`owner_id`*/
  226. WHERE o.`moderated`=1 AND o.`block`=0 AND o.`is_treiner`=0 AND o.`is_consultant`=1 AND o.`owner_id`!=30 AND u.`group`=1
  227. GROUP BY o.`id`
  228. HAVING (DATEDIFF(NOW(), MAX(COALESCE(h.`date`,o.`created`)))>0) AND (DATEDIFF(NOW(), MAX(COALESCE(h.`date`,o.`created`)))%{$actuality_days})=0
  229. ORDER BY MAX(COALESCE(h.`date`,o.`created`)) ASC,`id_object_regions` ASC";
  230. $this->db->query($sql);
  231. $result=array_merge($result,$this->db->get_result());
  232. }elseif($key==9){
  233. include_once(__ENGINE_PATH."/functions/classes/class_esoterics.php");
  234. $esoterics=new Esoterics($this->db);
  235. foreach($esoterics->esoteric_type as $key2=>$type)
  236. {
  237. $sql="SELECT UNIX_TIMESTAMP(o.`created`) as `created`,o.`id`,u.`email`,u.`login`,u.`name` as `user_name`,u.`surname` ,COALESCE(h.`action_type`,0) as `action_type`, DATEDIFF( NOW(), MAX(COALESCE(h.`date`,o.`created`) )) AS `exist` ,o.`owner_id`,o.`name`,o.`alias`,9 as `object_type`, o.`type`, obr.`region`, obr.`id_object_regions`
  238. FROM `{$object_type['class']}` o
  239. LEFT JOIN `users` u ON o.`owner_id`=u.`id`
  240. LEFT JOIN `object_regions` obr ON obr.`object_type`={$key} AND obr.`object_id`=o.`id` AND obr.`main_link`=1
  241. LEFT JOIN `objects_history` h ON h.`object_id`=o.`id` AND h.`object_type`={$key} AND h.`action_type` IN(1,2,3) /*AND h.`user_id`=o.`owner_id`*/
  242. WHERE o.`moderated`=1 AND o.`block`=0 AND o.`type`={$key2} AND o.`owner_id`!=30 AND u.`group`=1
  243. GROUP BY o.`id`
  244. HAVING (DATEDIFF(NOW(), MAX(COALESCE(h.`date`,o.`created`)))>0) AND (DATEDIFF(NOW(), MAX(COALESCE(h.`date`,o.`created`)))%{$actuality_days})=0
  245. ORDER BY MAX(COALESCE(h.`date`,o.`created`)) ASC,`id_object_regions` ASC";
  246. $this->db->query($sql);
  247. $result=array_merge($result,$this->db->get_result());
  248. }
  249. }elseif($key!=12){
  250. $sql="SELECT UNIX_TIMESTAMP(o.`created`) as `created`,o.`id`,u.`email`,u.`login`,u.`name` as `user_name`,u.`surname` ,COALESCE(h.`action_type`,0) as `action_type`, DATEDIFF( NOW(), MAX(COALESCE(h.`date`,o.`created`) )) AS `exist` ,o.`owner_id`,o.`name`,o.`alias`,{$key} as `object_type`, 0 as `type`, obr.`region`, obr.`id_object_regions`
  251. FROM `{$object_type['class']}` o
  252. LEFT JOIN `users` u ON o.`owner_id`=u.`id`
  253. LEFT JOIN `object_regions` obr ON obr.`object_type`={$key} AND obr.`object_id`=o.`id` AND obr.`main_link`=1
  254. LEFT JOIN `objects_history` h ON h.`object_id`=o.`id` AND h.`object_type`={$key} AND h.`action_type` IN(1,2,3) /*AND h.`user_id`=o.`owner_id`*/
  255. WHERE o.`moderated`=1 AND o.`block`=0 AND o.`owner_id`!=30 AND u.`group`=1
  256. GROUP BY o.`id`
  257. HAVING (DATEDIFF(NOW(), MAX(COALESCE(h.`date`,o.`created`)))>0) AND (DATEDIFF(NOW(), MAX(COALESCE(h.`date`,o.`created`)))%{$actuality_days})=0
  258. ORDER BY MAX(COALESCE(h.`date`,o.`created`)) ASC,`id_object_regions` ASC";
  259. $this->db->query($sql);
  260. $result=array_merge($result,$this->db->get_result());
  261. }else{
  262. $sql="SELECT UNIX_TIMESTAMP(o.`created`) as `created`,o.`id`,u.`email`,u.`login`,u.`name` as `user_name`,u.`surname` ,COALESCE(h.`action_type`,0) as `action_type`, DATEDIFF( NOW() , MAX(COALESCE(h.`date`,o.`created`) )) AS `exist` ,o.`owner_id`,o.`name`,o.`alias`,{$key} as `object_type`, 0 as `type`, 0 as `region`, 0 as `id_object_regions`
  263. FROM `{$object_type['class']}` o
  264. LEFT JOIN `users` u ON o.`owner_id`=u.`id`
  265. LEFT JOIN `objects_history` h ON h.`object_id`=o.`id` AND h.`object_type`={$key} AND h.`action_type` IN(1,2,3) /*AND h.`user_id`=o.`owner_id`*/
  266. WHERE o.`moderated`=1 AND o.`block`=0 AND o.`owner_id`!=30 AND u.`group`=1
  267. GROUP BY o.`id`
  268. HAVING (DATEDIFF(NOW(), MAX(COALESCE(h.`date`,o.`created`)))>0) AND (DATEDIFF(NOW(), MAX(COALESCE(h.`date`,o.`created`)))%{$actuality_days})=0
  269. ORDER BY MAX(COALESCE(h.`date`,o.`created`)) ASC";
  270. $this->db->query($sql);
  271. $result=array_merge($result,$this->db->get_result());
  272. }
  273. }
  274. $user_objects=array();
  275. global $new_region_codes;
  276. foreach($result as $item){
  277. if(!in_array($item['object_type'],array(9,12))){
  278. if($item['region']>0 && !in_array($item['object_type'],array(3,7,13))) $link='/'.$new_region_codes[$item['region']]['code'].'/'.$object_types[$item['object_type']]['url'].'/'.$item['alias'];
  279. else $link='/'.$object_types[$item['object_type']]['url'].'/'.$item['alias'];
  280. }elseif($item['object_type']!=12) $link='/'.$new_region_codes[$item['region']]['code'].'/'.$object_types[$item['object_type']]['url'.$item['type']].'/'.$item['alias'];
  281. else $link='/'.$object_types[$item['object_type']]['url'].'/';
  282. $user_objects[$item['owner_id']][0]=array('email'=>$item['email'],'login'=>$item['login'],'name'=>$item['user_name'],'surname'=>$item['surname']);
  283. if($item['object_type']==9) $item['object_type'].=$item['type'];
  284. $user_objects[$item['owner_id']][$item['object_type']][]=array('name'=>$item['name'],'alias'=>$item['alias'],'exist'=>$item['exist'],'link'=>$link,'type'=>$item['type'],'action_type'=>$item['action_type']);
  285. }
  286. if(count($user_objects)>0){
  287. include_once(__ENGINE_PATH.'/functions/classes/class_mailer.php');
  288. $mailer=new Mailer();
  289. foreach($user_objects as $item)
  290. {
  291. $subject='';
  292. $msg='';
  293. include(__ENGINE_PATH.'/templates/email.owners.broadcast.php');
  294. //echo $item[0]['email'].'<br/>'.$msg.'<br/><br/><br/>';
  295. if(!@$mailer->mail($item[0]['email'], $subject, $msg)) {
  296. trigger_error('Не удалось отправить напоминания о проверке актуальности объектов',E_USER_WARNING);
  297. }else $mail_count++;
  298. }
  299. }
  300. return "отправлено писем - ".$mail_count;
  301. }
  302. /**
  303. * Check media storage for avatars exist
  304. *
  305. */
  306. public function check_media_storage(){
  307. global $object_types;
  308. $sql='';
  309. foreach($object_types as $key=>&$value){
  310. if($key==5 || $key==6) continue;
  311. $sql.="SELECT {$key} as `object_type`,`id` FROM `{$value['class']}` UNION ";
  312. }
  313. unset($value);
  314. $sql=substr($sql,0,-7);
  315. $this->db->query($sql);
  316. $result=&$this->db->get_result();
  317. global $avatar_types;
  318. foreach($result as &$value){
  319. $path=__MEDIA_STORAGE_PATH.'/avatars/objects/'.$value['object_type'].'/'.$value['id'];
  320. if(!file_exists($path)){
  321. umask(0);
  322. if(@mkdir($path)){
  323. foreach($avatar_types as $key2=>&$value2){
  324. $path2=$path.'/'.$key2;
  325. if(!@mkdir($path2)) echo 'Не удалось создать '.$path2.'<br/>';
  326. }unset($value2);
  327. if($value['object_type']==4){
  328. $path2=$path.'/logotips';
  329. if(!@mkdir($path2)) echo 'Не удалось создать '.$path2.'<br/>';
  330. }
  331. }else echo 'Не удалось создать '.$path.' <br/>';
  332. }else {
  333. foreach($avatar_types as $key2=>&$value2){
  334. if(!file_exists($path.'/'.$key2)){
  335. umask(0);
  336. if(!@mkdir($path.'/'.$key2)) echo 'Не удалось создать '.$path.'/'.$key2.'<br/>';
  337. }unset($value2);
  338. }
  339. }
  340. if($value['object_type']==4 && !file_exists($path.'/logotips')){
  341. if(!mkdir($path.'/logotips')) echo 'Не удалось создать '.$path.'/logotips<br/>';
  342. }
  343. }
  344. unset ($value);
  345. $sql='SELECT u.`id` FROM `users` u';
  346. $this->db->query($sql);
  347. $result=&$this->db->get_result();
  348. foreach ($result as &$value) {
  349. $path=__MEDIA_STORAGE_PATH.'/avatars/users/'.$value['id'];
  350. if(!file_exists($path)){
  351. umask(0);
  352. if(@mkdir($path)){
  353. foreach($avatar_types as $key2=>&$value2){
  354. $path2=$path.'/'.$key2;
  355. if(!mkdir($path2)) echo 'Не удалось создать '.$path2.'<br/>';
  356. }unset($value2);
  357. }else echo 'Не удалось создать '.$path.' <br/>';
  358. }else {
  359. foreach($avatar_types as $key2=>&$value2){
  360. if(!file_exists($path.'/'.$key2)){
  361. umask(0);
  362. if(!@mkdir($path.'/'.$key2)) echo 'Не удалось создать '.$path.'/'.$key2.'<br/>';
  363. }unset($value2);
  364. }
  365. }
  366. }unset($value);
  367. $sql='SELECT p.`id`, p.`object_type`, p.`user_id`, p.`object_id` FROM `photoalbums` p';
  368. $this->db->query($sql);
  369. $result=&$this->db->get_result();
  370. global $image_types;
  371. foreach ($result as &$value) {
  372. if($value['user_id']>0)$path=__MEDIA_STORAGE_PATH.'/photos/users/'.$value['user_id'].'/'.$value['id'];
  373. else $path=__MEDIA_STORAGE_PATH.'/photos/objects/'.(($value['object_type']==5)?1:$value['object_type']).'/'.$value['object_id'].'/'.$value['id'];
  374. if(!file_exists($path)){
  375. umask(0);
  376. if(@mkdir($path)){
  377. foreach($image_types as $key2=>&$value2){
  378. if($key2==1)continue;
  379. $path2=$path.'/'.$key2;
  380. if(!@mkdir($path2)) echo 'Не удалось создать '.$path2.'<br/>';
  381. }unset($value2);
  382. }else echo 'Не удалось создать '.$path.' <br/>';
  383. }else {
  384. foreach($image_types as $key2=>&$value2){
  385. if($key2==1)continue;
  386. if(!file_exists($path.'/'.$key2)){
  387. umask(0);
  388. if(!@mkdir($path.'/'.$key2)) echo 'Не удалось создать '.$path.'/'.$key2.'<br/>';
  389. }
  390. }unset($value2);
  391. }
  392. }unset($value);
  393. }
  394. //рассылка юзерам, которые не заходили на сайт за опеределенный интервал времени
  395. public function email_broadcast($interval)
  396. {
  397. $sql="SELECT MAX(cv.`date`) as `maxdate`,MAX(UNIX_TIMESTAMP(cv.`date`)) as `date`,COUNT(DISTINCT e.`id`) as `events_count`,COUNT(DISTINCT m.`id`) as `message_count` ,u.`id` ,u.`login`,u.`email` ,u.`name`, u.`surname` ";
  398. include_once(__ENGINE_PATH.'/functions/classes/class_eventer.php');
  399. $eventer=new Eventer($this->db);
  400. foreach($eventer->event_types as $key=>$value){
  401. $sql.=" ,COUNT(DISTINCT IF(e.`type`={$key},e.`id`,NULL)) as `event_type_{$key}` ";
  402. }
  403. $sql.="FROM `users` u
  404. INNER JOIN `visits` cv ON cv.`user_id`=u.`id`
  405. LEFT JOIN `events` e ON e.`to`=u.`id` AND e.`to_readed`=0 AND e.`created`<NOW()
  406. LEFT JOIN `user_messages` m ON m.`to`=u.`id` AND m.`to_readed`=0
  407. WHERE u.`group`<50
  408. GROUP BY u.`id`
  409. HAVING DATEDIFF(NOW(),MAX( cv.`date`))>0 AND DATEDIFF(NOW(),MAX( cv.`date`))%{$interval}=0 AND (`events_count`>0 OR `message_count`>0)";
  410. if($this->db->query($sql))
  411. {
  412. include_once(__ENGINE_PATH.'/functions/classes/class_mailer.php');
  413. $mailer=new Mailer();
  414. include_once(__ENGINE_PATH.'/functions/classes/class_eventer.php');
  415. $eventer=new Eventer($this->db);
  416. $listeners=&$this->db->get_result();
  417. global $region_codes;
  418. $m_count=0;
  419. foreach($listeners as $adresat)
  420. {
  421. $user_id=$adresat['id'];
  422. $no_text=true;
  423. $subject='';
  424. $msg='';
  425. include(__ENGINE_PATH.'/functions/actions/users.reminder_all.php');
  426. if(count($result['important'])>0 || count($result['participation'])>0 || count($result['remind'])>0 || count($result['interesting'])>0){
  427. $adresat_email = $adresat['email'];
  428. include(__ENGINE_PATH.'/templates/email.broadcast.php');
  429. if(!@$mailer->mail($adresat['email'], $subject,$msg)) {
  430. echo ('Не удалось отправить информацию пользователям, не заходившим длительное время');
  431. }else {
  432. $m_count++;
  433. }
  434. }
  435. }
  436. return "отправлено писем - {$m_count}";
  437. }
  438. return false;
  439. }
  440. //рассыдка админам не заходившим на сайте $missing_days дней
  441. public function email_admins_broadcast($missing_days)
  442. {
  443. include_once(__ENGINE_PATH.'/functions/classes/class_eventer.php');
  444. $eventer=new Eventer($this->db);
  445. $sql="SELECT MAX(cv.`date`) as `maxdate`,MAX(UNIX_TIMESTAMP(cv.`date`)) as `date`,COUNT(DISTINCT e.`id`) as `events_count`,COUNT(DISTINCT m.`id`) as `message_count` ,u.`id` , ur.`region` ,u.`login`,u.`group`,u.`email` ,u.`name`, u.`surname` ";
  446. foreach($eventer->event_types as $key=>$value)
  447. {
  448. $sql.=" ,COUNT(DISTINCT IF(e.`type`={$key},e.`id`,NULL)) as `event_type_{$key}` ";
  449. }
  450. $sql.="FROM `users` u
  451. LEFT JOIN `users_regions` ur ON ur.`user_id`=u.`id`
  452. INNER JOIN `cms_visits` cv ON cv.`user_id`=u.`id`
  453. LEFT JOIN `events` e ON e.`to`=u.`id` AND e.`to_readed`=0 AND e.`created`<NOW()
  454. LEFT JOIN `user_messages` m ON m.`to`=u.`id` AND m.`to_readed`=0
  455. WHERE u.`group`>=90
  456. GROUP BY u.`id` , ur.`region`
  457. HAVING DATEDIFF(NOW(),MAX( cv.`date`))>0 AND DATEDIFF(NOW(),MAX( cv.`date`))%{$missing_days}=0";
  458. if($this->db->query($sql))
  459. {
  460. include_once(__ENGINE_PATH.'/functions/classes/class_mailer.php');
  461. $mailer=new Mailer();
  462. $listeners=&$this->db->get_result();
  463. global $region_codes;
  464. $m_count=0;
  465. include_once(__ENGINE_PATH.'/cms/functions/classes/class_objects.php');
  466. $object_objects=new Objects();
  467. foreach($listeners as $adresat)
  468. {
  469. $objects=&$object_objects->get_objects_count('(o.`moderated`=0 OR (om.`id` is not NULL AND om.`created`<(NOW()-INTERVAL '.__MAX_MODIFICATION_MODERATED_HOURS.' HOUR)) OR (om2.`id` is not NULL AND om2.`created`<(NOW()-INTERVAL '.__MAX_MODIFICATION_MODERATED_HOURS.' HOUR)))',$adresat['region'],$adresat['group']);
  470. $objects_count=$objects[0];
  471. //$censored=&$object_objects->get_objects_count(0,0,'` DESC',array('user_id'),'o.`censored`=1',0,0,$adresat['region'],true);
  472. $censored_count=0;
  473. $user_id=$adresat['id'];
  474. $no_text=true;
  475. include(__ENGINE_PATH.'/functions/actions/users.reminder_all.php');
  476. if( $objects_count > 0 || $censored_count >0 || count($result['important'])>0 || count($result['participation'])>0 || count($result['remind'])>0 || count($result['interesting'])>0)
  477. {
  478. $subject='';
  479. $msg='';
  480. $adresat_email = '';
  481. include(__ENGINE_PATH.'/templates/email.broadcast.php');
  482. if(!@$mailer->mail($adresat['email'], $subject,$msg)) {
  483. trigger_error('Не удалось отправить информацию об админах, не заходивших в CMS длительное время',E_USER_WARNING);
  484. }
  485. else $m_count++;
  486. }
  487. }
  488. return "отправлено писем - {$m_count}";
  489. }
  490. return false;
  491. }
  492. public function check_missing_filial_admins($actual_after_days,$emails)
  493. {
  494. $sql="SELECT MAX(cv.`date`) as `maxdate`,MAX(UNIX_TIMESTAMP(cv.`date`)) as `date`,cv.`user_id` ,u.`login`,u.`group` ,u.`name`, u.`surname`,GROUP_CONCAT(DISTINCT ur.`region`) as `regions`
  495. FROM `users` u
  496. LEFT JOIN `cms_visits` cv ON cv.`user_id`=u.`id`
  497. LEFT JOIN `users_regions` ur ON ur.`user_id`=u.`id`
  498. WHERE u.`group`>=80 AND u.`group`<100 AND u.`id`!=8439 /*татьяна*/
  499. GROUP BY cv.`user_id`
  500. HAVING `maxdate`<(NOW()-INTERVAL {$actual_after_days} DAY)";
  501. include_once(__ENGINE_PATH.'/functions/subfunctions/common.users_groups_arrays.php');
  502. if ($this->db->query($sql))
  503. {
  504. $admins=$this->db->get_result();
  505. //отправляем уведомление
  506. if(count($admins) > 0)
  507. {
  508. include_once(__ENGINE_PATH.'/functions/classes/class_mailer.php');
  509. $mailer=new Mailer();
  510. global $region_codes;
  511. $subject='';
  512. $msg='';
  513. include(__ENGINE_PATH.'/templates/email.missing_admins.php');
  514. if(!@$mailer->mail($emails, $subject,$msg)) {
  515. trigger_error('Не удалось отправить информацию об админах, не заходивших в CMS длительное время',E_USER_WARNING);
  516. }
  517. }
  518. }
  519. }
  520. //формируем таблицу последних посещений
  521. public function visit_last_days(){
  522. //обвновляем данные вспомогательной таблицы для посещений
  523. $sql='UPDATE `visits` SET `guest_id`=`user_id` WHERE `user_id`>0';
  524. $result=$this->db->query($sql);
  525. if(!$result) trigger_error('Не удалось обновить `visits`',E_USER_WARNING);
  526. $sql='TRUNCATE TABLE `visits_last_days`';
  527. if(!$result || !$this->db->query($sql)) {
  528. $result=false;
  529. trigger_error('Не удалось очистить `visits_last_days`',E_USER_WARNING);
  530. }
  531. $last_month=gmdate("Y-m-d",gmmktime(gmdate('H'),gmdate('i'),gmdate('s'),gmdate('m')-1,gmdate('d'),gmdate('Y')));
  532. $sql='INSERT INTO `visits_last_days` (`last_visit`,`object_type`,`object_id`,`user_id`,`guest_id`) SELECT MAX(`date`), `object_type`, `object_id`, `user_id`, `guest_id` FROM `visits` WHERE `date`>=\''.$last_month.'\' GROUP BY `object_type`, `object_id`, `guest_id`';
  533. if(!$result || !$this->db->query($sql)) {
  534. $result=false;
  535. trigger_error('Не удалось сформировать `visits_last_days`',E_USER_WARNING);
  536. }
  537. $sql='UPDATE `visits_last_days` SET `object_type`=1 WHERE `object_type`=5';
  538. if(!$result || !$this->db->query($sql)) {
  539. $result=false;
  540. trigger_error('Не удалось подготовить `visits_last_days` для консультантов',E_USER_WARNING);
  541. }
  542. return $result;
  543. }
  544. public function visits_intermediate_clear()
  545. {
  546. $func_report = array('replace'=>0, 'truncate'=>0);
  547. $this->db->query('SELECT MAX(`id`) as `max_id` FROM `visits_intermediate`');
  548. $id = $this->db->get_result();
  549. if (isset($id[0]['max_id'])) {
  550. $id = $id[0]['max_id'];
  551. if (is_numeric($id) && $id > 0) {
  552. if ($this->db->query('INSERT INTO `visits` SELECT `date`, `object_type`, `object_id`, `ip`, `browser`, `user_id`, `guest_id`, `ip_region` FROM `visits_intermediate` WHERE `id`<='.$id))
  553. $func_report['replace'] = 1;
  554. if ($this->db->query('DELETE FROM `visits_intermediate` WHERE `id`<='.$id))
  555. $func_report['truncate'] = 1;
  556. return 'таблица `visits` '.(!$func_report['replace'] ? 'НЕ ' : 'успешно ').'обновлена, данными из таблицы `visits_intermediate`; таблица `visits_intermediate` '.(!$func_report['truncate'] ? 'НЕ ' : 'успешно ').'очищена';
  557. }
  558. return 'неверно определен ID последней записи ('.$id.')';
  559. }
  560. return 'пустая таблица `visits_intermediate` или ошибка запроса';
  561. }
  562. //сворачиваем таблицы посещений
  563. public function visits_itog($visits_actual_days = 1, $visits_itog_actual_days = 30)
  564. {
  565. $func_report = array('visits_update_guestid_field'=>0, 'visits_visits_itog'=>0, 'visits_delete_old'=>0, 'visits_update_objects'=>0, 'visits_visits_interval_itog'=>0);
  566. //обвновляем данные вспомогательной таблицы для посещений
  567. $result = $this->db->query('UPDATE `visits` SET `guest_id`=`user_id` WHERE `user_id`>0 AND `user_id`!=`guest_id`');
  568. if ($result) {
  569. $func_report['visits_update_guestid_field'] = 1;
  570. //сворачиваем итоговые посещения
  571. $sql = 'REPLACE INTO `visits_itog` (`date`,`object_type`, `object_id`,`visits`, `unique_visits`)
  572. SELECT DATE(`date`) as mydate, `object_type`, `object_id`, COUNT(`guest_id`), COUNT(DISTINCT `guest_id`) FROM `visits`
  573. WHERE `date`>=DATE(NOW() - INTERVAL 1 DAY ) GROUP BY mydate, `object_id`, `object_type`';
  574. $result = $this->db->query($sql);
  575. if ($result) {
  576. $func_report['visits_visits_itog'] = 1;
  577. if ($this->db->query('DELETE FROM `visits` WHERE `date`<(NOW()-INTERVAL '.$visits_actual_days.' DAY)')
  578. && $this->db->query('DELETE FROM `visits_itog` WHERE `date`<(NOW()-INTERVAL '.$visits_itog_actual_days.' DAY)')
  579. && $this->db->query('DELETE FROM `cms_visits` WHERE `date`<(NOW()-INTERVAL '.$visits_itog_actual_days.' DAY)'))
  580. $func_report['visits_delete_old'] = 1;
  581. //обновляем количество посещений в объектах
  582. $update_obj = true;
  583. global $object_types;
  584. foreach ($object_types as $key => $value) {
  585. if (!in_array($key, array(5, 6))) {
  586. if ($key == 1) $object_type_where = 'vi.`object_type` IN(1,5)';
  587. else $object_type_where = 'vi.`object_type`='.$key;
  588. $sql="UPDATE `".$value['class']."` o SET o.`visits`=(SELECT IF(SUM(vi.`visits`) IS NOT NULL,SUM(vi.`visits`),0) FROM `visits_itog` vi WHERE vi.`object_id`=o.`id` AND {$object_type_where}),o.`unique_visits`=(SELECT IF(SUM(vi.`unique_visits`) IS NOT NULL,SUM(vi.`unique_visits`),0) FROM `visits_itog` vi WHERE vi.`object_id`=o.`id` AND {$object_type_where})";
  589. if (!$this->db->query($sql)) $update_obj = false;
  590. }
  591. }
  592. if ($update_obj) $func_report['visits_update_objects'] = 1;
  593. //обновляем кол-во посещений за промежуток времени
  594. $sql = "
  595. REPLACE INTO `visits_interval_itog`(`object_type`, `object_id`, `visits_last1month`, `visits_last3month`, `unique_visits_last1month`, `unique_visits_last3month`)
  596. (SELECT
  597. `object_type`,
  598. `object_id`,
  599. SUM(IF(`date` >= (DATE(NOW())-INTERVAL 1 MONTH), `visits`, 0)) as `visits_last1month`,
  600. SUM(IF(`date` >= (DATE(NOW())-INTERVAL 3 MONTH), `visits`, 0)) as `visits_last3month`,
  601. SUM(IF(`date` >= (DATE(NOW())-INTERVAL 1 MONTH), `unique_visits`, 0)) as `unique_visits_last1month`,
  602. SUM(IF(`date` >= (DATE(NOW())-INTERVAL 3 MONTH), `unique_visits`, 0)) as `unique_visits_last3month`
  603. FROM `visits_itog`
  604. WHERE `object_type` NOT IN (0,6)
  605. GROUP BY `object_type`, `object_id`
  606. )
  607. ";
  608. if ($this->db->query($sql)) $func_report['visits_visits_interval_itog'] = 1;
  609. }
  610. }
  611. return 'поле `guest_id` таблицы `visits` '.(!$func_report['visits_update_guestid_field'] ? 'НЕ ' : 'успешно ').'обновлено; таблица `visits_itog` '.(!$func_report['visits_visits_itog'] ? 'НЕ ' : 'успешно ').'обновлена; таблицы `visits, `cms_visits`, `visits_itog` '.(!$func_report['visits_visits_itog'] ? 'НЕ ' : 'успешно ').'очищены от старых записей; поле `visits` в таблицах объектов '.(!$func_report['visits_visits_itog'] ? 'НЕ ' : 'успешно ').'обновлено; таблица `visits_interval_itog` '.(!$func_report['visits_visits_itog'] ? 'НЕ ' : 'успешно ').'обновлена';
  612. }
  613. //сворачиваем таблицы посещений баннеров
  614. public function banners_visits_itog($visits_actual_days,$update_now=false)
  615. {
  616. $func_report = array('banners_visits_itog'=>0, 'banner_zones_visits_itog'=>0);
  617. //сворачиваем итоговые посещения
  618. $sql='REPLACE INTO `banners_visits_itog` (`date`,`banner_id`,`visits`, `clicks`)
  619. SELECT DATE(`date`) as mydate, `banner_id`, SUM(IF(IF(`event`=1,1,0) is not null,IF(`event`=1,1,0),0)), SUM(IF(IF(`event`=2,1,0) is not null,IF(`event`=2,1,0),0)) FROM `banners_visits`
  620. WHERE DATE(`date`)=DATE(NOW()';
  621. if(!$update_now)$sql.=' - INTERVAL 1 DAY ';
  622. $sql.=') GROUP BY mydate, `banner_id`';
  623. if ($this->db->query($sql))
  624. {
  625. $sql='DELETE FROM `banners_visits` WHERE `date`<(NOW()-INTERVAL '.$visits_actual_days.' DAY)';
  626. $this->db->query($sql);
  627. $func_report['banners_visits_itog'] = 1;
  628. }
  629. $sql='REPLACE INTO `banner_zones_visits_itog` (`date`,`zone_id`,`visits`, `clicks`)
  630. SELECT DATE(`date`) as mydate, `zone_id`, SUM(IF(IF(`event`=1,1,0) is not null,IF(`event`=1,1,0),0)), SUM(IF(IF(`event`=2,1,0) is not null,IF(`event`=2,1,0),0)) FROM `banner_zones_visits`
  631. WHERE DATE(`date`)=DATE(NOW()';
  632. if(!$update_now)$sql.=' - INTERVAL 1 DAY ';
  633. $sql.=') GROUP BY mydate, `zone_id`';
  634. if ($this->db->query($sql))
  635. {
  636. $sql='DELETE FROM `banner_zones_visits` WHERE `date`<(NOW()-INTERVAL 14 DAY)';
  637. $this->db->query($sql);
  638. $func_report['banner_zones_visits_itog'] = 1;
  639. }
  640. return 'таблица `banners_visits_itog` '.(!$func_report['banners_visits_itog'] ? 'НЕ ' : 'успешно ').'обновлена, таблица `banner_zones_visits_itog` '.(!$func_report['banner_zones_visits_itog'] ? 'НЕ ' : 'успешно ').'обновлена';
  641. }
  642. //отключаем прошедшие баннеры
  643. public function banners_deactivate_old(){
  644. $sql='UPDATE `banners` SET `active`=0 WHERE `public_date_end`<now();';
  645. return $this->db->query($sql);
  646. }
  647. //очистка таблицы object_links от мертвых ссылок
  648. public function clear_object_links($object_types)
  649. {
  650. set_time_limit(600);
  651. foreach($object_types as $key=>$value)
  652. {
  653. $sql='
  654. SELECT l.`object1_id` as `dead_id`, COUNT(o.`id`) as `count`
  655. FROM `object_links` l
  656. LEFT JOIN `'.$value['class'].'` o ON l.`object1_id`=o.`id`
  657. WHERE l.`object1_type`='.$key.'
  658. GROUP BY `dead_id`
  659. HAVING `count`=0
  660. UNION
  661. SELECT l.`object2_id` as `dead_id`, COUNT(o.`id`) as `count`
  662. FROM `object_links` l
  663. LEFT JOIN `'.$value['class'].'` o ON l.`object2_id`=o.`id`
  664. WHERE l.`object2_type`='.$key.'
  665. GROUP BY `dead_id`
  666. HAVING `count`=0
  667. ';
  668. if($this->db->query($sql))
  669. {
  670. $result=$this->db->get_result();
  671. if(count($result))
  672. {
  673. $sql='DELETE FROM `object_links` WHERE ';
  674. $i=0;
  675. foreach($result as $key2=>$value2)
  676. {
  677. $sql.='(`object1_type`='.$key.' AND `object1_id`='.$value2['dead_id'].') OR (`object2_type`='.$key.' AND `object2_id`='.$value2['dead_id'].') OR ';
  678. $i++;
  679. if($i==5)
  680. {
  681. $sql=substr($sql,0,-4);
  682. $this->db->query($sql);
  683. $sql='DELETE FROM `object_links` WHERE ';
  684. $i=0;
  685. }
  686. }
  687. if($i>0){
  688. $sql=substr($sql,0,-4);
  689. $this->db->query($sql);
  690. }
  691. }
  692. }
  693. }
  694. }
  695. //свернуть голоса у сообщений
  696. public function vote_message_itog()
  697. {
  698. $sql='UPDATE `messages` m SET
  699. m.`vote_ok`=m.`vote_ok`+(SELECT IF(SUM(m2.`vote_ok`) is not NULL,SUM(m2.`vote_ok`),0) FROM `messages_votes` m2 WHERE m2.`message_id`=m.`id` AND m2.`vote_ok`!=0 AND m2.`date`<(NOW() - INTERVAL 6 MONTH)),
  700. m.`vote_bad`=m.`vote_bad`+(SELECT IF(SUM(m2.`vote_bad`) is not NULL,SUM(m2.`vote_bad`),0) FROM `messages_votes` m2 WHERE m2.`message_id`=m.`id` AND m2.`vote_bad`!=0 AND m2.`date`<(NOW() - INTERVAL 6 MONTH)),
  701. m.`spam`=m.`spam`+(SELECT IF(SUM(m2.`spam`) is not NULL,SUM(m2.`spam`),0) FROM `messages_votes` m2 WHERE m2.`message_id`=m.`id` AND m2.`spam`!=0 AND m2.`date`<(NOW() - INTERVAL 6 MONTH)),
  702. m.`vote_count`=m.`vote_count`+(SELECT COUNT(m2.`message_id`) FROM `messages_votes` m2 WHERE m2.`message_id`=m.`id` AND m2.`spam`=0 AND m2.`date`<(NOW() - INTERVAL 6 MONTH))';
  703. if($this->db->query($sql)) {
  704. $sql='DELETE FROM `messages_votes` WHERE `date`<(NOW() - INTERVAL 6 MONTH)';
  705. return ($this->db->query($sql));
  706. }
  707. }
  708. //свернуть голоса у отзывов
  709. public function vote_review_itog()
  710. {
  711. $sql='UPDATE `reviews` r SET
  712. r.`vote_ok`=r.`vote_ok`+(SELECT IF(SUM(r2.`vote_ok`) is not NULL,SUM(r2.`vote_ok`),0) FROM `reviews_votes` r2 WHERE r2.`review_id`=r.`id` AND r2.`vote_ok`!=0 AND r2.`date`<(NOW() - INTERVAL 6 MONTH)),
  713. r.`vote_bad`=r.`vote_bad`+(SELECT IF(SUM(r2.`vote_bad`) is not NULL,SUM(r2.`vote_bad`),0) FROM `reviews_votes` r2 WHERE r2.`review_id`=r.`id` AND r2.`vote_bad`!=0 AND r2.`date`<(NOW() - INTERVAL 6 MONTH)),
  714. r.`vote_count`=r.`vote_count`+(SELECT COUNT(r2.`review_id`) FROM `reviews_votes` r2 WHERE r2.`review_id`=r.`id` AND r2.`date`<(NOW() - INTERVAL 6 MONTH))';
  715. if($this->db->query($sql)) {
  716. $sql='DELETE FROM `reviews_votes` WHERE `date`<(NOW() - INTERVAL 6 MONTH)';
  717. return ($this->db->query($sql));
  718. }
  719. }
  720. public function remove_media_storage_tempdirs()
  721. {
  722. $media_storages=array(__MEDIA_STORAGE_PATH.'/photos/temp',__MEDIA_STORAGE_PATH.'/avatars/temp',__MEDIA_STORAGE_PATH.'/banners/temp');
  723. foreach ($media_storages as $media_storage){
  724. $handle = opendir($media_storage);
  725. while (false !== ($photoalbum_id = readdir($handle)))
  726. {
  727. if ($photoalbum_id!=".." && $photoalbum_id!="." && is_dir($media_storage.'/'.$photoalbum_id))
  728. {
  729. if((time()-filemtime($media_storage.'/'.$photoalbum_id))>259200)
  730. {
  731. if(!dir_remove($media_storage.'/'.$photoalbum_id)) trigger_error('Невозможно удалить временную папку '.$media_storage.'/'.$photoalbum_id,E_USER_ERROR);
  732. }
  733. }
  734. }
  735. closedir($handle);
  736. }
  737. }
  738. public function clear_old_events()
  739. {
  740. $sql='DELETE FROM `events` WHERE `created`<(NOW()-INTERVAL 6 MONTH)';
  741. return ($this->db->query($sql));
  742. }
  743. //удаляет сообщения пользователей, когда они удалили их с обоих сторон
  744. public function remove_user_messages()
  745. {
  746. $sql='DELETE FROM `user_messages` WHERE `user_remove`=1 AND `to_remove`=1';
  747. return ($this->db->query($sql));
  748. }
  749. public function change_wallpaper()
  750. {
  751. $folder = __APP_PATH.'/design/background';
  752. $img = null;
  753. $fileList = array();
  754. $handle = @opendir($folder);
  755. if(!$handle){
  756. trigger_error('Не удалось открыть папку '.$folder,E_USER_ERROR);
  757. return false;
  758. }
  759. while (false !== ($file = readdir($handle))) {
  760. if(preg_match('|.+\.jpg|isu',$file) && $file != "ny2013.jpg"){
  761. $fileList[] = $file;
  762. }
  763. }
  764. closedir($handle);
  765. $count = count($fileList);
  766. if ($count > 0) {
  767. $imageNumber = rand(0,$count-1);
  768. $img = $fileList[$imageNumber];
  769. }
  770. if(in_array(gmdate("d.m.Y"), array("31.12.2012","01.01.2013","02.01.2013","03.01.2013","04.01.2013","05.01.2013","06.01.2013","14.01.2013"))) $img = "ny2013.jpg";
  771. //запись в файл
  772. $file=__ENGINE_PATH.'/templates/'.App::appPrefix().'/background.tpl';
  773. $fp=@fopen($file,'w');
  774. if($fp){
  775. fwrite($fp,$img);
  776. fclose($fp);
  777. }else trigger_error('Не удалось открыть для записи '.$file,E_USER_ERROR);
  778. }
  779. public function optimize_tables(array $tables)
  780. {
  781. if(count($tables)==0)return;
  782. foreach($tables as $item){
  783. $sql="OPTIMIZE TABLE `{$item}`";
  784. $this->db->query($sql);
  785. }
  786. foreach($tables as $item){
  787. $sql="ALTER TABLE `{$item}`";
  788. $this->db->query($sql);
  789. }
  790. return;
  791. }
  792. //remove dublicats from tables
  793. public function check_tables_dublicats(){
  794. $total_count=0;
  795. $sql='SELECT ol.`object_links_id` FROM `object_links` ol
  796. INNER JOIN `object_links` ol2 ON
  797. ol.`object_links_id`>ol2.`object_links_id` AND
  798. ol.`main_link`=ol2.`main_link` AND
  799. ol.`additional_link`=ol2.`additional_link` AND
  800. (
  801. ol2.`object1_id`=ol.`object2_id` AND
  802. (
  803. ol2.`object1_type`=ol.`object2_type` OR (ol2.`object1_type` IN(1,5) AND ol.`object2_type` IN(1,5))
  804. ) AND
  805. ol2.`object2_id`=ol.`object1_id` AND
  806. (
  807. ol2.`object2_type`=ol.`object1_type` OR (ol2.`object2_type` IN(1,5) AND ol.`object1_type` IN(1,5))
  808. )
  809. )';
  810. $this->db->query($sql);
  811. $result=&$this->db->get_result();
  812. if(count($result)>0){
  813. $sql='DELETE FROM `object_links` WHERE ';
  814. foreach($result as $value) $sql.='`object_links_id`='.$value['object_links_id'].' OR ';
  815. $sql=substr($sql,0,-4);
  816. if($this->db->query($sql)) $total_count+=count($result);
  817. }
  818. $sql='SELECT ol.`object_links_id` FROM `object_links` ol
  819. INNER JOIN `object_links` ol2 ON
  820. ol.`object_links_id`>ol2.`object_links_id` AND
  821. ol.`main_link`=ol2.`main_link` AND
  822. ol.`additional_link`=ol2.`additional_link` AND
  823. (
  824. ol2.`object1_id`=ol.`object1_id` AND
  825. (
  826. ol2.`object1_type`=ol.`object1_type` OR (ol2.`object1_type` IN(1,5) AND ol.`object1_type` IN(1,5))
  827. ) AND
  828. ol2.`object2_id`=ol.`object2_id` AND
  829. (
  830. ol2.`object2_type`=ol.`object2_type` OR (ol2.`object2_type` IN(1,5) AND ol.`object2_type` IN(1,5))
  831. )
  832. )';
  833. $this->db->query($sql);
  834. $result=&$this->db->get_result();
  835. if(count($result)>0){
  836. $sql='DELETE FROM `object_links` WHERE ';
  837. foreach($result as $value) $sql.='`object_links_id`='.$value['object_links_id'].' OR ';
  838. $sql=substr($sql,0,-4);
  839. if($this->db->query($sql)) $total_count+=count($result);
  840. }
  841. if($total_count>0) echo 'Удалено '.$total_count.' дубликатов из `object_links`<br/><br/>'."\n\n";
  842. $total_count=0;
  843. $sql='SELECT ol.`id_object_regions` FROM `object_regions` ol
  844. INNER JOIN `object_regions` ol2 ON
  845. ol.`id_object_regions`>ol2.`id_object_regions` AND
  846. ol.`main_link`=ol2.`main_link` AND
  847. ol.`region`=ol2.`region` AND
  848. (
  849. ol2.`object_id`=ol.`object_id` AND
  850. (
  851. ol2.`object_type`=ol.`object_type` OR (ol2.`object_type` IN(1,5) AND ol.`object_type` IN(1,5))
  852. )
  853. )';
  854. $this->db->query($sql);
  855. $result=&$this->db->get_result();
  856. if(count($result)>0){
  857. $sql='DELETE FROM `object_regions` WHERE ';
  858. foreach($result as $value) $sql.='`id_object_regions`='.$value['id_object_regions'].' OR ';
  859. $sql=substr($sql,0,-4);
  860. if($this->db->query($sql)) $total_count+=count($result);
  861. }
  862. if($total_count>0) echo 'Удалено '.$total_count.' дубликатов из `object_regions`<br/><br/>'."\n\n";
  863. }
  864. /**
  865. * Rebuild levels in guidelines table
  866. *
  867. */
  868. public function rebuild_guideline_levels(){
  869. $updated_guidelines=0;
  870. $sql='SELECT g.`left_index`, g.`right_index`, g.`id` FROM `guidelines` g ORDER BY g.`left_index`';
  871. $this->db->query($sql);
  872. $result=$this->db->get_result();
  873. foreach($result as $key=>&$value){
  874. $sql='SELECT g.`level` FROM `guidelines` g WHERE g.`left_index`<'.$value['left_index'].' AND g.`right_index`>'.$value['right_index'].' LIMIT 0,1';
  875. $this->db->query($sql);
  876. $result2=$this->db->get_result();
  877. if(count($result2)>0) {
  878. $level=$result2[0]['level']+1;
  879. $sql='UPDATE `guidelines` SET `level`='.$level.' WHERE `id`='.$value['id'];
  880. if($this->db->query($sql)) $updated_guidelines++;
  881. else echo 'CAN NOT EXECUTE: '.$sql.'<br/>' ;
  882. }
  883. }unset($value);
  884. echo 'Всего обновлено: '.$updated_guidelines.'';
  885. }
  886. /**
  887. * пересчет рейтингов для объектов у которых есть блок популярные объекты
  888. *
  889. * @param int $interval numder of days to count visits
  890. */
  891. public function calculate_ratings($interval=28){
  892. global $object_types;
  893. foreach($object_types as $key=>$item){
  894. if($key!=3 && $key!=6 && $key!=14){
  895. $preffix='';
  896. if($key==1)$preffix='t_';
  897. elseif($key==5)$preffix='c_';
  898. $sql=" UPDATE `{$item['class']}` o SET
  899. `{$preffix}rating`=(SELECT COALESCE(SUM(vi.`unique_visits`),0)
  900. FROM `visits_itog` vi WHERE vi.`object_type`".($key==1||$key==5?' IN(1,5)':'='.$key)." AND vi.`object_id`=o.`id` AND DATE(vi.`date`)<=DATE(NOW()) AND vi.`date`>(NOW()-INTERVAL $interval DAY))";
  901. $this->db->query($sql) or trigger_error("Не удалось посчитать рейтинг",E_USER_WARNING);
  902. }
  903. }
  904. }
  905. /**
  906. * пересчет рейтингов для объектов у которых есть блок популярные объекты - новая формула (формула Байеса + просмотры)
  907. * http://habrahabr.ru/company/darudar/blog/143188/#comment_4797256 , http://habrahabr.ru/qa/3491/
  908. */
  909. public function calculate_ratings_baies($types){
  910. global $object_types;
  911. foreach($object_types as $key=>$item){
  912. if(!in_array($key, $types) || in_array($key, array(6,14))) continue;
  913. $preffix='';
  914. if($key==1)$preffix='t_';
  915. elseif($key==5)$preffix='c_';
  916. $m = 3;//минимальное кол-во голосов для участия в рейтинге
  917. $c = 2;
  918. $v = "IF(SUM(r.`value_itog`) IS NULL, 0, SUM(r.`value_itog`))";
  919. $r = "(SUM(r.`value_itog`)/COUNT(r.`id`))";
  920. $k = "(1.5/5)";
  921. $formula = "ROUND((IF((({$v}/({$v}+{$m}))*{$r}) IS NULL, 0, (({$v}/({$v}+{$m}))*{$r})) + ({$m}/({$v}+{$m}))*{$c})*{$k},3)";
  922. $sql2 = "ROUND((((o.`{$preffix}srating_itog`*o.`{$preffix}svote_itog`)/(o.`{$preffix}svote_itog`+{$m}))+(({$m}*{$c})/({$m}+o.`{$preffix}svote_itog`)))/5 ,3)";
  923. if($key == 2){
  924. $k = "(1/5)";
  925. $sql2 = "
  926. SELECT {$formula}
  927. FROM `object_links` ol
  928. JOIN `reviews` r ON r.`object_type`=3 AND r.`object_id`=ol.`object1_id`
  929. WHERE ol.`object2_type`=2 AND ol.`object2_id`=o.`id` AND ol.`object1_type`=3
  930. GROUP BY ol.`object2_id`
  931. UNION SELECT {$c}*{$k}
  932. LIMIT 1
  933. ";
  934. }
  935. elseif($key == 4){
  936. $sql2 .= " +
  937. (SELECT {$formula}
  938. FROM `reviews_objects` ro
  939. JOIN `reviews` r ON r.`id`=ro.`review_id`
  940. WHERE ro.`object_type`=4 AND ro.`object_id`=o.`id`
  941. UNION SELECT {$c}*{$k}
  942. LIMIT 1)
  943. ";
  944. }
  945. elseif($key==5){
  946. $sql2 .= " +
  947. (SELECT {$formula}
  948. FROM `reviews` r
  949. WHERE r.`object_type`=5 AND r.`object_id`=o.`id`
  950. UNION SELECT {$c}*{$k}
  951. LIMIT 1)
  952. ";
  953. }
  954. elseif($key==1){
  955. $sql2 .= " +
  956. (SELECT {$formula}
  957. FROM `reviews_objects` ro
  958. JOIN `reviews` r ON r.`id`=ro.`review_id`
  959. WHERE ro.`object_type`=1 AND ro.`object_id`=o.`id`
  960. UNION SELECT {$c}*{$k}
  961. LIMIT 1)
  962. ";
  963. }
  964. elseif($key==3){
  965. $sql2 .= " +
  966. (SELECT {$formula}
  967. FROM `reviews_objects` ro
  968. JOIN `reviews` r ON r.`id`=ro.`review_id`
  969. WHERE ro.`object_type`=3 AND ro.`object_id`=o.`id`
  970. UNION SELECT {$c}*{$k}
  971. LIMIT 1)
  972. ";
  973. }
  974. elseif($key==12){
  975. $sql2 = "SELECT vii.`visits_last3month` FROM `visits_interval_itog` vii WHERE vii.`object_type`=12 AND vii.`object_id`=o.`id` UNION SELECT 0 LIMIT 1";
  976. }
  977. $sql="UPDATE `{$item['class']}` o SET `{$preffix}rating`=({$sql2})";
  978. $this->db->query($sql) or trigger_error("Не удалось посчитать рейтинг",E_USER_WARNING);
  979. }
  980. }
  981. /**
  982. * Подсчет кол-ва оценок пользователя за мероприятие
  983. * @param $types
  984. */
  985. public function calculate_object_action_rating($types){
  986. global $object_types;
  987. foreach($types as $type){
  988. if(!isset($object_types[$type]) || !in_array($type, array(1,2,4))) continue;
  989. $tbl = $object_types[$type]['class'];
  990. if($type == 4){
  991. $sql = "
  992. SELECT tbl.`id` as `id`, IF(SUM(tbl.`rate`)/SUM(IF(tbl.`count`=0,0,1)) IS NULL, 0, SUM(tbl.`rate`)/SUM(IF(tbl.`count`=0,0,1))) as `rate`, SUM(tbl.`count`) as `count`
  993. FROM
  994. (
  995. SELECT
  996. ol.`object2_id` as `id`, a.`srating_itog` as `rate`, a.`svote_itog` as `count`
  997. FROM
  998. `object_links` ol
  999. JOIN `timetable` t ON t.`id`=ol.`object1_id` AND t.`moderated` = 1 AND t.`block` = 0
  1000. JOIN `actions` a ON t.`action_id`=a.`id`
  1001. WHERE
  1002. ol.`object2_type`=4 AND ol.`object1_type`=6 AND ol.`main_link`=1
  1003. GROUP BY
  1004. ol.`object2_id`, a.`id`
  1005. ) as `tbl`
  1006. GROUP BY tbl.`id`
  1007. ";
  1008. }
  1009. elseif($type==1){
  1010. $sql = "
  1011. SELECT tbl.`id` as `id`, IF(SUM(tbl.`rate`)/SUM(IF(tbl.`count`=0,0,1)) IS NULL, 0, SUM(tbl.`rate`)/SUM(IF(tbl.`count`=0,0,1))) as `rate`, SUM(tbl.`count`) as `count`
  1012. FROM
  1013. (
  1014. SELECT
  1015. ol.`object2_id` as `id`, a.`srating_itog` as `rate`, a.`svote_itog` as `count`
  1016. FROM
  1017. `object_links` ol
  1018. JOIN `timetable` t ON t.`id`=ol.`object1_id` AND t.`moderated` = 1 AND t.`block` = 0
  1019. JOIN `actions` a ON t.`action_id`=a.`id`
  1020. WHERE
  1021. ol.`object2_type`=1 AND ol.`object1_type`=6
  1022. GROUP BY
  1023. ol.`object2_id`, a.`id`
  1024. ) as `tbl`
  1025. GROUP BY tbl.`id`
  1026. ";
  1027. }
  1028. if($type == 2){
  1029. $sql2 = "
  1030. SELECT IF(SUM(a.`srating_itog`)/SUM(IF(a.`svote_itog`=0,0,1)) IS NULL, 0, SUM(a.`srating_itog`)/SUM(IF(a.`svote_itog`=0,0,1)))
  1031. FROM `object_links` ol
  1032. JOIN `actions` a ON a.`id`=ol.`object1_id`
  1033. WHERE ol.`object2_type`=2 AND ol.`object2_id`=o.`id` AND ol.`object1_type`=3
  1034. GROUP BY ol.`object2_id`
  1035. UNION SELECT 0
  1036. LIMIT 1
  1037. ";
  1038. $sql3 = "
  1039. SELECT
  1040. IF(SUM(a.`svote_itog`) IS NULL, 0, SUM(a.`svote_itog`))
  1041. FROM `object_links` ol
  1042. JOIN `actions` a ON a.`id`=ol.`object1_id`
  1043. WHERE ol.`object2_type`=2 AND ol.`object2_id`=o.`id` AND ol.`object1_type`=3
  1044. GROUP BY ol.`object2_id`
  1045. ";
  1046. $sql = "UPDATE `{$tbl}` o SET `srating_itog_action`=({$sql2}), `svote_itog_action`=({$sql3})";
  1047. $this->db->query($sql) or trigger_error("Не удалось посчитать рейтинг",E_USER_WARNING);
  1048. }
  1049. else{
  1050. $sql = "
  1051. DROP TEMPORARY TABLE IF EXISTS `temp_ratings`;
  1052. CREATE TEMPORARY TABLE `temp_ratings`
  1053. {$sql};
  1054. ALTER TABLE `temp_ratings` ADD INDEX `id` (`id`);
  1055. UPDATE `{$tbl}`, `temp_ratings` SET `{$tbl}`.`srating_itog_action` = `temp_ratings`.`rate`, `{$tbl}`.`svote_itog_action` = `temp_ratings`.`count` WHERE `{$tbl}`.`id` = `temp_ratings`.`id`;
  1056. DROP TEMPORARY TABLE `temp_ratings`
  1057. ";
  1058. $mysqli = new mysqli(__DB_HOST, __DB_USER, __DB_PASS, __DB_TABLE);
  1059. if($mysqli->connect_error){
  1060. die("Connect failed: ".$mysqli->connect_error);
  1061. }
  1062. else{
  1063. $mysqli->multi_query($sql) or trigger_error("Не удалось посчитать рейтинг",E_USER_WARNING);
  1064. }
  1065. }
  1066. }
  1067. }
  1068. /**
  1069. * Set random numbers for regulars timetables daily random sort
  1070. *
  1071. * @return bool succesful
  1072. */
  1073. public function randomize_regular_timetables(){
  1074. $sql="UPDATE `timetable` t SET t.`rand_sort`=RAND()*1000000000 WHERE (SELECT a.`type` FROM `actions` a WHERE a.`id`=t.`action_id`) IN (2,3)";
  1075. return $this->db->query($sql);
  1076. }
  1077. /**
  1078. * Remove events with expired timetables
  1079. *
  1080. */
  1081. public function remove_expired_events(){
  1082. $func_report = true;
  1083. $sql='SELECT DISTINCT e.`id` FROM `events` e
  1084. INNER JOIN `timetable` t ON e.`object_type`=6 AND e.`object_id`=t.`id`
  1085. INNER JOIN `actions` a ON a.`id`=t.`action_id`
  1086. WHERE e.`created`<NOW() AND e.`object_type`=6 AND
  1087. ((e.`type`=1 AND e.`subtype`>=2 AND e.`subtype`<=9) OR (e.`type`=10 AND e.`subtype`=12)) AND
  1088. ((a.`type` NOT IN(2,3,6) AND t.`date`<NOW()) OR (a.`type` IN(2,3,6) AND (e.`created`+INTERVAL 7 DAY)<NOW()))';
  1089. $this->db->query($sql);
  1090. $result=$this->db->get_result();
  1091. if(count($result)>0){
  1092. $sql='DELETE FROM `events` WHERE `id` IN(';
  1093. foreach ($result as $value) $sql.=$value['id'].',';
  1094. $func_report = $this->db->query(substr($sql,0,-1).')');
  1095. }
  1096. return $func_report;
  1097. }
  1098. //send reminder to prolong payment options
  1099. public function payment_options_expiration_reminder($days=3)
  1100. {
  1101. $mail_count=0;
  1102. global $object_types;
  1103. global $filial_region_info;
  1104. $users = array();
  1105. $date1=date("Y-m-d 00:00:00",time()+($days*86400));
  1106. $date2=date("Y-m-d 00:00:00",time()+(($days+1)*86400));
  1107. $sql="SELECT `object_type`,`object_id`,`po1`,`po2`,`po3`,`po4`,`po5`,`po6`,`po7`,`po8`,UNIX_TIMESTAMP(`public_date_end`) as `public_date_end`
  1108. FROM `objects_payment_options`
  1109. WHERE `object_type` IN(1,4,5,6,9,10) AND `public_date_end`>'{$date1}' AND `public_date_end`<='{$date2}'
  1110. ";
  1111. $this->db->query($sql);
  1112. $result=$this->db->get_result();
  1113. //если выборка пустая
  1114. if(count($result)){
  1115. foreach($result as $value)
  1116. $objects[$value['object_type']][$value['object_id']]=$value;
  1117. foreach($objects as $key=>$value){
  1118. $class=$object_types[$key]['class'];
  1119. include_once(__ENGINE_PATH.'/functions/classes/class_'.$class.'.php');
  1120. $class=ucwords($class);
  1121. $object=new $class ($key);
  1122. $atribs=array('owner_id','alias','name','filial');
  1123. $where='';
  1124. foreach($value as $key2=>$value2){
  1125. $where.='o.`id`='.$key2.' OR ';
  1126. }
  1127. $where=substr($where,0,-4);
  1128. $result=$object->get_objects($where,'o.`id`',0,0,$atribs);
  1129. $full_objects[$key]=$result['objects'];
  1130. }
  1131. include_once(__ENGINE_PATH.'/functions/subfunctions/common.payment_options_array.php');
  1132. global $objects_payment_options;
  1133. foreach($full_objects as $key=>$value){
  1134. foreach($value as $key2=>$value2){
  1135. $users[$value2['owner_email']]['owner_name']=$value2['owner_name'];
  1136. $users[$value2['owner_email']]['owner_surname']=$value2['owner_surname'];
  1137. $users[$value2['owner_email']]['owner_login']=$value2['owner_login'];
  1138. $users[$value2['owner_email']]['objects'][$key][$key2]['id']=$value2['id'];
  1139. $users[$value2['owner_email']]['objects'][$key][$key2]['object_type']=$key;
  1140. $users[$value2['owner_email']]['objects'][$key][$key2]['name']=$value2['name'];
  1141. $users[$value2['owner_email']]['objects'][$key][$key2]['alias']=$value2['alias'];
  1142. $users[$value2['owner_email']]['objects'][$key][$key2]['link']=$value2['link'];
  1143. $users[$value2['owner_email']]['objects'][$key][$key2]['public_date_end']=$objects[$key][$key2]['public_date_end'];
  1144. //Определяем какому филиалу отправить копию заявки
  1145. $portal_email=(isset($value2['filial']) && isset($filial_region_info[$value2['filial']]['email'])) ? $filial_region_info[$value2['filial']]['email'] : "";
  1146. $users[$value2['owner_email']]['objects'][$key][$key2]['filial_email']=$portal_email;
  1147. $users[$value2['owner_email']]['objects'][$key][$key2]['filial']=(isset($value2['filial']) && isset($filial_region_info[$value2['filial']]) ? $value2['filial'] : 0);
  1148. $users[$value2['owner_email']]['objects'][$key][$key2]['service']='';
  1149. if($objects[$key][$key2]['po1'])$users[$value2['owner_email']]['objects'][$key][$key2]['service'].=$objects_payment_options[$key]['po1'][$objects[$key][$key2]['po1']].' + ';
  1150. if($objects[$key][$key2]['po2'])$users[$value2['owner_email']]['objects'][$key][$key2]['service'].=$objects_payment_options[$key]['po2'][$objects[$key][$key2]['po2']].' + ';
  1151. if($objects[$key][$key2]['po3'])$users[$value2['owner_email']]['objects'][$key][$key2]['service'].=$objects_payment_options[$key]['po3'][$objects[$key][$key2]['po3']].' + ';
  1152. if($objects[$key][$key2]['po4'])$users[$value2['owner_email']]['objects'][$key][$key2]['service'].=$objects_payment_options[$key]['po4'][$objects[$key][$key2]['po4']].' + ';
  1153. //if($objects[$key][$key2]['po5'])$users[$value2['owner_email']]['objects'][$key][$key2]['service'].=$objects_payment_options[$key]['po5'][$objects[$key][$key2]['po5']].' + ';
  1154. if($objects[$key][$key2]['po6'])$users[$value2['owner_email']]['objects'][$key][$key2]['service'].=$objects_payment_options[$key]['po6'][$objects[$key][$key2]['po6']].' + ';
  1155. if($objects[$key][$key2]['po7'])$users[$value2['owner_email']]['objects'][$key][$key2]['service'].=$objects_payment_options[$key]['po7'][$objects[$key][$key2]['po7']].' + ';
  1156. if($objects[$key][$key2]['po8'])$users[$value2['owner_email']]['objects'][$key][$key2]['service'].=$objects_payment_options[$key]['po8'][$objects[$key][$key2]['po8']].' + ';
  1157. $users[$value2['owner_email']]['objects'][$key][$key2]['service']=mb_substr($users[$value2['owner_email']]['objects'][$key][$key2]['service'],0,-3,'UTF-8');
  1158. }
  1159. }
  1160. //получаем баннеры
  1161. include_once(__ENGINE_PATH.'/functions/classes/class_banners.php');
  1162. $banners=new Banners();
  1163. $banner=&$banners->get_banners("b.`public_date_end`>'{$date1}' AND b.`public_date_end`<='{$date2}' AND b.`active`=1 AND b.`email`!=''",'NULL',array('name','zones','public_date_end','email','owner_id'));
  1164. foreach ($banner['banners'] as $key=>$value){
  1165. $users[$value['email']]['banners'][$key]=$value;
  1166. }
  1167. include_once(__ENGINE_PATH.'/functions/classes/class_mailer.php');
  1168. $mailer=new Mailer();
  1169. foreach($users as $email=>$item){
  1170. $emails = array($email);
  1171. //Определяем какому филиалу отправить копию заявки
  1172. if(isset($item['objects'])){
  1173. foreach($item['objects'] as $obj_type=>$object){
  1174. foreach($object as $obj_id=>$obj_data){
  1175. if(!in_array($obj_data['filial_email'], $emails) && strlen($obj_data['filial_email'])) {
  1176. $emails[] = $obj_data['filial_email'];
  1177. if (isset($obj_data['filial']) && $obj_data['filial'] == 54)
  1178. $emails[] = 'yulia@samopoznanie.ru';
  1179. }
  1180. }
  1181. }
  1182. }
  1183. $subject='';
  1184. $msg='';
  1185. include(__ENGINE_PATH.'/templates/email.payment_options_expiration_reminder.php');
  1186. if(!@$mailer->mail(join(", ", $emails), $subject, $msg)){
  1187. trigger_error('Не удалось отправить напоминания о продлении платных опций',E_USER_WARNING);
  1188. }
  1189. else $mail_count++;
  1190. }
  1191. }
  1192. return 'отправлено писем - '.$mail_count;
  1193. }
  1194. function service_report(){
  1195. set_time_limit(500);
  1196. global $new_region_codes;
  1197. $mail_count=0;
  1198. include_once(__ENGINE_PATH.'/functions/subfunctions/common.payment_options_array.php');
  1199. include_once(__ENGINE_PATH.'/functions/classes/class_statistics.php');
  1200. $statistics=new Statistics();
  1201. global $objects_payment_options;
  1202. global $new_region_codes;
  1203. $objects=array();
  1204. $items=array();
  1205. //получаем мероприятия
  1206. include_once(__ENGINE_PATH.'/functions/classes/class_timetable.php');
  1207. $object_object=new Timetable();
  1208. $expiring=$object_object->get_expiring();
  1209. if(count($expiring))
  1210. $result=$object_object->get_objects('o.`id` IN('.join(',',$expiring).')','o.`created` DESC',0,0,array('options','filial','type','date_moderated','name','adress','region','interesting','orders','owner_id'),0,0,0,array(),true);
  1211. //$result=$object_object->get_objects('DATE(opo.`public_date_end`)<NOW() AND DATEDIFF(opo.`public_date_end`,opo.`public_date_start`)>0','o.`created` DESC',1,1,array('options','filial','type','date_moderated','name','adress','region','interesting','orders','owner_id'),0,0,0,array(),true);
  1212. //$result=$object_object->get_objects('o.`id`=11','o.`created` DESC',1,1,array('options','filial','type','date_moderated','name','adress','region','interesting','orders','owner_id'),0,0,0,array(),true);
  1213. if(count($expiring) && $result['total_count']){
  1214. $objects[3]=$result['objects'];
  1215. include_once(__ENGINE_PATH.'/functions/classes/class_payment_options.php');
  1216. $opo=new PaymentOptions_Actions();
  1217. $options=$opo->GetOptions(array_keys($objects[3]));
  1218. foreach ($objects[3] as $key=>&$item){
  1219. if(@$options['period_end']>time()){
  1220. unset($objects[3][$key]);
  1221. continue;
  1222. }
  1223. $item['options']=@$options[$key];
  1224. }unset($item);
  1225. }
  1226. //получаем тренеров
  1227. include_once(__ENGINE_PATH.'/functions/classes/class_treiners.php');
  1228. $object_object=new Treiners(1);
  1229. $result=$object_object->get_objects('DATE(t_opo.`public_date_end`)=DATE(NOW()-INTERVAL 1 DAY) AND DATEDIFF(t_opo.`public_date_end`,t_opo.`public_date_start`)>0','o.`created` DESC',0,0,array('options','filial','name','owner_id'),0,0,0,array(),true);
  1230. //$result=$object_object->get_objects('DATE(t_opo.`public_date_end`)<NOW() AND o.`is_treiner`=1 AND (t_opo.`po2`!=0 OR t_opo.`po3`!=0) AND DATEDIFF(t_opo.`public_date_end`,t_opo.`public_date_start`)>0','o.`created` DESC',20,1,array('options','name','owner_id'),0,0,0,array(),true);
  1231. if($result['total_count'])
  1232. $objects[1]=$result['objects'];
  1233. //получаем консультантов
  1234. include_once(__ENGINE_PATH.'/functions/classes/class_treiners.php');
  1235. $object_object=new Treiners(5);
  1236. $result=$object_object->get_objects('DATE(c_opo.`public_date_end`)=DATE(NOW()-INTERVAL 1 DAY) AND DATEDIFF(c_opo.`public_date_end`,c_opo.`public_date_start`)>0','o.`created` DESC',0,0,array('options','filial','name','owner_id'),0,0,0,array(),true);
  1237. //$result=$object_object->get_objects('DATE(c_opo.`public_date_end`)<NOW() AND o.`is_consultant`=1 AND (c_opo.`po2`!=0 OR с_opo.`po3`!=0) AND DATEDIFF(c_opo.`public_date_end`,opo.`public_date_start`)>0','o.`created` DESC',20,1,array('options','name','owner_id'),0,0,0,array(),true);
  1238. if($result['total_count'])
  1239. $objects[5]=$result['objects'];
  1240. //получаем организаторов
  1241. include_once(__ENGINE_PATH.'/functions/classes/class_organizators.php');
  1242. $object_object=new Organizators();
  1243. $result=$object_object->get_objects('DATE(opo.`public_date_end`)=DATE(NOW()-INTERVAL 1 DAY) AND DATEDIFF(opo.`public_date_end`,opo.`public_date_start`)>0','o.`created` DESC',0,0,array('options','filial','name','owner_id','fullname'),0,0,0,array(),true);
  1244. //$result=$object_object->get_objects('DATE(opo.`public_date_end`)<NOW() AND (opo.`po2`!=0 OR opo.`po3`!=0) AND DATEDIFF(opo.`public_date_end`,opo.`public_date_start`)>0','o.`created` DESC',20,1,array('options','name','fullname','owner_id'),0,0,0,array(),true);
  1245. if($result['total_count'])
  1246. $objects[4]=$result['objects'];
  1247. //получаем новости
  1248. include_once(__ENGINE_PATH.'/functions/classes/class_news.php');
  1249. $object_object=new News();
  1250. $result=$object_object->get_objects('DATE(opo.`public_date_end`)=DATE(NOW()-INTERVAL 1 DAY) AND opo.`po7`=1 AND DATEDIFF(opo.`public_date_end`,opo.`public_date_start`)>0','o.`created` DESC',0,0,array('options','filial','name','owner_id'),0,0,0,array(),true);
  1251. //$result=$object_object->get_objects('DATE(opo.`public_date_end`)<NOW() AND opo.`po7`=1 AND DATEDIFF(opo.`public_date_end`,opo.`public_date_start`)>0','o.`created` DESC',20,1,array('options','name','owner_id'),0,0,0,array(),true);
  1252. if($result['total_count'])
  1253. $objects[7]=$result['objects'];
  1254. //получаем статьи
  1255. include_once(__ENGINE_PATH.'/functions/classes/class_articles.php');
  1256. $object_object=new Articles();
  1257. $result=$object_object->get_objects('DATE(opo.`public_date_end`)=DATE(NOW()-INTERVAL 1 DAY) AND opo.`po7`=1 AND DATEDIFF(opo.`public_date_end`,opo.`public_date_start`)>0','o.`created` DESC',0,0,array('options','filial','name','owner_id'),0,0,0,array(),true);
  1258. //$result=$object_object->get_objects('DATE(opo.`public_date_end`)<NOW() AND opo.`po7`=1 AND DATEDIFF(opo.`public_date_end`,opo.`public_date_start`)>0','o.`created` DESC',20,1,array('options','name','owner_id'),0,0,0,array(),true);
  1259. if($result['total_count'])
  1260. $objects[8]=$result['objects'];
  1261. //получаем залы
  1262. include_once(__ENGINE_PATH.'/functions/classes/class_lease.php');
  1263. $object_object=new Lease();
  1264. $result=$object_object->get_objects('DATE(opo.`public_date_end`)=DATE(NOW()-INTERVAL 1 DAY) AND DATEDIFF(opo.`public_date_end`,opo.`public_date_start`)>0','o.`created` DESC',0,0,array('options','filial','name','owner_id'),0,0,0,array(),true);
  1265. //$result=$object_object->get_objects('DATE(opo.`public_date_end`)<NOW() AND DATEDIFF(opo.`public_date_end`,opo.`public_date_start`)>0','o.`created` DESC',20,1,array('options','name','owner_id'),0,0,0,array(),true);
  1266. if($result['total_count'])
  1267. $objects[10]=$result['objects'];
  1268. if(count($objects)){
  1269. //проходим по типам объектов
  1270. foreach($objects as $object_type=>$value){
  1271. //проходим по объектам
  1272. foreach($value as $object_id=>$item){
  1273. //формируем адресата
  1274. $t_email='';
  1275. if($object_type==3){
  1276. $first_adress=array_shift($item['adresses']);
  1277. if($first_adress['email1']!='')$t_email=$first_adress['email1'];
  1278. elseif($first_adress['email2']!='')$t_email=$first_adress['email2'];
  1279. elseif($first_adress['email3']!='')$t_email=$first_adress['email3'];
  1280. else{
  1281. foreach($item['organizators']+$item['coorganizators'] as $item2){
  1282. foreach($item2['email'] as $oe){
  1283. if($oe!=''){
  1284. $t_email=$oe;
  1285. continue(2);
  1286. }
  1287. }
  1288. }
  1289. if($t_email==='')$t_email=$item['owner_email'];
  1290. }
  1291. }else $t_email=$item['owner_email'];
  1292. if(!$t_email){
  1293. continue;
  1294. }
  1295. $items[$t_email]['objects'][$object_type][$object_id]['type']=@$item['type'];
  1296. $preffix='';
  1297. if($object_type==1)$preffix='t_';
  1298. elseif($object_type==5)$preffix='c_';
  1299. $items[$t_email]['objects'][$object_type][$object_id]['name']=$object_type!=4?$item['name']:$item['fullname'];
  1300. global $region_codes;
  1301. if($object_type==3){
  1302. $items[$t_email]['objects'][$object_type][$object_id]['service']='';
  1303. //$items[$t_email]['objects'][$object_type][$object_id]['service'].='Размещение информации на портале '.__SITE_NAME.' c '.smarty_modifier_special_date_format($item['date_moderated'],false,true).' по '.smarty_modifier_special_date_format(time(),false,true).'.<br> В том числе платно: ';
  1304. $i = 0;
  1305. foreach ($item['options']['options'] as $oregion=>$value){
  1306. //$items[$t_email]['objects'][$object_type][$object_id]['service'].='<b>'.$new_region_codes[$oregion]['city'].'</b> (c '.smarty_modifier_special_date_format($value['public_date_start'],false,true).' по '.smarty_modifier_special_date_format($value['public_date_end'],false,true).'):<br>&nbsp;&nbsp;&nbsp;&nbsp;';
  1307. $items[$t_email]['objects'][$object_type][$object_id]['service'].='<br><b>*&nbsp;'.($oregion==0?'Все регионы':$new_region_codes[$oregion]['city']).'</b>:<br>&nbsp;&nbsp;&nbsp;&nbsp;';
  1308. if($objects_payment_options[$object_type]['po1'][$value['po1']]){
  1309. $items[$t_email]['objects'][$object_type][$object_id]['service'].=$objects_payment_options[$object_type]['po1'][$value['po1']].' (';
  1310. $items[$t_email]['objects'][$object_type][$object_id]['service'].=$objects_payment_options[$object_type]['po2'][$value['po2']].'),<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
  1311. if($objects_payment_options[$object_type]['po3'][$value['po3']])$items[$t_email]['objects'][$object_type][$object_id]['service'].='+ '.$objects_payment_options[$object_type]['po3'][$value['po3']].',<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
  1312. }elseif($oregion==0){
  1313. $items[$t_email]['objects'][$object_type][$object_id]['service'].='Размещение ';
  1314. $items[$t_email]['objects'][$object_type][$object_id]['service'].=$objects_payment_options[$object_type]['po2'][$value['po2']].',<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
  1315. if($objects_payment_options[$object_type]['po3'][$value['po3']])$items[$t_email]['objects'][$object_type][$object_id]['service'].='+ '.$objects_payment_options[$object_type]['po3'][$value['po3']].',<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
  1316. }
  1317. if($objects_payment_options[$object_type]['po4'][$value['po4']])$items[$t_email]['objects'][$object_type][$object_id]['service'].=$objects_payment_options[$object_type]['po4'][$value['po4']].',<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
  1318. //if($objects_payment_options[$object_type]['po5'][$value['po5']])$items[$t_email]['objects'][$object_type][$object_id]['service'].=$objects_payment_options[$object_type]['po5'][$value['po5']].',<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
  1319. if($objects_payment_options[$object_type]['po6'][$value['po6']])$items[$t_email]['objects'][$object_type][$object_id]['service'].=$objects_payment_options[$object_type]['po6'][$value['po6']].',<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
  1320. if($objects_payment_options[$object_type]['po7'][$value['po7']])$items[$t_email]['objects'][$object_type][$object_id]['service'].=$objects_payment_options[$object_type]['po7'][$value['po7']].',<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
  1321. if($objects_payment_options[$object_type]['po8'][$value['po8']])$items[$t_email]['objects'][$object_type][$object_id]['service'].=$objects_payment_options[$object_type]['po8'][$value['po8']].',<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
  1322. //$items[$t_email]['objects'][$object_type][$object_id]['service']=mb_substr($items[$t_email]['objects'][$object_type][$object_id]['service'],0,-2,'UTF-8').' ('.$new_region_codes[$oregion]['city'].' c '.smarty_modifier_special_date_format($value['public_date_start'],false,true).' по '.smarty_modifier_special_date_format($value['public_date_end'],false,true).'),<br/>';
  1323. $items[$t_email]['objects'][$object_type][$object_id]['service']=mb_substr($items[$t_email]['objects'][$object_type][$object_id]['service'],0,-30,'UTF-8').'.';
  1324. $i++;
  1325. }
  1326. //$items[$t_email]['objects'][$object_type][$object_id]['service']=mb_substr($items[$t_email]['objects'][$object_type][$object_id]['service'],0,-6,'UTF-8');
  1327. //период размещения
  1328. $items[$t_email]['objects'][$object_type][$object_id]['public_date_start']=$item['options']['period_start'];
  1329. $items[$t_email]['objects'][$object_type][$object_id]['public_date_end']=time();
  1330. $items[$t_email]['filials'][$item['filial']]=$item['filial'];
  1331. }
  1332. else{
  1333. $items[$t_email]['objects'][$object_type][$object_id]['service']='';//'Размещение информации на портале '.__SITE_NAME.': ';
  1334. if($objects_payment_options[$object_type]['po1'][$item[$preffix.'po1']]){
  1335. $items[$t_email]['objects'][$object_type][$object_id]['service'].=$objects_payment_options[$object_type]['po1'][$item[$preffix.'po1']].' c '.smarty_modifier_special_date_format($item[$preffix.'public_date_start'],false,true).' по '.smarty_modifier_special_date_format($item[$preffix.'public_date_end'],false,true).',<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
  1336. if($objects_payment_options[$object_type]['po2'][$item[$preffix.'po2']])$items[$t_email]['objects'][$object_type][$object_id]['service'].=$objects_payment_options[$object_type]['po2'][$item[$preffix.'po2']].',<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
  1337. if($objects_payment_options[$object_type]['po3'][$item[$preffix.'po3']])$items[$t_email]['objects'][$object_type][$object_id]['service'].='+ '.$objects_payment_options[$object_type]['po3'][$item[$preffix.'po3']].',<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
  1338. //if($objects_payment_options[$object_type]['po2'][$item[$preffix.'po2']] || $objects_payment_options[$object_type]['po3'][$item[$preffix.'po3']])$items[$t_email]['objects'][$object_type][$object_id]['service'].=',<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
  1339. //else $items[$t_email]['objects'][$object_type][$object_id]['service'].='<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
  1340. }
  1341. if($objects_payment_options[$object_type]['po4'][$item[$preffix.'po4']])$items[$t_email]['objects'][$object_type][$object_id]['service'].=$objects_payment_options[$object_type]['po4'][$item[$preffix.'po4']].',<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
  1342. //if($objects_payment_options[$object_type]['po5'][$item[$preffix.'po5']])$items[$t_email]['objects'][$object_type][$object_id]['service'].=$objects_payment_options[$object_type]['po5'][$item[$preffix.'po5']].',<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
  1343. if($objects_payment_options[$object_type]['po6'][$item[$preffix.'po6']])$items[$t_email]['objects'][$object_type][$object_id]['service'].=$objects_payment_options[$object_type]['po6'][$item[$preffix.'po6']].',<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
  1344. if($objects_payment_options[$object_type]['po7'][$item[$preffix.'po7']])$items[$t_email]['objects'][$object_type][$object_id]['service'].=$objects_payment_options[$object_type]['po7'][$item[$preffix.'po7']].',<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
  1345. if($objects_payment_options[$object_type]['po8'][$item[$preffix.'po8']])$items[$t_email]['objects'][$object_type][$object_id]['service'].=$objects_payment_options[$object_type]['po8'][$item[$preffix.'po8']].',<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
  1346. $items[$t_email]['objects'][$object_type][$object_id]['service']=mb_substr($items[$t_email]['objects'][$object_type][$object_id]['service'],0,-30,'UTF-8').'.';
  1347. //период размещения
  1348. $items[$t_email]['objects'][$object_type][$object_id]['public_date_start']=$item[$preffix.'public_date_start'];
  1349. $items[$t_email]['objects'][$object_type][$object_id]['public_date_end']=$item[$preffix.'public_date_end'];
  1350. }
  1351. //полчаем статистику
  1352. if(in_array($object_type,array(3,6)))$stat=$statistics->get(6,$object_id,$item['options']['period_start'],$item['options']['period_end'],$item['action_id'],'cron');
  1353. else $stat=$statistics->get($object_type,$object_id,$item[$preffix.'public_date_start'],$item[$preffix.'public_date_end'],0,'cron');
  1354. $items[$t_email]['objects'][$object_type][$object_id]+=$stat;
  1355. //$items[$t_email]['filials'][$item['filial']]=$item['filial'];
  1356. }
  1357. }
  1358. }
  1359. if(@$items[$t_email]['objects'][$object_type][$object_id]['service']==='')unset($items[$t_email]['objects'][$object_type][$object_id]);
  1360. //получаем баннеры
  1361. include_once(__ENGINE_PATH.'/functions/classes/class_banners.php');
  1362. $banner=new Banners();
  1363. $banners=$banner->get_banners('DATE(b.`public_date_end`)=DATE(NOW()-INTERVAL 1 DAY) AND b.`email`!="" AND DATEDIFF(b.`public_date_end`,b.`public_date_start`)>0','',array('email','region','public_date_start','public_date_end','zones','name','owner_id','visits','priority'));
  1364. //$banners=$banner->get_banners('b.`id`=1059','',array('email','public_date_start','public_date_end','zones','name','owner_id','visits','priority'));
  1365. foreach($banners['banners'] as $item){
  1366. $zones_names=array();
  1367. foreach($item['zones'] as $z){
  1368. $zones_names[]=$z['name'];
  1369. }
  1370. $zones_names=implode(', ',$zones_names);
  1371. $items[$item['email']]['banners'][$item['id']]['name']=$item['name'];
  1372. $items[$item['email']]['banners'][$item['id']]['priority']=$item['priority'];
  1373. $items[$item['email']]['banners'][$item['id']]['regions']=$item['regions'];
  1374. $items[$item['email']]['banners'][$item['id']]['zones_names']=$zones_names;
  1375. $items[$item['email']]['banners'][$item['id']]['zones']=$item['zones'];
  1376. $items[$item['email']]['banners'][$item['id']]['visits']=$item['visits_period'];
  1377. $items[$item['email']]['banners'][$item['id']]['clicks']=$item['clicks_period'];
  1378. $items[$item['email']]['banners'][$item['id']]['public_date_start']=$item['public_date_start'];
  1379. $items[$item['email']]['banners'][$item['id']]['public_date_end']=$item['public_date_end'];
  1380. }
  1381. $ctr = array();
  1382. if($banners['total_count'] >0){
  1383. $ctr = $banner->zones_average_ctr();
  1384. }
  1385. include_once(__ENGINE_PATH.'/functions/classes/class_mailer.php');
  1386. $mailer=new Mailer();
  1387. include_once(__ENGINE_PATH.'/functions/classes/class_opros.php');
  1388. $class_opros=new Opros();
  1389. foreach($items as $email=>$item){
  1390. if(!$email){
  1391. trigger_error('Адресат не указан',E_USER_WARNING);
  1392. continue;
  1393. }
  1394. //Определяем какому филиалу отправить копию заявки
  1395. global $filial_region_info;
  1396. $portal_email=array();
  1397. if(@is_array($item['filials']) && count($item['filials'])){
  1398. foreach ($item['filials'] as $filial){
  1399. if(isset($filial_region_info[$filial]["email"]))$portal_email[]=$filial_region_info[$filial]["email"];
  1400. }
  1401. }
  1402. if(empty($portal_email))$portal_email=array(__DEFAULT_FILIAL_EMAIL);
  1403. //сохраняем письмо в базе
  1404. $service_id = $class_opros->save_mail($email, serialize($item));
  1405. $anketa_hash = md5($service_id.Opros::salt());
  1406. //отправляем письмо
  1407. $subject='';
  1408. $msg='';
  1409. include(__ENGINE_PATH.'/templates/email.service_report.php');
  1410. if(!@$mailer->mail($email.','.join(',',$portal_email).','.__SUPPORT_EMAIL, $subject, $msg)){
  1411. trigger_error('Не удалось отправить отчет об оказаных услугах',E_USER_WARNING);
  1412. }
  1413. else
  1414. $mail_count++;
  1415. }
  1416. return 'отправлено писем - '.$mail_count;
  1417. }
  1418. //удаляем Юзеров, которые не активировали свою учетную запись в течении 10 дней
  1419. public function delete_inactive_users(){
  1420. $count = 0;
  1421. $sql = 'select u.`id` from `users` as u where u.`created_at` < NOW() - INTERVAL 10 DAY AND u.`block` = 1';
  1422. $this->db->query($sql);
  1423. $result = $this->db->get_result();
  1424. if(count($result)){
  1425. $users_id = array();
  1426. foreach($result as $item){
  1427. $users_id[] = $item['id'];
  1428. }
  1429. //удаляем данные из таблицы регионов
  1430. $sql1 = "delete from `users_regions` where `user_id` in (".join(",", $users_id).")";
  1431. $this->db->query($sql1);
  1432. //удаляем данные из основной таблицы users
  1433. $sql2 = "delete from `users` where `id` in (".join(",", $users_id).")";
  1434. $this->db->query($sql2);
  1435. $count = count($users_id);
  1436. }
  1437. return 'удалено пользователей - '.$count;
  1438. }
  1439. //отправка СМС
  1440. public function send_sms(){
  1441. include_once(__ENGINE_PATH.'/functions/classes/class_sms.php');
  1442. $sms = new Sms();
  1443. $sms->send_by_cron();
  1444. }
  1445. //отправка Email'ов
  1446. public function send_emails(){
  1447. include_once(__ENGINE_PATH.'/functions/classes/class_mailer.php');
  1448. $mailer = new Mailer();
  1449. $mailer->send_by_cron();
  1450. }
  1451. //очистка таблицы object_edit_access
  1452. public function clear_table_eoa(){
  1453. $sql = "DELETE FROM `object_edit_access`";
  1454. return $this->db->query($sql);
  1455. }
  1456. //напоминание о заявке на вебинар за 20 минут до его начала
  1457. public function webinar_order_remind($email_send = false, $sms_send = false){
  1458. $gmtime = strtotime(gmdate("Y-m-d H:i:s"));
  1459. set_time_limit(300);
  1460. include_once(__ENGINE_PATH.'/functions/subfunctions/common.timezones.php');
  1461. global $timezones;
  1462. global $object_types;
  1463. $adresats_email = array();
  1464. $adresats_sms = array();
  1465. $webinars = array();
  1466. //получаем вебинары, которые проходят сегодня
  1467. $sql = "
  1468. SELECT
  1469. t.`id` as `timetable_id`, a.`id` as `action_id`,
  1470. a.`alias` as `webinar_alias`,
  1471. CONCAT(a.name, ' ', t.name_extension) as `webinar_header`,
  1472. convert(CONCAT(date(t.`date`), ' ', time(t.`time`)), datetime) as `webinar_time`
  1473. FROM
  1474. `timetable` as t
  1475. JOIN `actions` as a
  1476. ON t.`action_id` = a.`id`
  1477. WHERE
  1478. a.type = 4
  1479. AND DATE(t.`date`) = DATE(NOW())
  1480. AND IF(t.`time`, t.`time`, NULL) IS NOT NULL
  1481. GROUP BY
  1482. t.`id`
  1483. ";
  1484. $this->db->query($sql);
  1485. $result = $this->db->get_result();
  1486. if(count($result)){
  1487. foreach($result as $value){
  1488. $current_hour = gmdate("G");
  1489. $webinar_time = explode(" ", $value["webinar_time"]);//date("G", (strtotime($value["webinar_time"])-(4*3600)));
  1490. $webinar_date = explode("-", $webinar_time[0]);
  1491. $webinar_time = explode(":", $webinar_time[1]);
  1492. $webinar_hour = $webinar_time[0]-4;//отнимаем разницу с Московой
  1493. $webinar_start_time = gmmktime($webinar_hour, $webinar_time[1], 0, $webinar_date[1], $webinar_date[2], $webinar_date[0]);//strtotime($value["webinar_time"])-(4*3600);
  1494. if((($webinar_hour - $current_hour) <= 3 && ($webinar_hour - $current_hour) > 0 && $email_send) ||
  1495. ($sms_send && ($webinar_start_time - (time()+1200)) <= 1260 && ($webinar_start_time - (time()+1200)) > 0) ){
  1496. $webinars[$value["timetable_id"]] = array(
  1497. "header"=>$value["webinar_header"],
  1498. "time"=>$value["webinar_time"],
  1499. "alias"=>$value["webinar_alias"],
  1500. "id"=>$value["timetable_id"]);
  1501. }
  1502. }
  1503. }
  1504. if(!empty($webinars)){
  1505. $sql = "
  1506. SELECT
  1507. `to`.`order_id` as `order_id`,
  1508. `to`.`timetable_id` as `timetable_id`,
  1509. IF(`to`.`user_id` > 0, u.`email`, `to`.`email`) as `email`,
  1510. IF(`to`.`user_id` > 0, u.`phone`, `to`.`phone`) as `phone`
  1511. FROM
  1512. `timetable_orders` as `to`
  1513. LEFT JOIN `users` as u
  1514. ON u.`id` = `to`.`user_id`
  1515. WHERE
  1516. `to`.`timetable_id` IN (".join(", ", array_keys($webinars)).")
  1517. AND `to`.`type` IN (1,2,11,12)
  1518. ";
  1519. $this->db->query($sql);
  1520. $result = $this->db->get_result();
  1521. if(count($result)){
  1522. $orders = array();
  1523. foreach($result as $value){
  1524. if(isset($value["email"]) && $email_send && trim($value["email"]) && $value["email_remind_3h"] == 0)
  1525. $adresats_email[$value["timetable_id"]][] = $value["email"];
  1526. if(isset($value["phone"]) && $sms_send && trim($value["phone"])){
  1527. if($value["phone"])
  1528. $adresats_sms[$value["timetable_id"]][] = preg_replace('/[^0-9]/ui','', $value["phone"]);
  1529. }
  1530. $orders[] = $value["order_id"];
  1531. }
  1532. if($email_send && !empty($orders))
  1533. $this->db->query("UPDATE `timetable_orders` SET `email_remind_3h` = 1 WHERE `order_id` IN (".join(",", $orders).")");
  1534. }
  1535. }
  1536. $count = 0;
  1537. //Если включена опция отправки по почте
  1538. if($email_send){
  1539. //формируем письмо
  1540. if(!empty($adresats_email)){
  1541. include_once(__ENGINE_PATH.'/functions/classes/class_mailer.php');
  1542. $mailer=new Mailer();
  1543. foreach($adresats_email as $t_id=>$emails){
  1544. foreach(array_unique($emails) as $email){
  1545. $subject = '';
  1546. $msg = '';
  1547. $timetable = $webinars[$t_id];
  1548. include(__ENGINE_PATH.'/templates/email.webinar_order_remind.php');
  1549. if(!@$mailer->mail($email, $subject, $msg)) {
  1550. trigger_error('Не удалось отправить оповещения о мероприятии', E_USER_WARNING);
  1551. }
  1552. else
  1553. $count++;
  1554. }
  1555. }
  1556. }
  1557. echo "Отправлено писем с напоминанием о вебинарах: {$count}</br>\n";
  1558. }
  1559. $count = 0;
  1560. if($sms_send){
  1561. //формируем письмо
  1562. if(!empty($adresats_sms)){
  1563. foreach($adresats_sms as $t_id=>$phones){
  1564. foreach(array_unique($phones) as $phone){
  1565. $sms_text = '';
  1566. $timetable = $webinars[$t_id];
  1567. $webinar_name = html_entity_decode(trim($timetable['header']), ENT_QUOTES, 'UTF-8');
  1568. $webinar_link = 'http://'.__SITE_URL.'/'.$object_types[3]['url'].'/'.$timetable['alias'].'/?date='.$timetable['id'];
  1569. $minutes = "";
  1570. $current_time = $gmtime;
  1571. $webinar_time = strtotime($timetable["time"])-(4*3600);
  1572. $minutes = floor(($webinar_time - $current_time)/60);
  1573. $minutes = $minutes." ".smarty_modifier_tail1($minutes, 'minutes');
  1574. //$sms_text = "Вебинар - {$webinar_name}({$webinar_link}), состоится через {$minutes} минут.";
  1575. $sms_text = "Через {$minutes} состоится мероприятие: {$webinar_name}, на которое вы подавали заявку. ".__SITE_NAME;
  1576. //если текст смс больше 134 символов, то обрезаем имя мероприятия и добавлем многоточие
  1577. if(mb_strlen($sms_text, 'UTF-8') > 134){
  1578. $webinar_name = mb_substr($webinar_name, 0, (134-mb_strlen($sms_text, 'UTF-8')-3), 'UTF-8').'...';
  1579. //формируем новый текст смс
  1580. //$sms_text = "Вебинар - {$webinar_name}({$webinar_link}), состоится через {$minutes} минут.";
  1581. $sms_text = "Через {$minutes} состоится мероприятие: {$webinar_name}, на которое вы подавали заявку. ".__SITE_NAME;
  1582. }
  1583. new_sms($phone, $sms_text);
  1584. $count++;
  1585. }
  1586. }
  1587. }
  1588. echo "Отправлено смс с напоминанием о вебинарах: {$count}</br>\n";
  1589. }
  1590. }
  1591. //напоминание о заявке на мероприятие за 3 часа до его начала
  1592. /*public function timetable_order_remind_sms_before_3h(){
  1593. include_once(__ENGINE_PATH.'/functions/classes/class_sms.php');
  1594. $sms = new Sms();
  1595. $sms->sms_before_3h();
  1596. }*/
  1597. public function happybday_send(){
  1598. $func_report = array('send_sms'=>0, 'send_email'=>0);
  1599. $sms_tpl = array(
  1600. "Созерцай в тишине\nКак в тебе расцветает Истина –\nС Днем Рождения.\n(Самопознание.ру)",
  1601. "Живи настоящим,\nОсознанно вдыхая аромат Мира –\nС Днем Рождения.\n(Самопознание.ру)",
  1602. "Пусть в Вашем сердце\nЛюбовь и гармония\nВечно живут.\nС днём рождения!\n(Самопознание.ру)",
  1603. "Пусть ручеёк, добежавший рекой до моря,\nНе забывает родник в горах,\nОт которого начинался его путь.\nС днём рождения! (Самопознание.ру)"
  1604. );
  1605. $email_tpl = array("email_user_happybday_1.php","email_user_happybday_2.php","email_user_happybday_3.php","email_user_happybday_4.php");
  1606. include_once(__ENGINE_PATH.'/functions/subfunctions/common.timezones.php');
  1607. global $timezones;
  1608. include_once(__ENGINE_PATH.'/functions/classes/class_mailer.php');
  1609. $mailer = new Mailer();
  1610. include_once(__ENGINE_PATH.'/functions/classes/class_sms.php');
  1611. $sms = new Sms();
  1612. $where = array();
  1613. //Хак, т.к. крон почему то выполняется по Москве, а не по нулевой зоне
  1614. if(gmdate('G')>=4){
  1615. $time = mktime(1, 30, 0, gmdate('n'), gmdate('j')+1, gmdate('Y'));
  1616. }
  1617. else
  1618. $time = time();
  1619. $start_year = gmdate("Y", $time)-90;//максимальный возраст пользователя
  1620. $stop_year = gmdate("Y", $time)-5;//минимальный возраст пользователя
  1621. $current_year = gmdate("Y", $time);
  1622. $current_month = gmdate("m", $time);
  1623. $current_day = gmdate("d", $time);
  1624. $current_hour = gmdate("G", $time);
  1625. for($y=$start_year; $y<$stop_year; $y++){
  1626. $where[] = "u.`birth` = '{$y}-{$current_month}-{$current_day}'";
  1627. }
  1628. $sql = "
  1629. SELECT
  1630. u.`name`, u.`login`, u.`email`, u.`phone`, u.`timezone`
  1631. FROM `users` u
  1632. WHERE
  1633. u.`block` = 0
  1634. AND (".join(" OR ", $where).")
  1635. AND u.`birth` != '1970-01-01'
  1636. ";
  1637. $this->db->query($sql);
  1638. $result=$this->db->get_result();
  1639. foreach($result as $user){
  1640. //отправляем в 10 часов по местному времени
  1641. $hour = 11-$timezones[$user["timezone"]]["correction"]/3600;
  1642. //время отправки (серверное)
  1643. $send_time = $current_year."-".$current_month."-".$current_day." ".($hour < 10 ? "0" : "").$hour.":00:00";
  1644. if(strlen($user["email"])){
  1645. $msg = "";
  1646. $subject = "";
  1647. $user_name = $user["name"];
  1648. include(__ENGINE_PATH."/templates/".$email_tpl[array_rand($email_tpl)]);
  1649. if($current_hour >= $hour){
  1650. @$mailer->mail($user["email"], $subject, $msg, __PORTAL_EMAIL_2);
  1651. }
  1652. else{
  1653. $mailer->save($user["email"], $subject, $msg, $send_time);
  1654. }
  1655. $func_report['send_email'] += 1;
  1656. }
  1657. if(strlen($user["phone"])){
  1658. $phone = preg_replace('/[^0-9]/ui','',$user["phone"]);
  1659. if(!in_array(intval($phone[0]), array(7,8)))
  1660. continue;
  1661. $text = $sms_tpl[array_rand($sms_tpl)];
  1662. if($current_hour >= $hour){
  1663. new_sms($phone, $text);
  1664. }
  1665. else{
  1666. $sms->save($phone, $text, $send_time);
  1667. }
  1668. $func_report['send_sms'] += 1;
  1669. }
  1670. }
  1671. return 'писем отправлено - '.$func_report['send_email'].', смс отправлено - '.$func_report['send_sms'];
  1672. }
  1673. //обновляет флаг is_actual в таблице платных опций
  1674. public function update_payment_actual(){
  1675. $sql = "UPDATE `objects_payment_options` SET `is_actual`=0 WHERE `public_date_end`<NOW()";
  1676. $func_report1 = $this->db->query($sql);
  1677. $sql = "UPDATE `objects_payment_options` SET `is_actual`=1 WHERE `public_date_start`>=NOW()";
  1678. $func_report2 = $this->db->query($sql);
  1679. $sql = "UPDATE `objects_payment_options` SET `is_actual`=1 WHERE `public_date_start`<=NOW() AND `public_date_end`>=NOW()";
  1680. $func_report3 = $this->db->query($sql);
  1681. if($func_report1 && $func_report2 && $func_report3) return true;
  1682. else return false;
  1683. }
  1684. //обновляет флаг is_actual в таблице мероприятий
  1685. public function update_timetable_actual(){
  1686. $sql = "UPDATE `timetable` SET `is_actual`=0 WHERE `date`<NOW() AND `date`!='0000-00-00 00:00:00'";
  1687. $func_report1 = $this->db->query($sql);
  1688. $sql = "UPDATE `timetable` SET `is_actual`=1 WHERE `date`>=NOW() AND `date`!='0000-00-00 00:00:00'";
  1689. $func_report2 = $this->db->query($sql);
  1690. $sql = "UPDATE `timetable_update` SET `is_actual`=0 WHERE `date`<NOW() AND `date`!='0000-00-00 00:00:00'";
  1691. $func_report3 = $this->db->query($sql);
  1692. $sql = "UPDATE `timetable_update` SET `is_actual`=1 WHERE `date`>=NOW() AND `date`!='0000-00-00 00:00:00'";
  1693. $func_report4 = $this->db->query($sql);
  1694. if($func_report1 && $func_report2 && $func_report3 && $func_report4) return true;
  1695. else return false;
  1696. }
  1697. //обновляет счетчик кол-ва тренингов во вкладках
  1698. public function update_timetable_count(){
  1699. include_once(__ENGINE_PATH.'/functions/classes/class_timetable.php');
  1700. $class_timetable=new Timetable();
  1701. _save_cache("timetable.count", $class_timetable->timetable_count());
  1702. }
  1703. /**
  1704. * send email notifiers about users events
  1705. */
  1706. public function users_events_email_notifier($hours=3){
  1707. set_time_limit(300);
  1708. global $object_types;
  1709. $time1=gmdate("Y-m-d H:00:00",gmmktime(gmdate('H')-$hours,gmdate('i'),gmdate('s'),gmdate('m'),gmdate('d'),gmdate('Y')));
  1710. //$time1='2011-11-01 00:00:00';
  1711. $time2=gmdate("Y-m-d H:00:00");
  1712. //$time2='2012-05-31 10:00:00';
  1713. $count=0;
  1714. $adresats=array();
  1715. //получаем новые личные сообшщения
  1716. $sql="
  1717. SELECT COUNT(m.`id`) as `count`,m.`to`,u.`login` as `adresat_login`,u2.`id`,u2.`gender`,u2.`name`,u2.`surname`,u2.`private_name`,u2.`login`,u.`email`
  1718. FROM `user_messages` m
  1719. INNER JOIN `users` u ON u.`id`=m.`to` AND u.`email_delivery`=1
  1720. INNER JOIN `users` u2 ON u2.`id`=m.`user_id`
  1721. WHERE m.`to_readed`=0 AND m.`status`=1 AND m.`created`>='{$time1}' AND m.`created`<'{$time2}'
  1722. GROUP BY m.`to`,m.`user_id`
  1723. ";
  1724. $this->db->query($sql);
  1725. $result=$this->db->get_result();
  1726. //группируем события по получателю
  1727. foreach($result as $value){
  1728. $adresats[$value['email']]['user_messages'][$value['id']]['user_id']=$value['id'];
  1729. $adresats[$value['email']]['user_messages'][$value['id']]['name']=$value['name'];
  1730. $adresats[$value['email']]['user_messages'][$value['id']]['gender']=$value['gender'];
  1731. $adresats[$value['email']]['user_messages'][$value['id']]['surname']=$value['surname'];
  1732. $adresats[$value['email']]['user_messages'][$value['id']]['private_name']=$value['private_name'];
  1733. $adresats[$value['email']]['user_messages'][$value['id']]['private_name']=$value['private_name'];
  1734. $adresats[$value['email']]['user_messages'][$value['id']]['login']=$value['login'];
  1735. $adresats[$value['email']]['user_messages'][$value['id']]['count']=$value['count'];
  1736. $adresats[$value['email']]['user_messages'][$value['id']]['adresat_login']=$value['adresat_login'];
  1737. }
  1738. //получени предложений подружиться
  1739. include_once(__ENGINE_PATH.'/functions/classes/class_eventer.php');
  1740. $eventer=new Eventer($this->db);
  1741. $events=$eventer->get_events("e.`type`=10 AND e.`subtype`=1 AND e.`to_readed`=0 AND e.`created`>='{$time1}' AND e.`created`<'{$time2}'",false,true);
  1742. foreach($events as $value){
  1743. if($value['email_delivery']==1)
  1744. $adresats[$value['email']]['friendship'][]=$value;
  1745. }
  1746. //получение приглашений на мероприятия
  1747. /*$events=$eventer->get_events("e.`type`=10 AND e.`subtype`=12 AND e.`to_readed`=0 AND e.`created`>='{$time1}' AND e.`created`<'{$time2}'",true,true);
  1748. foreach($events as $value){
  1749. if($value['email_delivery']==1)
  1750. $adresats[$value['email']]['invites'][]=$value;
  1751. }*/
  1752. //формируем письмо
  1753. include_once(__ENGINE_PATH.'/functions/classes/class_mailer.php');
  1754. $mailer=new Mailer();
  1755. foreach($adresats as $email=>$events){
  1756. $subject='';
  1757. $msg='';
  1758. $adresat_email = $email;
  1759. include(__ENGINE_PATH.'/templates/email.new_user_events.php');
  1760. if(!@$mailer->mail($email, $subject,$msg)) {
  1761. trigger_error('Не удалось отправить оповещения о мероприятии',E_USER_WARNING);
  1762. }else
  1763. $count++;
  1764. }
  1765. return "отправлено писем - {$count}";
  1766. }
  1767. /**
  1768. * send email notifiers about users events
  1769. */
  1770. public function users_events_email_notifier2($days=5){
  1771. set_time_limit(300);
  1772. global $object_types;
  1773. $time1=gmdate("Y-m-d H:00:00",gmmktime(gmdate('H'),gmdate('i'),gmdate('s'),gmdate('m'),gmdate('j')-$days,gmdate('Y')));
  1774. //$time1='2012-05-20 03:00:00';
  1775. $time2=gmdate("Y-m-d H:00:00");
  1776. //$time2='2012-05-25 03:00:00';
  1777. $count=0;
  1778. $adresats=array();
  1779. //получаем новые мерпориятия по направлениям
  1780. $timetables = array();
  1781. $timetable_objects = array();
  1782. //SET group_concat_max_len =4096;
  1783. $sql="
  1784. SELECT
  1785. t.`id` as `timetable_id`,a.`name` as `action_name`,t.`name_extension`,t.`date_text`,a.`type`,a.`owner_id`,t.`action_id`,
  1786. UNIX_TIMESTAMP(t.`date`) as `date`,adr.`city`,a.`alias` as `action_alias`, t.`date` as `action_date`,t.`gender_type`,
  1787. 2 as `object_type`,GROUP_CONCAT(DISTINCT ol.`object2_id`) as `objects`,GROUP_CONCAT(DISTINCT ro.`region`) as `regions`
  1788. FROM
  1789. `timetable` t
  1790. LEFT JOIN `adresses` adr ON adr.`object_type`=6 AND adr.`object_id`=t.`id`
  1791. LEFT JOIN `actions` a ON a.`id`=t.`action_id`
  1792. LEFT JOIN `object_regions` ro ON ro.`object_type`=6 AND ro.`object_id`=t.`id` AND ro.`main_link`=0
  1793. LEFT JOIN `object_links` ol ON ol.`object1_type`=3 AND ol.`object2_type`=2 AND ol.`object1_id`=a.`id`
  1794. WHERE
  1795. t.`active`=1 AND t.`moderated`=1 AND t.`block`=0
  1796. AND t.`created`>='{$time1}' AND t.`created`<'{$time2}'
  1797. /*AND (t.`date` >= NOW() OR a.`type` IN (2,3))*/
  1798. GROUP BY
  1799. t.`id`
  1800. UNION
  1801. SELECT
  1802. t.`id` as `timetable_id`,a.`name` as `action_name`,t.`name_extension`,t.`date_text`,a.`type`,a.`owner_id`,t.`action_id`,
  1803. UNIX_TIMESTAMP(t.`date`) as `date`,adr.`city`,a.`alias` as `action_alias`, t.`date` as `action_date`,t.`gender_type`,
  1804. 4 as `object_type`,GROUP_CONCAT(DISTINCT ol.`object2_id`) as `objects`,GROUP_CONCAT(DISTINCT ro.`region`) as `regions`
  1805. FROM
  1806. `timetable` t
  1807. LEFT JOIN `adresses` adr ON adr.`object_type`=6 AND adr.`object_id`=t.`id`
  1808. LEFT JOIN `actions` a ON a.`id`=t.`action_id`
  1809. LEFT JOIN `object_regions` ro ON ro.`object_type`=6 AND ro.`object_id`=t.`id` AND ro.`main_link`=0
  1810. LEFT JOIN `object_links` ol ON ol.`object1_type`=6 AND ol.`object2_type`=4 AND ol.`object1_id`=t.`id`
  1811. WHERE
  1812. t.`active`=1 AND t.`moderated`=1 AND t.`block`=0
  1813. AND t.`created`>='{$time1}' AND t.`created`<'{$time2}'
  1814. /*AND (t.`date` >= NOW() OR a.`type` IN (2,3))*/
  1815. GROUP BY
  1816. t.`id`
  1817. UNION
  1818. SELECT
  1819. t.`id` as `timetable_id`,a.`name` as `action_name`,t.`name_extension`,t.`date_text`,a.`type`,a.`owner_id`,t.`action_id`,
  1820. UNIX_TIMESTAMP(t.`date`) as `date`,adr.`city`,a.`alias` as `action_alias`, t.`date` as `action_date`,t.`gender_type`,
  1821. 1 as `object_type`,GROUP_CONCAT(DISTINCT ol.`object2_id`) as `objects`,GROUP_CONCAT(DISTINCT ro.`region`) as `regions`
  1822. FROM
  1823. `timetable` t
  1824. LEFT JOIN `adresses` adr ON adr.`object_type`=6 AND adr.`object_id`=t.`id`
  1825. LEFT JOIN `actions` a ON a.`id`=t.`action_id`
  1826. LEFT JOIN `object_regions` ro ON ro.`object_type`=6 AND ro.`object_id`=t.`id` AND ro.`main_link`=0
  1827. LEFT JOIN `object_links` ol ON ol.`object1_type`=6 AND ol.`object2_type` IN (1,5) AND ol.`object1_id`=t.`id`
  1828. WHERE
  1829. t.`active`=1 AND t.`moderated`=1 AND t.`block`=0
  1830. AND t.`created`>='{$time1}' AND t.`created`<'{$time2}'
  1831. /*AND (t.`date` >= NOW() OR a.`type` IN (2,3))*/
  1832. GROUP BY
  1833. t.`id`
  1834. UNION
  1835. /* таблица objects_history */
  1836. SELECT
  1837. t.`id` as `timetable_id`,a.`name` as `action_name`,t.`name_extension`,t.`date_text`,a.`type`,a.`owner_id`,t.`action_id`,
  1838. UNIX_TIMESTAMP(t.`date`) as `date`,adr.`city`,a.`alias` as `action_alias`, t.`date` as `action_date`,t.`gender_type`,
  1839. 2 as `object_type`,GROUP_CONCAT(DISTINCT ol.`object2_id`) as `objects`,GROUP_CONCAT(DISTINCT ro.`region`) as `regions`
  1840. FROM
  1841. `objects_history` h
  1842. LEFT JOIN `timetable` t ON h.`object_id`=t.`id` AND t.`active`=1 AND t.`moderated`=1 AND t.`block`=0
  1843. LEFT JOIN `adresses` adr ON adr.`object_type`=6 AND adr.`object_id`=t.`id`
  1844. LEFT JOIN `actions` a ON a.`id`=t.`action_id`
  1845. LEFT JOIN `object_regions` ro ON ro.`object_type`=6 AND ro.`object_id`=t.`id` AND ro.`main_link`=0
  1846. LEFT JOIN `object_links` ol ON ol.`object1_type`=3 AND ol.`object2_type`=2 AND ol.`object1_id`=a.`id`
  1847. WHERE
  1848. h.`object_type`=6 AND h.`action_type`=2
  1849. AND h.`date`>='{$time1}' AND h.`date`<'{$time2}'
  1850. /*AND (t.`date` >= NOW() OR a.`type` IN (2,3))*/
  1851. GROUP BY
  1852. t.`id`
  1853. UNION
  1854. SELECT
  1855. t.`id` as `timetable_id`,a.`name` as `action_name`,t.`name_extension`,t.`date_text`,a.`type`,a.`owner_id`,t.`action_id`,
  1856. UNIX_TIMESTAMP(t.`date`) as `date`,adr.`city`,a.`alias` as `action_alias`, t.`date` as `action_date`,t.`gender_type`,
  1857. 4 as `object_type`,GROUP_CONCAT(DISTINCT ol.`object2_id`) as `objects`,GROUP_CONCAT(DISTINCT ro.`region`) as `regions`
  1858. FROM
  1859. `objects_history` h
  1860. LEFT JOIN `timetable` t ON h.`object_id`=t.`id` AND t.`active`=1 AND t.`moderated`=1 AND t.`block`=0
  1861. LEFT JOIN `adresses` adr ON adr.`object_type`=6 AND adr.`object_id`=t.`id`
  1862. LEFT JOIN `actions` a ON a.`id`=t.`action_id`
  1863. LEFT JOIN `object_regions` ro ON ro.`object_type`=6 AND ro.`object_id`=t.`id` AND ro.`main_link`=0
  1864. LEFT JOIN `object_links` ol ON ol.`object1_type`=6 AND ol.`object2_type`=4 AND ol.`object1_id`=t.`id`
  1865. WHERE
  1866. h.`object_type`=6 AND h.`action_type`=2
  1867. AND h.`date`>='{$time1}' AND h.`date`<'{$time2}'
  1868. /*AND (t.`date` >= NOW() OR a.`type` IN (2,3))*/
  1869. GROUP BY
  1870. t.`id`
  1871. UNION
  1872. SELECT
  1873. t.`id` as `timetable_id`,a.`name` as `action_name`,t.`name_extension`,t.`date_text`,a.`type`,a.`owner_id`,t.`action_id`,
  1874. UNIX_TIMESTAMP(t.`date`) as `date`,adr.`city`,a.`alias` as `action_alias`, t.`date` as `action_date`,t.`gender_type`,
  1875. 1 as `object_type`,GROUP_CONCAT(DISTINCT ol.`object2_id`) as `objects`,GROUP_CONCAT(DISTINCT ro.`region`) as `regions`
  1876. FROM
  1877. `objects_history` h
  1878. LEFT JOIN `timetable` t ON h.`object_id`=t.`id` AND t.`active`=1 AND t.`moderated`=1 AND t.`block`=0
  1879. LEFT JOIN `adresses` adr ON adr.`object_type`=6 AND adr.`object_id`=t.`id`
  1880. LEFT JOIN `actions` a ON a.`id`=t.`action_id`
  1881. LEFT JOIN `object_regions` ro ON ro.`object_type`=6 AND ro.`object_id`=t.`id` AND ro.`main_link`=0
  1882. LEFT JOIN `object_links` ol ON ol.`object1_type`=6 AND ol.`object2_type` IN (1,5) AND ol.`object1_id`=t.`id`
  1883. WHERE
  1884. h.`object_type`=6 AND h.`action_type`=2
  1885. AND h.`date`>='{$time1}' AND h.`date`<'{$time2}'
  1886. /*AND (t.`date` >= NOW() OR a.`type` IN (2,3))*/
  1887. GROUP BY
  1888. t.`id`
  1889. ORDER BY `object_type`
  1890. ";
  1891. $this->db->query($sql);
  1892. $result=$this->db->get_result();
  1893. foreach($result as $value){
  1894. //складируем информацию по мероприятию
  1895. $timetables[$value["timetable_id"]] = $value;
  1896. //складируем объекты, которые фигурируют в мероприятие
  1897. if(strlen($value["objects"])){
  1898. $objects = explode(",", $value["objects"]);
  1899. foreach($objects as $objects_id){
  1900. if(!isset($timetable_objects[$value["object_type"]][$objects_id]) || !in_array($value["timetable_id"], $timetable_objects[$value["object_type"]][$objects_id]))
  1901. $timetable_objects[$value["object_type"]][$objects_id][] = $value["timetable_id"];
  1902. }
  1903. }
  1904. if(!isset($timetable_objects[3][$value["action_id"]]) || !in_array($value["timetable_id"], $timetable_objects[3][$value["action_id"]]))
  1905. $timetable_objects[3][$value["action_id"]][] = $value["timetable_id"];
  1906. }
  1907. //теперь у нас есть набор всех объектов связанных с мероприятиями найдем всех юзеров которые интересуются ими
  1908. $sql = array();
  1909. if(isset($timetable_objects[1])){
  1910. $sql[] = "
  1911. SELECT
  1912. COALESCE(u.`email`, ui.`email`) as `email`,IF(u.`id` IS NULL, 1, 0) as `is_guest`,
  1913. COALESCE(u.`id`, 0) as `user_id`,COALESCE(u.`gender`, 0) as `gender`,ui.`object_type` as `object_type`,0 as `object_region`,
  1914. COALESCE(ur.`region`, ui.`region`) as `region`,t.`id` as `object_id`,t.`name` as `object_name`,t.`alias` as `object_alias`
  1915. FROM `user_interesting` ui
  1916. LEFT JOIN `users` u ON u.`id` = ui.`user_id` AND u.`email_delivery`=1 AND u.`block`=0
  1917. LEFT JOIN `users_regions` ur ON ur.`user_id` = u.`id`
  1918. JOIN `treiners` t ON t.`id`=ui.`object_id` AND t.`moderated`=1 AND t.`block`=0
  1919. WHERE
  1920. ui.`object_id` IN (".join(", ", array_keys($timetable_objects[1])).")
  1921. AND ui.`object_type` IN (1,5)
  1922. AND ui.`practing`=0
  1923. AND COALESCE(u.`email`, ui.`email`) != ''
  1924. AND COALESCE(u.`email`, ui.`email`) IS NOT NULL
  1925. GROUP BY `email`,`object_type`,`object_id`,`region`
  1926. ";
  1927. }
  1928. if(isset($timetable_objects[2])){
  1929. $sql[] = "
  1930. SELECT
  1931. COALESCE(u.`email`, ui.`email`) as `email`,IF(u.`id` IS NULL, 1, 0) as `is_guest`,
  1932. COALESCE(u.`id`, 0) as `user_id`,COALESCE(u.`gender`, 0) as `gender`,2 as `object_type`,0 as `object_region`,
  1933. COALESCE(ur.`region`, ui.`region`) as `region`,g.`id` as `object_id`,g.`name` as `object_name`,g.`alias` as `object_alias`
  1934. FROM `user_interesting` ui
  1935. LEFT JOIN `users` u ON u.`id` = ui.`user_id` AND u.`email_delivery`=1 AND u.`block`=0
  1936. LEFT JOIN `users_regions` ur ON ur.`user_id` = u.`id`
  1937. JOIN `guidelines` g ON g.`id`=ui.`object_id` AND g.`moderated`=1 AND g.`block`=0
  1938. WHERE
  1939. ui.`object_id` IN (".join(", ", array_keys($timetable_objects[2])).")
  1940. AND ui.`object_type`=2
  1941. AND ui.`practing`=0
  1942. AND COALESCE(u.`email`, ui.`email`) != ''
  1943. AND COALESCE(u.`email`, ui.`email`) IS NOT NULL
  1944. GROUP BY `email`,`object_type`,`object_id`,`region`
  1945. ";
  1946. }
  1947. if(isset($timetable_objects[4])){
  1948. $sql[] = "
  1949. SELECT
  1950. COALESCE(u.`email`, ui.`email`) as `email`,IF(u.`id` IS NULL, 1, 0) as `is_guest`,
  1951. COALESCE(u.`id`, 0) as `user_id`,COALESCE(u.`gender`, 0) as `gender`,4 as `object_type`,obr.`region` as `object_region`,
  1952. COALESCE(ur.`region`, ui.`region`) as `region`,o.`id` as `object_id`,o.`fullname` as `object_name`,o.`alias` as `object_alias`
  1953. FROM `user_interesting` ui
  1954. LEFT JOIN `users` u ON u.`id` = ui.`user_id` AND u.`email_delivery`=1 AND u.`block`=0
  1955. LEFT JOIN `users_regions` ur ON ur.`user_id` = u.`id`
  1956. JOIN `organizators` o ON o.`id`=ui.`object_id` AND o.`moderated`=1 AND o.`block`=0
  1957. JOIN `object_regions` obr ON o.`id`=obr.`object_id` AND obr.`object_type`=4 AND obr.`main_link`=1
  1958. WHERE
  1959. ui.`object_id` IN (".join(", ", array_keys($timetable_objects[4])).")
  1960. AND ui.`object_type`=4
  1961. AND ui.`practing`=0
  1962. AND COALESCE(u.`email`, ui.`email`) != ''
  1963. AND COALESCE(u.`email`, ui.`email`) IS NOT NULL
  1964. GROUP BY `email`,`object_type`,`object_id`,`region`
  1965. ";
  1966. }
  1967. if(isset($timetable_objects[3])){
  1968. $sql[] = "
  1969. SELECT
  1970. COALESCE(u.`email`, ui.`email`) as `email`,IF(u.`id` IS NULL, 1, 0) as `is_guest`,
  1971. COALESCE(u.`id`, 0) as `user_id`,COALESCE(u.`gender`, 0) as `gender`,3 as `object_type`,0 as `object_region`,
  1972. COALESCE(ur.`region`, ui.`region`) as `region`,ui.`object_id` as `object_id`,0 as `object_name`,0 as `object_alias`
  1973. FROM `user_interesting` ui
  1974. LEFT JOIN `users` u ON u.`id` = ui.`user_id` AND u.`email_delivery`=1 AND u.`block`=0
  1975. LEFT JOIN `users_regions` ur ON ur.`user_id` = u.`id`
  1976. WHERE
  1977. ui.`object_id` IN (".join(", ", array_keys($timetable_objects[3])).")
  1978. AND ui.`object_type`=3
  1979. AND ui.`practing`=0
  1980. AND COALESCE(u.`email`, ui.`email`) != ''
  1981. AND COALESCE(u.`email`, ui.`email`) IS NOT NULL
  1982. GROUP BY `email`,`object_type`,`object_id`,`region`
  1983. ";
  1984. }
  1985. $sql = join(" UNION ", $sql);
  1986. if(strlen($sql)){
  1987. $this->db->query($sql);
  1988. $result=$this->db->get_result();
  1989. $emails=array();
  1990. foreach($result as $value){
  1991. if(!strlen(trim($value['email'])))
  1992. continue;
  1993. $object_id = $value["object_id"];
  1994. $object_type = $value["object_type"];
  1995. if(isset($timetable_objects[$object_type][$object_id])){
  1996. foreach($timetable_objects[$object_type][$object_id] as $timetable_id){
  1997. $regions = explode(",", $timetables[$timetable_id]['regions']);
  1998. if((in_array($value["region"], $regions) || $value["region"] == 0 || $timetables[$timetable_id]['type'] == 4)
  1999. && $value["user_id"] != $timetables[$timetable_id]["owner_id"]
  2000. && (in_array($timetables[$timetable_id]['gender_type'], array(0, $value['gender'])) || $value['gender'] == 0) ){
  2001. if(!isset($adresats[$value['email']][6][$timetable_id])){
  2002. $adresats[$value['email']][6][$timetable_id]['timetable_id']=$timetable_id;
  2003. $adresats[$value['email']][6][$timetable_id]['action_name']=$timetables[$timetable_id]['action_name'];
  2004. $adresats[$value['email']][6][$timetable_id]['action_alias']=$timetables[$timetable_id]['action_alias'];
  2005. $adresats[$value['email']][6][$timetable_id]['name_extension']=$timetables[$timetable_id]['name_extension'];
  2006. $adresats[$value['email']][6][$timetable_id]['date_text']=$timetables[$timetable_id]['date_text'];
  2007. $adresats[$value['email']][6][$timetable_id]['date']=$timetables[$timetable_id]['date'];
  2008. $adresats[$value['email']][6][$timetable_id]['type']=$timetables[$timetable_id]['type'];
  2009. $adresats[$value['email']][6][$timetable_id]['city']=$timetables[$timetable_id]['city'];
  2010. $adresats[$value['email']][6][$timetable_id]['regions']=$timetables[$timetable_id]['regions'];
  2011. }
  2012. $adresats[$value['email']][6][$timetable_id]['objects'][$object_type][$object_id]=array(
  2013. "alias"=>$value['object_alias'],
  2014. "name"=>$value['object_name'],
  2015. "region"=>$value['object_region']
  2016. );
  2017. }
  2018. }
  2019. }
  2020. }
  2021. }
  2022. //получение новостей
  2023. $sql="
  2024. SELECT o.`id`,obj.`name` as `object_name`,obj.`alias` as `object_alias`,2 as `object_type`,obj.`id` as `object_id`,
  2025. 0 as `object_region`,COALESCE(u.`email`,ui.`email`,'') as `email`,o.`name` as `news_name`,o.`alias` as `news_alias`
  2026. FROM `news` o
  2027. LEFT JOIN `object_regions` ro ON ro.`object_type`=7 AND ro.`object_id`=o.`id`
  2028. LEFT JOIN `object_links` ol ON ol.`object1_type`=7 AND ol.`object1_id`=o.`id` AND ol.`object2_type`=2
  2029. LEFT JOIN `object_links` ol2 ON ol2.`object2_type`=7 AND ol2.`object2_id`=o.`id` AND ol2.`object1_type`=2
  2030. LEFT JOIN `guidelines` obj ON obj.`id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND obj.`moderated`=1 AND obj.`block`=0
  2031. INNER JOIN `user_interesting` ui ON ui.`user_id`!=o.`owner_id` AND ui.`object_type`=2 AND ui.`object_id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND ui.`practing`=0
  2032. LEFT JOIN `users` u ON u.`id`=ui.`user_id`
  2033. LEFT JOIN `users_regions` ur ON ur.`user_id`=u.`id`
  2034. WHERE
  2035. o.`moderated`=1 AND o.`block`=0
  2036. AND (u.`email_delivery`=1 OR u.`email_delivery` IS NULL)
  2037. AND (ro.`region` IS NULL OR ur.`region` IS NULL OR ur.`region`=ro.`region`)
  2038. AND o.`visible_start_date`>='{$time1}' AND o.`visible_start_date`<'{$time2}'
  2039. GROUP BY o.`id`,`object_type`,obj.`id`,`email`
  2040. UNION
  2041. SELECT o.`id`,obj.`name` as `object_name`,obj.`alias` as `object_alias`,3 as `object_type`,obj.`id` as `object_id`,
  2042. 0 as `object_region`,COALESCE(u.`email`,ui.`email`,'') as `email`,o.`name` as `news_name`,o.`alias` as `news_alias`
  2043. FROM `news` o
  2044. LEFT JOIN `object_regions` ro ON ro.`object_type`=7 AND ro.`object_id`=o.`id`
  2045. LEFT JOIN `object_links` ol ON ol.`object1_type`=7 AND ol.`object1_id`=o.`id` AND ol.`object2_type`=3
  2046. LEFT JOIN `object_links` ol2 ON ol2.`object2_type`=7 AND ol2.`object2_id`=o.`id` AND ol2.`object1_type`=3
  2047. LEFT JOIN `actions` obj ON obj.`id`=COALESCE(ol.`object2_id`,ol2.`object1_id`)
  2048. INNER JOIN `user_interesting` ui ON ui.`user_id`!=o.`owner_id` AND ui.`object_type`=3 AND ui.`object_id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND ui.`practing`=0
  2049. LEFT JOIN `users` u ON u.`id`=ui.`user_id`
  2050. LEFT JOIN `users_regions` ur ON ur.`user_id`=u.`id`
  2051. WHERE
  2052. o.`moderated`=1 AND o.`block`=0
  2053. AND (u.`email_delivery`=1 OR u.`email_delivery` IS NULL)
  2054. AND (ro.`region` IS NULL OR ur.`region` IS NULL OR ur.`region`=ro.`region`)
  2055. AND o.`visible_start_date`>='{$time1}' AND o.`visible_start_date`<'{$time2}'
  2056. GROUP BY o.`id`,`object_type`,obj.`id`,`email`
  2057. UNION
  2058. SELECT o.`id`, obj.`fullname` as `object_name`,obj.`alias` as `object_alias`,4 as `object_type`,obj.`id` as `object_id`,obr.`region` as `object_region`,
  2059. COALESCE(u.`email`,ui.`email`,'') as `email`,o.`name` as `news_name`,o.`alias` as `news_alias`
  2060. FROM `news` o
  2061. LEFT JOIN `object_regions` ro ON ro.`object_type`=7 AND ro.`object_id`=o.`id`
  2062. LEFT JOIN `object_links` ol ON ol.`object1_type`=7 AND ol.`object1_id`=o.`id` AND ol.`object2_type`=4
  2063. LEFT JOIN `object_links` ol2 ON ol2.`object2_type`=7 AND ol2.`object2_id`=o.`id` AND ol2.`object1_type`=4
  2064. LEFT JOIN `organizators` obj ON obj.`id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND obj.`moderated`=1 AND obj.`block`=0
  2065. LEFT JOIN `object_regions` obr ON obj.`id`=obr.`object_id` AND obr.`object_type`=4 AND obr.`main_link`=1
  2066. INNER JOIN `user_interesting` ui ON ui.`user_id`!=o.`owner_id` AND ui.`object_type`=4 AND ui.`object_id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND ui.`practing`=0
  2067. LEFT JOIN `users` u ON u.`id`=ui.`user_id`
  2068. LEFT JOIN `users_regions` ur ON ur.`user_id`=u.`id`
  2069. WHERE
  2070. o.`moderated`=1 AND o.`block`=0
  2071. AND (u.`email_delivery`=1 OR u.`email_delivery` IS NULL)
  2072. AND (ro.`region` IS NULL OR ur.`region` IS NULL OR ur.`region`=ro.`region`)
  2073. AND o.`visible_start_date`>='{$time1}' AND o.`visible_start_date`<'{$time2}'
  2074. GROUP BY o.`id`,`object_type`,obj.`id`,`email`
  2075. UNION
  2076. SELECT o.`id`, obj.`name` as `object_name`,obj.`alias` as `object_alias`,
  2077. COALESCE(ol.`object2_type`,ol2.`object1_type`) as `object_type`,obj.`id` as `object_id`,0 as `object_region`,
  2078. COALESCE(u.`email`,ui.`email`,'') as `email`,o.`name` as `news_name`,o.`alias` as `news_alias`
  2079. FROM `news` o
  2080. LEFT JOIN `object_regions` ro ON ro.`object_type`=7 AND ro.`object_id`=o.`id`
  2081. LEFT JOIN `object_links` ol ON ol.`object1_type`=7 AND ol.`object1_id`=o.`id` AND ol.`object2_type` IN (1,5)
  2082. LEFT JOIN `object_links` ol2 ON ol2.`object2_type`=7 AND ol2.`object2_id`=o.`id` AND ol2.`object1_type` IN (1,5)
  2083. LEFT JOIN `treiners` obj ON obj.`id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND obj.`moderated`=1 AND obj.`block`=0
  2084. INNER JOIN `user_interesting` ui ON ui.`user_id`!=o.`owner_id` AND ui.`object_type` IN (1,5) AND ui.`object_id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND ui.`practing`=0
  2085. LEFT JOIN `users` u ON u.`id`=ui.`user_id`
  2086. LEFT JOIN `users_regions` ur ON ur.`user_id`=u.`id`
  2087. WHERE
  2088. o.`moderated`=1 AND o.`block`=0
  2089. AND (u.`email_delivery`=1 OR u.`email_delivery` IS NULL)
  2090. AND (ro.`region` IS NULL OR ur.`region` IS NULL OR ur.`region`=ro.`region`)
  2091. AND o.`visible_start_date`>='{$time1}' AND o.`visible_start_date`<'{$time2}'
  2092. GROUP BY o.`id`,`object_type`,obj.`id`,`email`
  2093. /* таблица objects_history */
  2094. UNION
  2095. SELECT o.`id`,obj.`name` as `object_name`,obj.`alias` as `object_alias`,2 as `object_type`,obj.`id` as `object_id`,0 as `object_region`,
  2096. COALESCE(u.`email`,ui.`email`,'') as `email`,o.`name` as `news_name`,o.`alias` as `news_alias`
  2097. FROM `objects_history` h
  2098. LEFT JOIN `news` o ON h.`object_id`=o.`id` AND o.`moderated`=1 AND o.`block`=0
  2099. LEFT JOIN `object_regions` ro ON ro.`object_type`=7 AND ro.`object_id`=o.`id`
  2100. LEFT JOIN `object_links` ol ON ol.`object1_type`=7 AND ol.`object1_id`=o.`id` AND ol.`object2_type`=2
  2101. LEFT JOIN `object_links` ol2 ON ol2.`object2_type`=7 AND ol2.`object2_id`=o.`id` AND ol2.`object1_type`=2
  2102. LEFT JOIN `guidelines` obj ON obj.`id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND obj.`moderated`=1 AND obj.`block`=0
  2103. INNER JOIN `user_interesting` ui ON ui.`user_id`!=o.`owner_id` AND ui.`object_type`=2 AND ui.`object_id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND ui.`practing`=0
  2104. LEFT JOIN `users` u ON u.`id`=ui.`user_id`
  2105. LEFT JOIN `users_regions` ur ON ur.`user_id`=u.`id`
  2106. WHERE
  2107. h.`object_type`=7 AND h.`action_type`=2
  2108. AND (u.`email_delivery`=1 OR u.`email_delivery` IS NULL)
  2109. AND (ro.`region` IS NULL OR ur.`region` IS NULL OR ur.`region`=ro.`region`)
  2110. AND h.`date`>='{$time1}' AND h.`date`<'{$time2}'
  2111. GROUP BY o.`id`,`object_type`,obj.`id`,`email`
  2112. UNION
  2113. SELECT o.`id`,obj.`name` as `object_name`,obj.`alias` as `object_alias`,3 as `object_type`,obj.`id` as `object_id`,0 as `object_region`,
  2114. COALESCE(u.`email`,ui.`email`,'') as `email`,o.`name` as `news_name`,o.`alias` as `news_alias`
  2115. FROM `objects_history` h
  2116. LEFT JOIN `news` o ON h.`object_id`=o.`id` AND o.`moderated`=1 AND o.`block`=0
  2117. LEFT JOIN `object_regions` ro ON ro.`object_type`=7 AND ro.`object_id`=o.`id`
  2118. LEFT JOIN `object_links` ol ON ol.`object1_type`=7 AND ol.`object1_id`=o.`id` AND ol.`object2_type`=3
  2119. LEFT JOIN `object_links` ol2 ON ol2.`object2_type`=7 AND ol2.`object2_id`=o.`id` AND ol2.`object1_type`=3
  2120. LEFT JOIN `actions` obj ON obj.`id`=COALESCE(ol.`object2_id`,ol2.`object1_id`)
  2121. INNER JOIN `user_interesting` ui ON ui.`user_id`!=o.`owner_id` AND ui.`object_type`=3 AND ui.`object_id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND ui.`practing`=0
  2122. LEFT JOIN `users` u ON u.`id`=ui.`user_id`
  2123. LEFT JOIN `users_regions` ur ON ur.`user_id`=u.`id`
  2124. WHERE
  2125. h.`object_type`=7 AND h.`action_type`=2
  2126. AND (u.`email_delivery`=1 OR u.`email_delivery` IS NULL)
  2127. AND (ro.`region` IS NULL OR ur.`region` IS NULL OR ur.`region`=ro.`region`)
  2128. AND h.`date`>='{$time1}' AND h.`date`<'{$time2}'
  2129. GROUP BY o.`id`,`object_type`,obj.`id`,`email`
  2130. UNION
  2131. SELECT o.`id`,obj.`name` as `object_name`,obj.`alias` as `object_alias`,
  2132. COALESCE(ol.`object2_type`,ol2.`object1_type`) as `object_type`,obj.`id` as `object_id`,0 as `object_region`,
  2133. COALESCE(u.`email`,ui.`email`,'') as `email`,o.`name` as `news_name`,o.`alias` as `news_alias`
  2134. FROM `objects_history` h
  2135. LEFT JOIN `news` o ON h.`object_id`=o.`id` AND o.`moderated`=1 AND o.`block`=0
  2136. LEFT JOIN `object_regions` ro ON ro.`object_type`=7 AND ro.`object_id`=o.`id`
  2137. LEFT JOIN `object_links` ol ON ol.`object1_type`=7 AND ol.`object1_id`=o.`id` AND ol.`object2_type` IN (1,5)
  2138. LEFT JOIN `object_links` ol2 ON ol2.`object2_type`=7 AND ol2.`object2_id`=o.`id` AND ol2.`object1_type` IN (1,5)
  2139. LEFT JOIN `treiners` obj ON obj.`id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND obj.`moderated`=1 AND obj.`block`=0
  2140. INNER JOIN `user_interesting` ui ON ui.`user_id`!=o.`owner_id` AND ui.`object_type` IN (1,5) AND ui.`object_id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND ui.`practing`=0
  2141. LEFT JOIN `users` u ON u.`id`=ui.`user_id`
  2142. LEFT JOIN `users_regions` ur ON ur.`user_id`=u.`id`
  2143. WHERE
  2144. h.`object_type`=7 AND h.`action_type`=2
  2145. AND (u.`email_delivery`=1 OR u.`email_delivery` IS NULL)
  2146. AND (ro.`region` IS NULL OR ur.`region` IS NULL OR ur.`region`=ro.`region`)
  2147. AND h.`date`>='{$time1}' AND h.`date`<'{$time2}'
  2148. GROUP BY o.`id`,`object_type`,obj.`id`,`email`
  2149. UNION
  2150. SELECT o.`id`,obj.`fullname` as `object_name`,obj.`alias` as `object_alias`,4 as `object_type`,obj.`id` as `object_id`,obr.`region` as `object_region`,
  2151. COALESCE(u.`email`,ui.`email`,'') as `email`,o.`name` as `news_name`,o.`alias` as `news_alias`
  2152. FROM `objects_history` h
  2153. LEFT JOIN `news` o ON h.`object_id`=o.`id` AND o.`moderated`=1 AND o.`block`=0
  2154. LEFT JOIN `object_regions` ro ON ro.`object_type`=7 AND ro.`object_id`=o.`id`
  2155. LEFT JOIN `object_links` ol ON ol.`object1_type`=7 AND ol.`object1_id`=o.`id` AND ol.`object2_type`=4
  2156. LEFT JOIN `object_links` ol2 ON ol2.`object2_type`=7 AND ol2.`object2_id`=o.`id` AND ol2.`object1_type`=4
  2157. LEFT JOIN `organizators` obj ON obj.`id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND obj.`moderated`=1 AND obj.`block`=0
  2158. LEFT JOIN `object_regions` obr ON obj.`id`=obr.`object_id` AND obr.`object_type`=4 AND obr.`main_link`=1
  2159. INNER JOIN `user_interesting` ui ON ui.`user_id`!=o.`owner_id` AND ui.`object_type`=4 AND ui.`object_id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND ui.`practing`=0
  2160. LEFT JOIN `users` u ON u.`id`=ui.`user_id`
  2161. LEFT JOIN `users_regions` ur ON ur.`user_id`=u.`id`
  2162. WHERE
  2163. h.`object_type`=7 AND h.`action_type`=2
  2164. AND (u.`email_delivery`=1 OR u.`email_delivery` IS NULL)
  2165. AND (ro.`region` IS NULL OR ur.`region` IS NULL OR ur.`region`=ro.`region`)
  2166. AND h.`date`>='{$time1}' AND h.`date`<'{$time2}'
  2167. GROUP BY o.`id`,`object_type`,obj.`id`,`email`
  2168. ";
  2169. $this->db->query($sql);
  2170. $result=$this->db->get_result();
  2171. foreach($result as $value){
  2172. if(!strlen(trim($value['email'])))
  2173. continue;
  2174. if(!isset($adresats[$value['email']][7][$value['id']])){
  2175. $adresats[$value['email']][7][$value['id']]['id']=$value['id'];
  2176. $adresats[$value['email']][7][$value['id']]['news_name']=$value['news_name'];
  2177. $adresats[$value['email']][7][$value['id']]['news_alias']=$value['news_alias'];
  2178. //$adresats[$value['email']][7][$value['id']]['news_region']=$value['region'];
  2179. }
  2180. $adresats[$value['email']][7][$value['id']]['objects'][$value["object_type"]][$value['object_id']]=array(
  2181. "alias"=>$value['object_alias'],
  2182. "name"=>$value['object_name'],
  2183. "region"=>$value['object_region']
  2184. );
  2185. }
  2186. //получение статей
  2187. $sql="
  2188. SELECT o.`id`,obj.`name` as `object_name`,obj.`alias` as `object_alias`,2 as `object_type`,obj.`id` as `object_id`,0 as `object_region`,
  2189. COALESCE(u.`email`,ui.`email`,'') as `email`,o.`name` as `article_name`,o.`alias` as `article_alias`
  2190. FROM `articles` o
  2191. LEFT JOIN `object_regions` ro ON ro.`object_type`=8 AND ro.`object_id`=o.`id`
  2192. LEFT JOIN `object_links` ol ON ol.`object1_type`=8 AND ol.`object1_id`=o.`id` AND ol.`object2_type`=2
  2193. LEFT JOIN `object_links` ol2 ON ol2.`object2_type`=8 AND ol2.`object2_id`=o.`id` AND ol2.`object1_type`=2
  2194. LEFT JOIN `guidelines` obj ON obj.`id`=COALESCE(ol.`object2_id`,ol2.`object1_id`)
  2195. INNER JOIN `user_interesting` ui ON ui.`user_id`!=o.`owner_id` AND ui.`object_type`=2 AND ui.`object_id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND ui.`practing`=0
  2196. LEFT JOIN `users` u ON u.`id`=ui.`user_id`
  2197. LEFT JOIN `users_regions` ur ON ur.`user_id`=u.`id`
  2198. WHERE
  2199. o.`moderated`=1 AND o.`block`=0
  2200. AND (u.`email_delivery`=1 OR u.`email_delivery` IS NULL)
  2201. AND (ro.`region` IS NULL OR ur.`region` IS NULL OR ur.`region`=ro.`region`)
  2202. AND o.`created`>='{$time1}' AND o.`created`<'{$time2}'
  2203. GROUP BY o.`id`,`object_type`,obj.`id`,`email`
  2204. UNION
  2205. SELECT o.`id`,obj.`name` as `object_name`,obj.`alias` as `object_alias`,3 as `object_type`,obj.`id` as `object_id`,0 as `object_region`,
  2206. COALESCE(u.`email`,ui.`email`,'') as `email`,o.`name` as `article_name`,o.`alias` as `article_alias`
  2207. FROM `articles` o
  2208. LEFT JOIN `object_regions` ro ON ro.`object_type`=8 AND ro.`object_id`=o.`id`
  2209. LEFT JOIN `object_links` ol ON ol.`object1_type`=8 AND ol.`object1_id`=o.`id` AND ol.`object2_type`=3
  2210. LEFT JOIN `object_links` ol2 ON ol2.`object2_type`=8 AND ol2.`object2_id`=o.`id` AND ol2.`object1_type`=3
  2211. LEFT JOIN `actions` obj ON obj.`id`=COALESCE(ol.`object2_id`,ol2.`object1_id`)
  2212. INNER JOIN `user_interesting` ui ON ui.`user_id`!=o.`owner_id` AND ui.`object_type`=3 AND ui.`object_id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND ui.`practing`=0
  2213. LEFT JOIN `users` u ON u.`id`=ui.`user_id`
  2214. LEFT JOIN `users_regions` ur ON ur.`user_id`=u.`id`
  2215. WHERE
  2216. o.`moderated`=1 AND o.`block`=0
  2217. AND (u.`email_delivery`=1 OR u.`email_delivery` IS NULL)
  2218. AND (ro.`region` IS NULL OR ur.`region` IS NULL OR ur.`region`=ro.`region`)
  2219. AND o.`created`>='{$time1}' AND o.`created`<'{$time2}'
  2220. GROUP BY o.`id`,`object_type`,obj.`id`,`email`
  2221. UNION
  2222. SELECT o.`id`,obj.`fullname` as `object_name`,obj.`alias` as `object_alias`,4 as `object_type`,obj.`id` as `object_id`,obr.`region` as `object_region`,
  2223. COALESCE(u.`email`,ui.`email`,'') as `email`,o.`name` as `article_name`,o.`alias` as `article_alias`
  2224. FROM `articles` o
  2225. LEFT JOIN `object_regions` ro ON ro.`object_type`=8 AND ro.`object_id`=o.`id`
  2226. LEFT JOIN `object_links` ol ON ol.`object1_type`=8 AND ol.`object1_id`=o.`id` AND ol.`object2_type`=4
  2227. LEFT JOIN `object_links` ol2 ON ol2.`object2_type`=8 AND ol2.`object2_id`=o.`id` AND ol2.`object1_type`=4
  2228. LEFT JOIN `organizators` obj ON obj.`id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND obj.`moderated`=1 AND obj.`block`=0
  2229. LEFT JOIN `object_regions` obr ON obj.`id`=obr.`object_id` AND obr.`object_type`=4 AND obr.`main_link`=1
  2230. INNER JOIN `user_interesting` ui ON ui.`user_id`!=o.`owner_id` AND ui.`object_type`=4 AND ui.`object_id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND ui.`practing`=0
  2231. LEFT JOIN `users` u ON u.`id`=ui.`user_id`
  2232. LEFT JOIN `users_regions` ur ON ur.`user_id`=u.`id`
  2233. WHERE
  2234. o.`moderated`=1 AND o.`block`=0
  2235. AND (u.`email_delivery`=1 OR u.`email_delivery` IS NULL)
  2236. AND (ro.`region` IS NULL OR ur.`region` IS NULL OR ur.`region`=ro.`region`)
  2237. AND o.`created`>='{$time1}' AND o.`created`<'{$time2}'
  2238. GROUP BY o.`id`,`object_type`,obj.`id`,`email`
  2239. UNION
  2240. SELECT o.`id`,obj.`name` as `object_name`,obj.`alias` as `object_alias`,
  2241. COALESCE(ol.`object2_type`,ol2.`object1_type`) as `object_type`,obj.`id` as `object_id`,0 as `object_region`,
  2242. COALESCE(u.`email`,ui.`email`,'') as `email`,o.`name` as `article_name`,o.`alias` as `article_alias`
  2243. FROM `articles` o
  2244. LEFT JOIN `object_regions` ro ON ro.`object_type`=8 AND ro.`object_id`=o.`id`
  2245. LEFT JOIN `object_links` ol ON ol.`object1_type`=8 AND ol.`object1_id`=o.`id` AND ol.`object2_type` IN (1,5)
  2246. LEFT JOIN `object_links` ol2 ON ol2.`object2_type`=8 AND ol2.`object2_id`=o.`id` AND ol2.`object1_type` IN (1,5)
  2247. LEFT JOIN `treiners` obj ON obj.`id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND obj.`moderated`=1 AND obj.`block`=0
  2248. INNER JOIN `user_interesting` ui ON ui.`user_id`!=o.`owner_id` AND ui.`object_type` IN (1,5) AND ui.`object_id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND ui.`practing`=0
  2249. LEFT JOIN `users` u ON u.`id`=ui.`user_id`
  2250. LEFT JOIN `users_regions` ur ON ur.`user_id`=u.`id`
  2251. WHERE
  2252. o.`moderated`=1 AND o.`block`=0
  2253. AND (u.`email_delivery`=1 OR u.`email_delivery` IS NULL)
  2254. AND (ro.`region` IS NULL OR ur.`region` IS NULL OR ur.`region`=ro.`region`)
  2255. AND o.`created`>='{$time1}' AND o.`created`<'{$time2}'
  2256. GROUP BY o.`id`,`object_type`,obj.`id`,`email`
  2257. UNION
  2258. /* таблица objects_history */
  2259. SELECT o.`id`,obj.`name` as `object_name`,obj.`alias` as `object_alias`,2 as `object_type`,obj.`id` as `object_id`,0 as `object_region`,
  2260. COALESCE(u.`email`,ui.`email`,'') as `email`,o.`name` as `article_name`,o.`alias` as `article_alias`
  2261. FROM `objects_history` h
  2262. LEFT JOIN `articles` o ON h.`object_id`=o.`id` AND o.`moderated`=1 AND o.`block`=0
  2263. LEFT JOIN `object_regions` ro ON ro.`object_type`=8 AND ro.`object_id`=o.`id`
  2264. LEFT JOIN `object_links` ol ON ol.`object1_type`=8 AND ol.`object1_id`=o.`id` AND ol.`object2_type`=2
  2265. LEFT JOIN `object_links` ol2 ON ol2.`object2_type`=8 AND ol2.`object2_id`=o.`id` AND ol2.`object1_type`=2
  2266. LEFT JOIN `guidelines` obj ON obj.`id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND obj.`moderated`=1 AND obj.`block`=0
  2267. INNER JOIN `user_interesting` ui ON ui.`user_id`!=o.`owner_id` AND ui.`object_type`=2 AND ui.`object_id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND ui.`practing`=0
  2268. LEFT JOIN `users` u ON u.`id`=ui.`user_id`
  2269. LEFT JOIN `users_regions` ur ON ur.`user_id`=u.`id`
  2270. WHERE
  2271. h.`object_type`=8 AND h.`action_type`=2
  2272. AND (u.`email_delivery`=1 OR u.`email_delivery` IS NULL)
  2273. AND (ro.`region` IS NULL OR ur.`region` IS NULL OR ur.`region`=ro.`region`)
  2274. AND h.`date`>='{$time1}' AND h.`date`<'{$time2}'
  2275. GROUP BY o.`id`,`object_type`,obj.`id`,`email`
  2276. UNION
  2277. SELECT o.`id`,obj.`name` as `object_name`,obj.`alias` as `object_alias`,3 as `object_type`,obj.`id` as `object_id`,0 as `object_region`,
  2278. COALESCE(u.`email`,ui.`email`,'') as `email`,o.`name` as `article_name`,o.`alias` as `article_alias`
  2279. FROM `objects_history` h
  2280. LEFT JOIN `articles` o ON h.`object_id`=o.`id` AND o.`moderated`=1 AND o.`block`=0
  2281. LEFT JOIN `object_regions` ro ON ro.`object_type`=8 AND ro.`object_id`=o.`id`
  2282. LEFT JOIN `object_links` ol ON ol.`object1_type`=8 AND ol.`object1_id`=o.`id` AND ol.`object2_type`=3
  2283. LEFT JOIN `object_links` ol2 ON ol2.`object2_type`=8 AND ol2.`object2_id`=o.`id` AND ol2.`object1_type`=3
  2284. LEFT JOIN `actions` obj ON obj.`id`=COALESCE(ol.`object2_id`,ol2.`object1_id`)
  2285. INNER JOIN `user_interesting` ui ON ui.`user_id`!=o.`owner_id` AND ui.`object_type`=3 AND ui.`object_id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND ui.`practing`=0
  2286. LEFT JOIN `users` u ON u.`id`=ui.`user_id`
  2287. LEFT JOIN `users_regions` ur ON ur.`user_id`=u.`id`
  2288. WHERE
  2289. h.`object_type`=8 AND h.`action_type`=2
  2290. AND (u.`email_delivery`=1 OR u.`email_delivery` IS NULL)
  2291. AND (ro.`region` IS NULL OR ur.`region` IS NULL OR ur.`region`=ro.`region`)
  2292. AND h.`date`>='{$time1}' AND h.`date`<'{$time2}'
  2293. GROUP BY o.`id`,`object_type`,obj.`id`,`email`
  2294. UNION
  2295. SELECT o.`id`,obj.`fullname` as `object_name`,obj.`alias` as `object_alias`,4 as `object_type`,obj.`id` as `object_id`,obr.`region` as `object_region`,
  2296. COALESCE(u.`email`,ui.`email`,'') as `email`,o.`name` as `article_name`,o.`alias` as `article_alias`
  2297. FROM `objects_history` h
  2298. LEFT JOIN `articles` o ON h.`object_id`=o.`id` AND o.`moderated`=1 AND o.`block`=0
  2299. LEFT JOIN `object_regions` ro ON ro.`object_type`=8 AND ro.`object_id`=o.`id`
  2300. LEFT JOIN `object_links` ol ON ol.`object1_type`=8 AND ol.`object1_id`=o.`id` AND ol.`object2_type`=4
  2301. LEFT JOIN `object_links` ol2 ON ol2.`object2_type`=8 AND ol2.`object2_id`=o.`id` AND ol2.`object1_type`=4
  2302. LEFT JOIN `organizators` obj ON obj.`id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND obj.`moderated`=1 AND obj.`block`=0
  2303. LEFT JOIN `object_regions` obr ON obj.`id`=obr.`object_id` AND obr.`object_type`=4 AND obr.`main_link`=1
  2304. INNER JOIN `user_interesting` ui ON ui.`user_id`!=o.`owner_id` AND ui.`object_type`=4 AND ui.`object_id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND ui.`practing`=0
  2305. LEFT JOIN `users` u ON u.`id`=ui.`user_id`
  2306. LEFT JOIN `users_regions` ur ON ur.`user_id`=u.`id`
  2307. WHERE
  2308. h.`object_type`=8 AND h.`action_type`=2
  2309. AND (u.`email_delivery`=1 OR u.`email_delivery` IS NULL)
  2310. AND (ro.`region` IS NULL OR ur.`region` IS NULL OR ur.`region`=ro.`region`)
  2311. AND h.`date`>='{$time1}' AND h.`date`<'{$time2}'
  2312. GROUP BY o.`id`,`object_type`,obj.`id`,`email`
  2313. UNION
  2314. SELECT o.`id`,obj.`name` as `object_name`,obj.`alias` as `object_alias`,
  2315. COALESCE(ol.`object2_type`,ol2.`object1_type`) as `object_type`,obj.`id` as `object_id`,0 as `object_region`,
  2316. COALESCE(u.`email`,ui.`email`,'') as `email`,o.`name` as `article_name`,o.`alias` as `article_alias`
  2317. FROM `objects_history` h
  2318. LEFT JOIN `articles` o ON h.`object_id`=o.`id` AND o.`moderated`=1 AND o.`block`=0
  2319. LEFT JOIN `object_regions` ro ON ro.`object_type`=8 AND ro.`object_id`=o.`id`
  2320. LEFT JOIN `object_links` ol ON ol.`object1_type`=8 AND ol.`object1_id`=o.`id` AND ol.`object2_type` IN (1,5)
  2321. LEFT JOIN `object_links` ol2 ON ol2.`object2_type`=8 AND ol2.`object2_id`=o.`id` AND ol2.`object1_type` IN (1,5)
  2322. LEFT JOIN `treiners` obj ON obj.`id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND obj.`moderated`=1 AND obj.`block`=0
  2323. INNER JOIN `user_interesting` ui ON ui.`user_id`!=o.`owner_id` AND ui.`object_type` IN (1,5) AND ui.`object_id`=COALESCE(ol.`object2_id`,ol2.`object1_id`) AND ui.`practing`=0
  2324. LEFT JOIN `users` u ON u.`id`=ui.`user_id`
  2325. LEFT JOIN `users_regions` ur ON ur.`user_id`=u.`id`
  2326. WHERE
  2327. h.`object_type`=8 AND h.`action_type`=2
  2328. AND (u.`email_delivery`=1 OR u.`email_delivery` IS NULL)
  2329. AND (ro.`region` IS NULL OR ur.`region` IS NULL OR ur.`region`=ro.`region`)
  2330. AND h.`date`>='{$time1}' AND h.`date`<'{$time2}'
  2331. GROUP BY o.`id`,`object_type`,obj.`id`,`email`
  2332. ";
  2333. $this->db->query($sql);
  2334. $result=$this->db->get_result();
  2335. foreach($result as $value){
  2336. if(!strlen(trim($value['email'])))
  2337. continue;
  2338. if(!isset($adresats[$value['email']][8][$value['id']])){
  2339. $adresats[$value['email']][8][$value['id']]['id']=$value['id'];
  2340. $adresats[$value['email']][8][$value['id']]['article_name']=$value['article_name'];
  2341. $adresats[$value['email']][8][$value['id']]['article_alias']=$value['article_alias'];
  2342. }
  2343. $adresats[$value['email']][8][$value['id']]['objects'][$value["object_type"]][$value['object_id']]=array(
  2344. "alias"=>$value['object_alias'],
  2345. "name"=>$value['object_name'],
  2346. "region"=>$value['object_region']
  2347. );
  2348. }
  2349. //Видео - пока без связанных объектов
  2350. //Находим видео, добавленные в объекте
  2351. $sql = "
  2352. SELECT v.`id`, v.`name` as `video_name`, v.`object_id`, v.`object_type`, COALESCE(u.`email`,ui.`email`,'') as `email`,
  2353. COALESCE(o1.`name`, o2.`name`, o3.`name`, o4.`name`) as `object_name`, COALESCE(o1.`alias`, o2.`alias`, o3.`alias`, o4.`alias`) as `object_alias`,
  2354. COALESCE(obr.`region`, 0) as `object_region`
  2355. FROM `video` v
  2356. JOIN `user_interesting` ui ON ui.`object_id`=v.`object_id` AND ui.`object_type`=v.`object_type` AND ui.`practing`=0
  2357. LEFT JOIN `users` u ON u.`id`=ui.`user_id`
  2358. LEFT JOIN `treiners` o1 ON o1.id=v.object_id AND v.object_type IN (1,5)
  2359. LEFT JOIN `organizators` o2 ON o2.id=v.object_id AND v.object_type=4
  2360. LEFT JOIN `guidelines` o3 ON o3.id=v.object_id AND v.object_type=2
  2361. LEFT JOIN `actions` o4 ON o4.id=v.object_id AND v.object_type=3
  2362. LEFT JOIN `object_regions` obr ON obr.`object_type`=4 AND v.`object_type`=4 AND obr.`object_id`=v.`object_id` AND obr.`main_link`=1
  2363. WHERE v.`date`>='{$time1}' AND v.`date`<'{$time2}' AND v.`user_id`=0 AND (u.`email_delivery`=1 OR u.`email_delivery` IS NULL)
  2364. GROUP BY ui.`user_interesting`
  2365. ";
  2366. $this->db->query($sql);
  2367. $result=$this->db->get_result();
  2368. foreach($result as $value){
  2369. if(!strlen(trim($value['email'])))
  2370. continue;
  2371. if(!isset($adresats[$value['email']]['video'][$value['id']])){
  2372. $adresats[$value['email']]['video'][$value['id']]['id']=$value['id'];
  2373. $adresats[$value['email']]['video'][$value['id']]['video_name']=$value['video_name'];
  2374. }
  2375. $adresats[$value['email']]['video'][$value['id']]['objects'][$value["object_type"]][$value['object_id']]=array(
  2376. "alias"=>$value['object_alias'],
  2377. "name"=>$value['object_name'],
  2378. "region"=>$value['object_region'],
  2379. );
  2380. }
  2381. //Находим видео, добавленные пользователем
  2382. $sql = "
  2383. SELECT v.`id`, v.`name` as `video_name`, u2.`login` as `user_alias`, IF(u2.`private_name`=1,u2.`login`,CONCAT(u2.`name`, ' ', u2.`surname`)) as `user_name`, u.`email`,
  2384. IF(f.`user1`=v.`user_id`,f.`user2`,f.`user1`) as `friend_id`
  2385. FROM `video` v
  2386. JOIN `friends` f ON (f.`user1`=v.`user_id` OR f.`user1`=v.`user_id`) AND f.`confirmed`=1
  2387. JOIN `users` u ON u.`id`=IF(f.`user1`=v.`user_id`,f.`user2`,f.`user1`) AND u.`email_delivery`=1
  2388. JOIN `users` u2 ON u2.`id`=v.`user_id`
  2389. WHERE v.`date`>='{$time1}' AND v.`date`<'{$time2}' AND v.`user_id`!=0
  2390. ";
  2391. $this->db->query($sql);
  2392. $result=$this->db->get_result();
  2393. foreach($result as $value){
  2394. if(!strlen(trim($value['email'])))
  2395. continue;
  2396. if(!isset($adresats[$value['email']]['video2'][$value['id']])){
  2397. $adresats[$value['email']]['video2'][$value['id']]['id']=$value['id'];
  2398. $adresats[$value['email']]['video2'][$value['id']]['video_name']=$value['video_name'];
  2399. }
  2400. $adresats[$value['email']]['video2'][$value['id']]['friends'][$value["friend_id"]]=array(
  2401. "alias"=>$value['user_alias'],
  2402. "name"=>$value['user_name']
  2403. );
  2404. }
  2405. //Фотоальбомы - пока без связанных объектов
  2406. //Находим фотоальбомы, добавленные в объекте
  2407. $sql = "
  2408. SELECT p.`id`, p.`name` as `photo_name`, p.`object_id`, p.`object_type`, COALESCE(u.`email`,ui.`email`,'') as `email`,
  2409. COALESCE(o1.`name`, o2.`name`, o3.`name`, o4.`name`) as `object_name`, COALESCE(o1.`alias`, o2.`alias`, o3.`alias`, o4.`alias`) as `object_alias`,
  2410. COALESCE(obr.`region`, 0) as `object_region`
  2411. FROM `photoalbums` p
  2412. JOIN `user_interesting` ui ON ui.`object_id`=p.`object_id` AND ui.`object_type`=p.`object_type` AND ui.`practing`=0
  2413. LEFT JOIN `users` u ON u.`id`=ui.`user_id`
  2414. LEFT JOIN `treiners` o1 ON o1.id=p.object_id AND p.object_type IN (1,5)
  2415. LEFT JOIN `organizators` o2 ON o2.id=p.object_id AND p.object_type=4
  2416. LEFT JOIN `guidelines` o3 ON o3.id=p.object_id AND p.object_type=2
  2417. LEFT JOIN `actions` o4 ON o4.id=p.object_id AND p.object_type=3
  2418. LEFT JOIN `object_regions` obr ON obr.`object_type`=4 AND p.`object_type`=4 AND obr.`object_id`=p.`object_id` AND obr.`main_link`=1
  2419. WHERE p.`date`>='{$time1}' AND p.`date`<'{$time2}' AND p.`user_id`=0 AND (u.`email_delivery`=1 OR u.`email_delivery` IS NULL)
  2420. GROUP BY ui.`user_interesting`
  2421. ";
  2422. $this->db->query($sql);
  2423. $result=$this->db->get_result();
  2424. foreach($result as $value){
  2425. if(!strlen(trim($value['email'])))
  2426. continue;
  2427. if(!isset($adresats[$value['email']]['photo'][$value['id']])){
  2428. $adresats[$value['email']]['photo'][$value['id']]['id']=$value['id'];
  2429. $adresats[$value['email']]['photo'][$value['id']]['photo_name']=$value['photo_name'];
  2430. }
  2431. $adresats[$value['email']]['photo'][$value['id']]['objects'][$value["object_type"]][$value['object_id']]=array(
  2432. "alias"=>$value['object_alias'],
  2433. "name"=>$value['object_name'],
  2434. "region"=>$value['object_region'],
  2435. );
  2436. }
  2437. //Находим фотоальбомы, добавленные пользователем
  2438. $sql = "
  2439. SELECT p.`id`, p.`name` as `photo_name`, u2.`login` as `user_alias`, IF(u2.`private_name`=1,u2.`login`,CONCAT(u2.`name`, ' ', u2.`surname`)) as `user_name`, u.`email`,
  2440. IF(f.`user1`=p.`user_id`,f.`user2`,f.`user1`) as `friend_id`
  2441. FROM `photoalbums` p
  2442. JOIN `friends` f ON (f.`user1`=p.`user_id` OR f.`user1`=p.`user_id`) AND f.`confirmed`=1
  2443. JOIN `users` u ON u.`id`=IF(f.`user1`=p.`user_id`,f.`user2`,f.`user1`) AND u.`email_delivery`=1
  2444. JOIN `users` u2 ON u2.`id`=p.`user_id`
  2445. WHERE p.`date`>='{$time1}' AND p.`date`<'{$time2}' AND p.`user_id`!=0
  2446. ";
  2447. $this->db->query($sql);
  2448. $result=$this->db->get_result();
  2449. foreach($result as $value){
  2450. if(!strlen(trim($value['email'])))
  2451. continue;
  2452. if(!isset($adresats[$value['email']]['photo2'][$value['id']])){
  2453. $adresats[$value['email']]['photo2'][$value['id']]['id']=$value['id'];
  2454. $adresats[$value['email']]['photo2'][$value['id']]['photo_name']=$value['photo_name'];
  2455. }
  2456. $adresats[$value['email']]['photo2'][$value['id']]['friends'][$value["friend_id"]]=array(
  2457. "alias"=>$value['user_alias'],
  2458. "name"=>$value['user_name']
  2459. );
  2460. }
  2461. global $new_region_codes;
  2462. //формируем письмо
  2463. include_once(__ENGINE_PATH.'/functions/classes/class_mailer.php');
  2464. $mailer=new Mailer();
  2465. foreach($adresats as $email=>$events){
  2466. $subject='';
  2467. $msg='';
  2468. $adresat_email = $email;
  2469. include(__ENGINE_PATH.'/templates/email.new_user_events2.php');
  2470. if(!@$mailer->mail($email, $subject, $msg)) {
  2471. trigger_error('Не удалось отправить оповещения о мероприятии',E_USER_WARNING);
  2472. }else
  2473. $count++;
  2474. }
  2475. return "отправлено писем - {$count}";
  2476. }
  2477. /**
  2478. * send email notifiers about users events
  2479. */
  2480. public function users_events_email_notifier3($days=15){
  2481. set_time_limit(300);
  2482. global $object_types;
  2483. $time1=gmdate("Y-m-d H:00:00",gmmktime(gmdate('H'),gmdate('i'),gmdate('s'),gmdate('m'),gmdate('j')-$days,gmdate('Y')));
  2484. //$time1='2011-11-01 00:00:00';
  2485. $time2=gmdate("Y-m-d H:00:00");
  2486. //$time2='2012-11-01 00:00:00';
  2487. $count=0;
  2488. $adresats=array();
  2489. //получаем новые-платные мерпориятия за период от time1 до time2
  2490. $timetable_rubrics = array();
  2491. $timetable_regions = array();
  2492. $timetables = array();
  2493. $sql="
  2494. SELECT
  2495. t.`id` as `timetable_id`,a.`name` as `action_name`,t.`name_extension`,t.`date_text`,a.`type`,t.action_id, GROUP_CONCAT(DISTINCT opo.`region`) as `regions`,adr.`city`,
  2496. UNIX_TIMESTAMP(t.`date`) as `date`,a.`alias` as `action_alias`, t.`date` as `action_date`, GROUP_CONCAT(DISTINCT r.`rubric_id`) as `rubrics`,
  2497. UNIX_TIMESTAMP(COALESCE (h.`date`, t.`created`)) as `date_moderated`
  2498. FROM
  2499. `objects_payment_options` opo
  2500. JOIN `timetable` t ON opo.object_id = t.id AND t.`active`=1 AND t.`moderated`=1 AND t.`block`=0
  2501. JOIN `actions` a ON a.`id`=t.`action_id`
  2502. LEFT JOIN `objects_history` h ON h.`object_id`=t.`id` AND h.`object_type`=6 AND h.`action_type`=2
  2503. JOIN `rubrics` r ON r.`object_type`=3 AND r.`object_id`=a.`id`
  2504. LEFT JOIN `adresses` adr ON adr.`object_type`=6 AND adr.`object_id`=t.`id`
  2505. WHERE
  2506. opo.`object_type`=6 AND opo.po1 != 0 AND opo.is_actual = 1
  2507. AND (t.`date` >= NOW() OR a.`type` IN (2,3))
  2508. AND (
  2509. (t.`created`>='{$time1}' AND t.`created`<'{$time2}')
  2510. OR (h.`date`>='{$time1}' AND h.`date`<'{$time2}')
  2511. )
  2512. GROUP BY
  2513. t.`id`
  2514. ";
  2515. $this->db->query($sql);
  2516. $result=$this->db->get_result();
  2517. foreach($result as $value){
  2518. //складируем информацию по мероприятию
  2519. $timetables[$value["timetable_id"]] = $value;
  2520. //складируем регионы, которые фигурируют в платных опциях мероприятия
  2521. $regions = explode(",", $value["regions"]);
  2522. foreach($regions as $region)
  2523. $timetable_regions[$region][] = $value["timetable_id"];
  2524. //складируем рубрики, которые фигурируют в мероприятие
  2525. $rubrics = explode(",", $value["rubrics"]);
  2526. foreach($rubrics as $rubric_id)
  2527. $timetable_rubrics[$rubric_id][] = $value["timetable_id"];
  2528. }
  2529. //теперь у нас есть набор рубрик и регионов - найдем всех юзеров
  2530. $sql = "
  2531. SELECT
  2532. COALESCE(u.`email`, s.`email`) as `email`,IF(u.`id` IS NULL, 1, 0) as `is_guest`,COALESCE(ur.`region`, s.`region`) as `region`,GROUP_CONCAT(DISTINCT r.`rubric_id`) as `rubrics`
  2533. FROM `rubrics` r
  2534. LEFT JOIN `users` u
  2535. ON u.`id` = r.`object_id`
  2536. AND u.`email_delivery`=1
  2537. AND u.`block`=0
  2538. LEFT JOIN `users_regions` ur
  2539. ON ur.`user_id` = u.`id`
  2540. LEFT JOIN `subscribe` s
  2541. ON s.`guest_id` = r.`guest_id`
  2542. AND s.`user_id` = 0
  2543. WHERE
  2544. r.`rubric_id` IN (".join(", ", array_keys($timetable_rubrics)).")
  2545. AND r.`object_type` = 1
  2546. AND (
  2547. ur.`region` IN (".join(", ", array_keys($timetable_regions)).")
  2548. OR s.`region` IN (".join(", ", array_keys($timetable_regions)).")
  2549. )
  2550. GROUP BY
  2551. `email`, ur.`region`
  2552. ";
  2553. $this->db->query($sql);
  2554. $result=$this->db->get_result();
  2555. foreach($result as $value){
  2556. if(!strlen(trim($value['email'])))
  2557. continue;
  2558. $rubrics = explode(",", $value["rubrics"]);
  2559. foreach($rubrics as $rubric_id){
  2560. if(isset($timetable_rubrics[$rubric_id])){
  2561. foreach($timetable_rubrics[$rubric_id] as $timetable_id){
  2562. $regions = explode(",", $timetables[$timetable_id]['regions']);
  2563. if(!isset($adresats[$value['email']][6][$timetable_id]) && in_array($value["region"], $regions)){
  2564. $adresats[$value['email']][6][$timetable_id]['timetable_id']=$timetable_id;
  2565. $adresats[$value['email']][6][$timetable_id]['action_name']=$timetables[$timetable_id]['action_name'];
  2566. $adresats[$value['email']][6][$timetable_id]['action_alias']=$timetables[$timetable_id]['action_alias'];
  2567. $adresats[$value['email']][6][$timetable_id]['name_extension']=$timetables[$timetable_id]['name_extension'];
  2568. $adresats[$value['email']][6][$timetable_id]['date_text']=$timetables[$timetable_id]['date_text'];
  2569. $adresats[$value['email']][6][$timetable_id]['date']=$timetables[$timetable_id]['date'];
  2570. $adresats[$value['email']][6][$timetable_id]['date_moderated']=$timetables[$timetable_id]['date_moderated'];
  2571. $adresats[$value['email']][6][$timetable_id]['type']=$timetables[$timetable_id]['type'];
  2572. $adresats[$value['email']][6][$timetable_id]['city']=$timetables[$timetable_id]['city'];
  2573. $adresats[$value['email']][6][$timetable_id]['regions']=$timetables[$timetable_id]['regions'];
  2574. $adresats[$value['email']][6][$timetable_id]['rubrics']=$timetables[$timetable_id]['rubrics'];
  2575. $adresats[$value['email']][6][$timetable_id]['rubric']=$rubric_id;
  2576. }
  2577. }
  2578. }
  2579. }
  2580. }
  2581. //получение новостей за период от time1 до time2
  2582. $news_rubrics = array();
  2583. $news_regions = array();
  2584. $news = array();
  2585. $sql="
  2586. SELECT o.`id`,o.`name`,o.`alias`,UNIX_TIMESTAMP(o.`created`) as `date_moderated`,
  2587. GROUP_CONCAT(DISTINCT IF(obr.`region` IS NULL, 0, obr.`region`)) as `regions`,GROUP_CONCAT(DISTINCT r.`rubric_id`) as `rubrics`,
  2588. IF(opo.`option_id` IS NULL, 0, 1) as `is_payment`
  2589. FROM `news` o
  2590. LEFT JOIN `object_regions` obr ON obr.`object_id`=o.`id` AND obr.`object_type`=7
  2591. LEFT JOIN `objects_payment_options` opo ON opo.`object_id`=o.`id` AND opo.`object_type`=7 AND (opo.`po1`=1 OR opo.`po7`=1)
  2592. JOIN `rubrics` r ON r.`object_type`=7 AND r.`object_id`=o.`id`
  2593. WHERE
  2594. o.`moderated`=1
  2595. AND o.`block`=0
  2596. AND o.`visible_start_date`>='{$time1}' AND o.`visible_start_date`<'{$time2}'
  2597. GROUP BY o.`id`
  2598. UNION ALL
  2599. SELECT o.`id`,o.`name`,o.`alias`,UNIX_TIMESTAMP(COALESCE (h.`date`, o.`created`)) as `date_moderated`,
  2600. GROUP_CONCAT(DISTINCT IF(obr.`region` IS NULL, 0, obr.`region`)) as `regions`,GROUP_CONCAT(DISTINCT r.`rubric_id`) as `rubrics`,
  2601. IF(opo.`option_id` IS NULL, 0, 1) as `is_payment`
  2602. FROM `objects_history` h
  2603. LEFT JOIN `news` o ON h.`object_id`=o.`id` AND o.`moderated`=1 AND o.`block`=0
  2604. LEFT JOIN `object_regions` obr ON obr.`object_id`=o.`id` AND obr.`object_type`=7
  2605. LEFT JOIN `objects_payment_options` opo ON opo.`object_id`=o.`id` AND opo.`object_type`=7 AND (opo.`po1`=1 OR opo.`po7`=1)
  2606. JOIN `rubrics` r ON r.`object_type`=7 AND r.`object_id`=o.`id`
  2607. WHERE
  2608. h.`object_type`=7 AND h.`action_type`=2
  2609. AND h.`date`>='{$time1}' AND h.`date`<'{$time2}'
  2610. GROUP BY o.`id`
  2611. ";
  2612. $this->db->query($sql);
  2613. $result=$this->db->get_result();
  2614. foreach($result as $value){
  2615. //складируем информацию по новости
  2616. $news[$value["id"]] = $value;
  2617. //складируем регионы, которые фигурируют в новости
  2618. $regions = explode(",", $value["regions"]);
  2619. foreach($regions as $region)
  2620. $news_regions[$region][] = $value["id"];
  2621. //складируем рубрики, которые фигурируют в новости
  2622. $rubrics = explode(",", $value["rubrics"]);
  2623. foreach($rubrics as $rubric_id)
  2624. $news_rubrics[$rubric_id][] = $value["id"];
  2625. }
  2626. //получение статей за период от time1 до time2
  2627. $article_rubrics = array();
  2628. $articles = array();
  2629. $sql="
  2630. SELECT o.`id`,o.`name`,o.`alias`,GROUP_CONCAT(DISTINCT r.`rubric_id`) as `rubrics`,
  2631. IF(opo.`option_id` IS NULL, 0, 1) as `is_payment`,UNIX_TIMESTAMP(o.`created`) as `date_moderated`
  2632. FROM `articles` o
  2633. LEFT JOIN `objects_payment_options` opo ON opo.`object_id`=o.`id` AND opo.`object_type`=8 AND (opo.`po1`=1 OR opo.`po7`=1)
  2634. JOIN `rubrics` r ON r.`object_type`=8 AND r.`object_id`=o.`id`
  2635. WHERE
  2636. o.`moderated`=1
  2637. AND o.`block`=0
  2638. AND o.`created`>='{$time1}' AND o.`created`<'{$time2}'
  2639. GROUP BY o.`id`
  2640. UNION ALL
  2641. SELECT o.`id`,o.`name`,o.`alias`,GROUP_CONCAT(DISTINCT r.`rubric_id`) as `rubrics`,
  2642. IF(opo.`option_id` IS NULL, 0, 1) as `is_payment`,UNIX_TIMESTAMP(h.`date`) as `date_moderated`
  2643. FROM `objects_history` h
  2644. LEFT JOIN `articles` o ON h.`object_id`=o.`id` AND o.`moderated`=1 AND o.`block`=0
  2645. LEFT JOIN `objects_payment_options` opo ON opo.`object_id`=o.`id` AND opo.`object_type`=8 AND (opo.`po1`=1 OR opo.`po7`=1)
  2646. JOIN `rubrics` r ON r.`object_type`=8 AND r.`object_id`=o.`id`
  2647. WHERE
  2648. h.`object_type`=8 AND h.`action_type`=2
  2649. AND h.`date`>='{$time1}' AND h.`date`<'{$time2}'
  2650. GROUP BY o.`id`
  2651. ";
  2652. $this->db->query($sql);
  2653. $result=$this->db->get_result();
  2654. foreach($result as $value){
  2655. //складируем информацию по статье
  2656. $articles[$value["id"]] = $value;
  2657. //складируем рубрики, которые фигурируют в статье
  2658. $rubrics = explode(",", $value["rubrics"]);
  2659. foreach($rubrics as $rubric_id)
  2660. $article_rubrics[$rubric_id][] = $value["id"];
  2661. }
  2662. //получение ссылок за период от time1 до time2
  2663. $link_rubrics = array();
  2664. $links = array();
  2665. $sql="
  2666. SELECT o.`id`,o.`name`,o.`alias`,o.`url`,GROUP_CONCAT(DISTINCT r.`rubric_id`) as `rubrics`,
  2667. UNIX_TIMESTAMP(COALESCE (h.`date`, o.`created`)) as `date_moderated`
  2668. FROM `links` o
  2669. LEFT JOIN `objects_history` h ON h.`object_id`=o.`id` AND h.`object_type`=12 AND h.`action_type`=2
  2670. JOIN `rubrics` r ON r.`object_type`=12 AND r.`object_id`=o.`id`
  2671. WHERE
  2672. o.`moderated`=1
  2673. AND o.`block`=0
  2674. AND o.`noindex`=0
  2675. AND (
  2676. (o.`created`>='{$time1}' AND o.`created`<'{$time2}')
  2677. OR (h.`date`>='{$time1}' AND h.`date`<'{$time2}')
  2678. )
  2679. GROUP BY o.`id`
  2680. ";
  2681. $this->db->query($sql);
  2682. $result=$this->db->get_result();
  2683. foreach($result as $value){
  2684. //складируем информацию по ссылке
  2685. $links[$value["id"]] = $value;
  2686. //складируем рубрики, которые фигурируют в ссылке
  2687. $rubrics = explode(",", $value["rubrics"]);
  2688. foreach($rubrics as $rubric_id)
  2689. $link_rubrics[$rubric_id][] = $value["id"];
  2690. }
  2691. //теперь у нас есть набор рубрик и регионов - найдем всех юзеров
  2692. $all_rubrics = array_unique(array_merge(array_keys($article_rubrics), array_keys($news_rubrics), array_keys($link_rubrics)));
  2693. $sql = "
  2694. SELECT
  2695. COALESCE(u.`email`, s.`email`) as `email`,IF(u.`id` IS NULL, 1, 0) as `is_guest`,COALESCE(ur.`region`, s.`region`) as `region`,GROUP_CONCAT(DISTINCT r.`rubric_id`) as `rubrics`
  2696. FROM `rubrics` r
  2697. LEFT JOIN `users` u
  2698. ON u.`id` = r.`object_id`
  2699. AND u.`email_delivery`=1
  2700. AND u.`block`=0
  2701. LEFT JOIN `users_regions` ur
  2702. ON ur.`user_id` = u.`id`
  2703. LEFT JOIN `subscribe` s
  2704. ON s.`guest_id` = r.`guest_id`
  2705. AND s.`user_id` = 0
  2706. WHERE
  2707. r.`rubric_id` IN (".join(", ", $all_rubrics).")
  2708. AND r.`object_type` = 1
  2709. GROUP BY
  2710. `email`, ur.`region`
  2711. ";
  2712. $this->db->query($sql);
  2713. $result=$this->db->get_result();
  2714. foreach($result as $value){
  2715. if(!strlen(trim($value['email'])))
  2716. continue;
  2717. $rubrics = explode(",", $value["rubrics"]);
  2718. foreach($rubrics as $rubric_id){
  2719. if(isset($link_rubrics[$rubric_id])){
  2720. foreach($link_rubrics[$rubric_id] as $link_id){
  2721. if(!isset($adresats[$value['email']][12][$link_id])){
  2722. $adresats[$value['email']][12][$link_id]['id']=$link_id;
  2723. $adresats[$value['email']][12][$link_id]['name']=$links[$link_id]['name'];
  2724. $adresats[$value['email']][12][$link_id]['alias']=$links[$link_id]['alias'];
  2725. $adresats[$value['email']][12][$link_id]['url']=$links[$link_id]['url'];
  2726. $adresats[$value['email']][12][$link_id]['date_moderated']=$links[$link_id]['date_moderated'];
  2727. $adresats[$value['email']][12][$link_id]['rubrics']=$links[$link_id]['rubrics'];
  2728. $adresats[$value['email']][12][$link_id]['rubric']=$rubric_id;
  2729. }
  2730. }
  2731. }
  2732. if(isset($article_rubrics[$rubric_id])){
  2733. foreach($article_rubrics[$rubric_id] as $article_id){
  2734. if(!isset($adresats[$value['email']][8][$article_id])){
  2735. $adresats[$value['email']][8][$article_id]['id']=$article_id;
  2736. $adresats[$value['email']][8][$article_id]['name']=$articles[$article_id]['name'];
  2737. $adresats[$value['email']][8][$article_id]['alias']=$articles[$article_id]['alias'];
  2738. $adresats[$value['email']][8][$article_id]['is_payment']=$articles[$article_id]['is_payment'];
  2739. $adresats[$value['email']][8][$article_id]['date_moderated']=$articles[$article_id]['date_moderated'];
  2740. $adresats[$value['email']][8][$article_id]['rubrics']=$articles[$article_id]['rubrics'];
  2741. $adresats[$value['email']][8][$article_id]['rubric']=$rubric_id;
  2742. }
  2743. }
  2744. }
  2745. if(isset($news_rubrics[$rubric_id])){
  2746. foreach($news_rubrics[$rubric_id] as $news_id){
  2747. $regions = explode(",", $news[$news_id]['regions']);
  2748. if(!isset($adresats[$value['email']][7][$news_id]) && (in_array($value["region"], $regions) || $news[$news_id]['regions'] == 0)){
  2749. $adresats[$value['email']][7][$news_id]['id']=$news_id;
  2750. $adresats[$value['email']][7][$news_id]['name']=$news[$news_id]['name'];
  2751. $adresats[$value['email']][7][$news_id]['alias']=$news[$news_id]['alias'];
  2752. $adresats[$value['email']][7][$news_id]['is_payment']=$news[$news_id]['is_payment'];
  2753. $adresats[$value['email']][7][$news_id]['date_moderated']=$news[$news_id]['date_moderated'];
  2754. $adresats[$value['email']][7][$news_id]['regions']=$news[$news_id]['regions'];
  2755. $adresats[$value['email']][7][$news_id]['region']=$value["region"];
  2756. $adresats[$value['email']][7][$news_id]['rubrics']=$news[$news_id]['rubrics'];
  2757. $adresats[$value['email']][7][$news_id]['rubric']=$rubric_id;
  2758. }
  2759. }
  2760. }
  2761. }
  2762. }
  2763. //получение тренеров/консультантов за период от time1 до time2
  2764. $treiners = array();
  2765. $treiner_regions = array();
  2766. $sql="
  2767. SELECT o.`id`,o.`name`,o.`alias`,UNIX_TIMESTAMP(o.`created`) as `date_moderated`,
  2768. o.`is_treiner`,o.`is_consultant`,GROUP_CONCAT(DISTINCT obr.`region`) as `regions`
  2769. FROM `treiners` o
  2770. LEFT JOIN `object_regions` obr ON obr.`object_id`=o.`id` AND obr.`object_type` IN (1,5)
  2771. WHERE
  2772. o.`moderated`=1
  2773. AND o.`block`=0
  2774. AND o.`created`>='{$time1}' AND o.`created`<'{$time2}'
  2775. GROUP BY o.`id`
  2776. UNION ALL
  2777. SELECT o.`id`,o.`name`,o.`alias`,UNIX_TIMESTAMP(h.`date`) as `date_moderated`,
  2778. o.`is_treiner`,o.`is_consultant`,GROUP_CONCAT(DISTINCT obr.`region`) as `regions`
  2779. FROM `objects_history` h
  2780. LEFT JOIN `treiners` o ON h.`object_id`=o.`id` AND o.`moderated`=1 AND o.`block`=0
  2781. LEFT JOIN `object_regions` obr ON obr.`object_id`=o.`id` AND obr.`object_type` IN (1,5)
  2782. WHERE
  2783. h.`object_type` IN (1,5)
  2784. AND h.`action_type`=2
  2785. AND h.`date`>='{$time1}' AND h.`date`<'{$time2}'
  2786. GROUP BY o.`id`
  2787. ";
  2788. $this->db->query($sql);
  2789. $result=$this->db->get_result();
  2790. foreach($result as $value){
  2791. //складируем информацию по тренерам
  2792. $treiners[$value["id"]] = $value;
  2793. //складируем регионы, которые фигурируют в тренерах
  2794. $regions = explode(",", $value["regions"]);
  2795. foreach($regions as $region)
  2796. $treiner_regions[$region][] = $value["id"];
  2797. }
  2798. //получение организаторов за период от time1 до time2
  2799. $organizators = array();
  2800. $organizator_regions = array();
  2801. $sql="
  2802. SELECT o.`id`,o.`fullname` as `name`,o.`alias`,UNIX_TIMESTAMP(o.`created`) as `date_moderated`,GROUP_CONCAT(DISTINCT obr.`region`) as `regions`
  2803. FROM `organizators` o
  2804. LEFT JOIN `object_regions` obr ON obr.`object_id`=o.`id` AND obr.`object_type`=4
  2805. WHERE
  2806. o.`moderated`=1
  2807. AND o.`block`=0
  2808. AND o.`created`>='{$time1}' AND o.`created`<'{$time2}'
  2809. GROUP BY o.`id`
  2810. UNION ALL
  2811. SELECT o.`id`,o.`fullname` as `name`,o.`alias`,UNIX_TIMESTAMP(h.`date`) as `date_moderated`,GROUP_CONCAT(DISTINCT obr.`region`) as `regions`
  2812. FROM `objects_history` h
  2813. LEFT JOIN `organizators` o ON h.`object_id`=o.`id` AND o.`moderated`=1 AND o.`block`=0
  2814. LEFT JOIN `object_regions` obr ON obr.`object_id`=o.`id` AND obr.`object_type`=4
  2815. WHERE
  2816. h.`object_type`=4
  2817. AND h.`action_type`=2
  2818. AND h.`date`>='{$time1}' AND h.`date`<'{$time2}'
  2819. GROUP BY o.`id`
  2820. ";
  2821. $this->db->query($sql);
  2822. $result=$this->db->get_result();
  2823. foreach($result as $value){
  2824. //складируем информацию по организатору
  2825. $organizators[$value["id"]] = $value;
  2826. //складируем регионы, которые фигурируют в организаторах
  2827. $regions = explode(",", $value["regions"]);
  2828. foreach($regions as $region)
  2829. $organizator_regions[$region][] = $value["id"];
  2830. }
  2831. //получение кафе/магазинов за период от time1 до time2
  2832. $esoterics = array();
  2833. $esoteric_regions = array();
  2834. $sql="
  2835. SELECT o.`id`,o.`name` as `name`,o.`alias`,UNIX_TIMESTAMP(o.`created`) as `date_moderated`,
  2836. GROUP_CONCAT(DISTINCT obr.`region`) as `regions`,o.`type`
  2837. FROM `esoterics` o
  2838. LEFT JOIN `object_regions` obr ON obr.`object_id`=o.`id` AND obr.`object_type`=9
  2839. WHERE
  2840. o.`moderated`=1
  2841. AND o.`block`=0
  2842. AND o.`created`>='{$time1}' AND o.`created`<'{$time2}'
  2843. GROUP BY o.`id`
  2844. UNION ALL
  2845. SELECT o.`id`,o.`name` as `name`,o.`alias`,UNIX_TIMESTAMP(h.`date`) as `date_moderated`,
  2846. GROUP_CONCAT(DISTINCT obr.`region`) as `regions`,o.`type`
  2847. FROM `objects_history` h
  2848. LEFT JOIN `esoterics` o ON h.`object_id`=o.`id` AND o.`moderated`=1 AND o.`block`=0
  2849. LEFT JOIN `object_regions` obr ON obr.`object_id`=o.`id` AND obr.`object_type`=9
  2850. WHERE
  2851. h.`object_type`=9
  2852. AND h.`action_type`=2
  2853. AND h.`date`>='{$time1}' AND h.`date`<'{$time2}'
  2854. GROUP BY o.`id`
  2855. ";
  2856. $this->db->query($sql);
  2857. $result=$this->db->get_result();
  2858. foreach($result as $value){
  2859. //складируем информацию по кафе/магазину
  2860. $esoterics[$value["id"]] = $value;
  2861. //складируем регионы, которые фигурируют в кафе/магазинах
  2862. $regions = explode(",", $value["regions"]);
  2863. foreach($regions as $region)
  2864. $esoteric_regions[$region][] = $value["id"];
  2865. }
  2866. //теперь у нас есть набор рубрик и регионов - найдем всех юзеров
  2867. $all_regions = array_unique(array_merge(array_keys($organizator_regions), array_keys($treiner_regions), array_keys($esoteric_regions)));
  2868. $sql = "
  2869. SELECT
  2870. u.`email`,IF(u.`id` IS NULL, 1, 0) as `is_guest`,ur.`region`
  2871. FROM `users_regions` ur
  2872. LEFT JOIN `users` u
  2873. ON u.`id` = ur.`user_id`
  2874. AND u.`email_delivery`=1
  2875. AND u.`block`=0
  2876. WHERE
  2877. ur.`region` IN (".join(", ", $all_regions).")
  2878. GROUP BY
  2879. `email`, ur.`region`
  2880. ";
  2881. $this->db->query($sql);
  2882. $result=$this->db->get_result();
  2883. foreach($result as $value){
  2884. if(!strlen(trim($value['email'])))
  2885. continue;
  2886. $region = $value["region"];
  2887. if(isset($treiner_regions[$region])){
  2888. foreach($treiner_regions[$region] as $treiner_id){
  2889. $regions = explode(",", $treiners[$treiner_id]['regions']);
  2890. if(!isset($adresats[$value['email']][1][$treiner_id]) && in_array($region, $regions)){
  2891. $adresats[$value['email']][1][$treiner_id]['id']=$treiner_id;
  2892. $adresats[$value['email']][1][$treiner_id]['name']=$treiners[$treiner_id]['name'];
  2893. $adresats[$value['email']][1][$treiner_id]['alias']=$treiners[$treiner_id]['alias'];
  2894. $adresats[$value['email']][1][$treiner_id]['is_treiner']=$treiners[$treiner_id]['is_treiner'];
  2895. $adresats[$value['email']][1][$treiner_id]['is_consultant']=$treiners[$treiner_id]['is_consultant'];
  2896. $adresats[$value['email']][1][$treiner_id]['date_moderated']=$treiners[$treiner_id]['date_moderated'];
  2897. $adresats[$value['email']][1][$treiner_id]['regions']=$treiners[$treiner_id]['regions'];
  2898. }
  2899. }
  2900. }
  2901. if(isset($organizator_regions[$region])){
  2902. foreach($organizator_regions[$region] as $org_id){
  2903. $regions = explode(",", $organizators[$org_id]['regions']);
  2904. if(!isset($adresats[$value['email']][4][$org_id]) && in_array($region, $regions)){
  2905. $adresats[$value['email']][4][$org_id]['id']=$org_id;
  2906. $adresats[$value['email']][4][$org_id]['name']=$organizators[$org_id]['name'];
  2907. $adresats[$value['email']][4][$org_id]['alias']=$organizators[$org_id]['alias'];
  2908. $adresats[$value['email']][4][$org_id]['date_moderated']=$organizators[$org_id]['date_moderated'];
  2909. $adresats[$value['email']][4][$org_id]['regions']=$organizators[$org_id]['regions'];
  2910. }
  2911. }
  2912. }
  2913. if(isset($esoteric_regions[$region])){
  2914. foreach($esoteric_regions[$region] as $eso_id){
  2915. $regions = explode(",", $esoterics[$eso_id]['regions']);
  2916. if(!isset($adresats[$value['email']][9][$eso_id]) && in_array($region, $regions)){
  2917. $adresats[$value['email']][9][$eso_id]['id']=$eso_id;
  2918. $adresats[$value['email']][9][$eso_id]['name']=$esoterics[$eso_id]['name'];
  2919. $adresats[$value['email']][9][$eso_id]['alias']=$esoterics[$eso_id]['alias'];
  2920. $adresats[$value['email']][9][$eso_id]['type']=$esoterics[$eso_id]['type'];
  2921. $adresats[$value['email']][9][$eso_id]['date_moderated']=$esoterics[$eso_id]['date_moderated'];
  2922. $adresats[$value['email']][9][$eso_id]['regions']=$esoterics[$eso_id]['regions'];
  2923. }
  2924. }
  2925. }
  2926. }
  2927. echo count($adresats);
  2928. $adresats2 = $adresats["dmitriy141@gmail.com"];
  2929. unset($adresats);
  2930. $adresats["dmitriy141@gmail.com"] = $adresats2;
  2931. //подключаем рубрики
  2932. include_once (__ENGINE_PATH.'/functions/subfunctions/common.rubric_arrays.php');
  2933. global $rubrics;
  2934. global $new_region_codes;
  2935. //формируем письмо
  2936. include_once(__ENGINE_PATH.'/functions/classes/class_mailer.php');
  2937. $mailer=new Mailer();
  2938. foreach($adresats as $email=>$events){
  2939. $subject='';
  2940. $msg='';
  2941. $adresat_email = $email;
  2942. include(__ENGINE_PATH.'/templates/email.new_user_events3.php');
  2943. if(!@$mailer->mail($email, $subject,$msg)) {
  2944. trigger_error('Не удалось отправить оповещения о мероприятии',E_USER_WARNING);
  2945. }else
  2946. $count++;
  2947. }
  2948. echo "Отправлено писем: {$count}</br>\n";
  2949. }
  2950. /**
  2951. * Напоминаем пользователю о мероприятии за 7 дней и 2 дня (если он интересуется именно этим мероприятием или подал заявку на него)
  2952. */
  2953. public function timetable_interesting_order_remind(){
  2954. $time1=gmdate("Y-m-d",gmmktime(gmdate('H'),gmdate('i'),gmdate('s'),gmdate('m'),gmdate('j')+7,gmdate('Y')));
  2955. $time2=gmdate("Y-m-d",gmmktime(gmdate('H'),gmdate('i'),gmdate('s'),gmdate('m'),gmdate('j')+2,gmdate('Y')));
  2956. set_time_limit(300);
  2957. include_once(__ENGINE_PATH.'/functions/subfunctions/common.timezones.php');
  2958. global $timezones;
  2959. global $object_types;
  2960. $adresats = array();
  2961. //получаем все мероприятия, которые проходят через 7 дней или 2 дня
  2962. $sql = "
  2963. SELECT
  2964. t.`id` as `timetable_id`, t.`date`, t.`time`,
  2965. a.`id` as `action_id`, a.`alias` as `action_alias`, a.`type` as `action_type`,
  2966. CONCAT(a.name, ' ', t.name_extension) as `timetable_header`,
  2967. obr.`region` as `timetable_region`,
  2968. IF(u.`id` IS NULL, tor.`email`, u.`email`) as `email`,
  2969. 7 as `day`, 'tor' as `send_type`
  2970. FROM
  2971. `timetable` as t
  2972. JOIN `actions` as a
  2973. ON t.`action_id` = a.`id`
  2974. LEFT JOIN `object_regions` as obr
  2975. ON obr.`object_id` = t.`id`
  2976. AND obr.`object_type` = 6
  2977. AND obr.`main_link` = 1
  2978. JOIN `timetable_orders` as tor
  2979. ON tor.`timetable_id`=t.`id`
  2980. AND tor.`type` IN (1,2,11,12)
  2981. LEFT JOIN `users` as u
  2982. ON tor.`user_id`=u.`id`
  2983. WHERE
  2984. t.`date` >= '{$time1} 00:00:00' AND t.`date` <= '{$time1} 23:59:00'
  2985. AND a.`type` IN (1,4,5)
  2986. AND t.`block` = 0
  2987. AND t.`moderated` = 1
  2988. AND t.`active` = 1
  2989. GROUP BY
  2990. t.`id`,`email`
  2991. UNION
  2992. SELECT
  2993. t.`id` as `timetable_id`, t.`date`, t.`time`,
  2994. a.`id` as `action_id`, a.`alias` as `action_alias`, a.`type` as `action_type`,
  2995. CONCAT(a.name, ' ', t.name_extension) as `timetable_header`,
  2996. obr.`region` as `timetable_region`,
  2997. IF(u.`id` IS NULL, ui.`email`, u.`email`) as `email`,
  2998. 7 as `day`, 'ui' as `send_type`
  2999. FROM
  3000. `timetable` as t
  3001. JOIN `actions` as a
  3002. ON t.`action_id` = a.`id`
  3003. LEFT JOIN `object_regions` as obr
  3004. ON obr.`object_id` = t.`id`
  3005. AND obr.`object_type` = 6
  3006. AND obr.`main_link` = 1
  3007. JOIN `user_interesting` as ui
  3008. ON ui.`object_id`=a.`id`
  3009. AND ui.`object_type`=3
  3010. AND ui.`practing`=0
  3011. LEFT JOIN `users` as u
  3012. ON ui.`user_id`=u.`id`
  3013. WHERE
  3014. t.`date` >= '{$time1} 00:00:00' AND t.`date` <= '{$time1} 23:59:00'
  3015. AND a.`type` IN (1,4,5)
  3016. AND t.`block` = 0
  3017. AND t.`moderated` = 1
  3018. AND t.`active` = 1
  3019. GROUP BY
  3020. t.`id`,`email`
  3021. UNION
  3022. SELECT
  3023. t.`id` as `timetable_id`, t.`date`, t.`time`,
  3024. a.`id` as `action_id`, a.`alias` as `action_alias`, a.`type` as `action_type`,
  3025. CONCAT(a.name, ' ', t.name_extension) as `timetable_header`,
  3026. obr.`region` as `timetable_region`,
  3027. IF(u.`id` IS NULL, tor.`email`, u.`email`) as `email`,
  3028. 2 as `day`, 'tor' as `send_type`
  3029. FROM
  3030. `timetable` as t
  3031. JOIN `actions` as a
  3032. ON t.`action_id` = a.`id`
  3033. LEFT JOIN `object_regions` as obr
  3034. ON obr.`object_id` = t.`id`
  3035. AND obr.`object_type` = 6
  3036. AND obr.`main_link` = 1
  3037. JOIN `timetable_orders` as tor
  3038. ON tor.`timetable_id`=t.`id`
  3039. AND tor.`type` IN (1,2,11,12)
  3040. LEFT JOIN `users` as u
  3041. ON tor.`user_id`=u.`id`
  3042. WHERE
  3043. t.`date` >= '{$time2} 00:00:00' AND t.`date` <= '{$time2} 23:59:00'
  3044. AND a.`type` IN (1,4,5)
  3045. AND t.`block` = 0
  3046. AND t.`moderated` = 1
  3047. AND t.`active` = 1
  3048. GROUP BY
  3049. t.`id`,`email`
  3050. UNION
  3051. SELECT
  3052. t.`id` as `timetable_id`, t.`date`, t.`time`,
  3053. a.`id` as `action_id`, a.`alias` as `action_alias`, a.`type` as `action_type`,
  3054. CONCAT(a.name, ' ', t.name_extension) as `timetable_header`,
  3055. obr.`region` as `timetable_region`,
  3056. IF(u.`id` IS NULL, ui.`email`, u.`email`) as `email`,
  3057. 2 as `day`, 'ui' as `send_type`
  3058. FROM
  3059. `timetable` as t
  3060. JOIN `actions` as a
  3061. ON t.`action_id` = a.`id`
  3062. LEFT JOIN `object_regions` as obr
  3063. ON obr.`object_id` = t.`id`
  3064. AND obr.`object_type` = 6
  3065. AND obr.`main_link` = 1
  3066. JOIN `user_interesting` as ui
  3067. ON ui.`object_id`=a.`id`
  3068. AND ui.`object_type`=3
  3069. AND ui.`practing`=0
  3070. LEFT JOIN `users` as u
  3071. ON ui.`user_id`=u.`id`
  3072. WHERE
  3073. t.`date` >= '{$time2} 00:00:00' AND t.`date` <= '{$time2} 23:59:00'
  3074. AND a.`type` IN (1,4,5)
  3075. AND t.`block` = 0
  3076. AND t.`moderated` = 1
  3077. AND t.`active` = 1
  3078. GROUP BY
  3079. t.`id`,`email`
  3080. ";
  3081. $this->db->query($sql);
  3082. $result = $this->db->get_result();
  3083. if(count($result)){
  3084. foreach($result as $value){
  3085. if(!strlen(trim($value["email"])) || !$value["timetable_id"])
  3086. continue;
  3087. $adresats[$value["email"]][$value["timetable_id"]] = array(
  3088. "id"=>$value["timetable_id"],
  3089. "date"=>smarty_modifier_special_date_format(strtotime($value["date"]),false,true),
  3090. "time"=>$value["time"],
  3091. "alias"=>$value["action_alias"],
  3092. "header"=>$value["timetable_header"],
  3093. "region"=>$value["timetable_region"],
  3094. "send_type"=>$value["send_type"],
  3095. "day"=>$value["day"]
  3096. );
  3097. }
  3098. }
  3099. $count = 0;
  3100. //формируем письмо
  3101. if(!empty($adresats)){
  3102. include_once(__ENGINE_PATH.'/functions/classes/class_mailer.php');
  3103. $mailer=new Mailer();
  3104. foreach($adresats as $email=>$timetables){
  3105. $subject = '';
  3106. $msg = '';
  3107. include(__ENGINE_PATH.'/templates/email.timetable_interesting_order_remind.php');
  3108. if(!@$mailer->mail($email, $subject, $msg)) {
  3109. trigger_error('Не удалось отправить оповещения о мероприятии', E_USER_WARNING);
  3110. }
  3111. else
  3112. $count++;
  3113. }
  3114. }
  3115. return "отправлено писем - {$count}";
  3116. }
  3117. /**
  3118. * Очистка RSS-лент
  3119. */
  3120. public function delete_rss(){
  3121. foreach(glob(__APP_PATH.'/rss/*.xml') as $file)
  3122. {
  3123. file_remove($file);
  3124. }
  3125. }
  3126. /**
  3127. * Автоматическое удаление объект
  3128. */
  3129. public function delete_objects($days, $limit)
  3130. {
  3131. $count = 0;
  3132. $date = gmdate("Y-m-d", gmmktime(0,0,0,gmdate('m'),gmdate('j')-$days,gmdate('Y')));
  3133. $date2 = gmdate("Y-m-d", gmmktime(0,0,0,gmdate('m'),gmdate('j')-($days*2),gmdate('Y')));
  3134. $sql = 'SELECT o.`user_id`, o.`object_type`, o.`object_id`
  3135. FROM `objects_remove_mark` o
  3136. WHERE o.`object_type`!=2 AND ((o.`remove_mark`=2 AND o.`date`<"'.$date.'") OR (o.`remove_mark`=1 AND o.`date`<"'.$date2.'"))
  3137. ORDER BY o.`date`
  3138. ';
  3139. if($limit > 0) $sql .= 'LIMIT '.$limit;
  3140. $this->db->query($sql);
  3141. $result = $this->db->get_result();
  3142. if(count($result)) {
  3143. global $object_types;
  3144. foreach($result as $value) {
  3145. if(!isset($object_types[$value['object_type']])) continue;
  3146. if($value['object_type'] == 3) $value['object_type'] = 6;
  3147. $class = $object_types[$value['object_type']]['class'];
  3148. include_once(__ENGINE_PATH.'/functions/classes/class_'.$class.'.php');
  3149. $class = ucwords($class);
  3150. $object = new $class ($value['object_type']);
  3151. if($value['object_type'] == 4) {
  3152. if(!isset($users)){
  3153. include_once(__ENGINE_PATH.'/functions/classes/class_session.php');
  3154. $session = new Session();
  3155. include_once(__ENGINE_PATH.'/functions/classes/class_validate.php');
  3156. $validator = new Validate();
  3157. include_once(__ENGINE_PATH.'/functions/classes/class_user.php');
  3158. $users = new Users($this->db, $session, $validator, $object_types);
  3159. }
  3160. $organizator = $object->get_object(" o.`id`={$value['object_id']}", array('name'));
  3161. $users->update_users("`organizator_id`={$value['object_id']}", array('organizator_id'=>0, 'organizator'=>$organizator['name']));
  3162. }
  3163. if($object->remove($value['object_id'], $value['user_id']))
  3164. $count++;
  3165. }
  3166. }
  3167. return "удалено объектов - {$count}";
  3168. }
  3169. function check_similar_treiners(){
  3170. $sql=" SELECT t.`id`,t.`nam1`,t.`fam1`,t.`otch1`,f.`filial`,o.`region`,t.`alias`,'****' as `_SEP_`,t2.`id` as `id2`, t2.`nam1` as `nam2`,t2.`fam1` as `fam2` ,t2.`otch1` as `otch2`,f2.`filial` as `filial2`,o2.`region` as `region2`,t2.`alias` as `alias2`
  3171. FROM `treiners` t
  3172. inner JOIN `treiners` t2 ON t2.`nam1` LIKE t.`nam1` AND t2.`fam1` LIKE t.`fam1` AND t.`id`!=t2.`id` AND t.`otch1` = t2.`otch1`
  3173. INNER JOIN `filial_objects` f ON f.`object_type` IN(1,5) AND f.`object_id` = t.`id`
  3174. INNER JOIN `filial_objects` f2 ON f2.`object_type` IN(1,5) AND f2.`object_id` = t2.`id`
  3175. INNER JOIN `object_regions` o ON o.`object_type` IN(1,5) AND o.`object_id` = t.`id` AND o.`main_link`=1
  3176. INNER JOIN `object_regions` o2 ON o2.`object_type` IN(1,5) AND o2.`object_id` = t2.`id` AND o.`main_link`=1
  3177. ORDER BY t.`fam1` ASC";
  3178. $this->db->query($sql);
  3179. $result = $this->db->get_result();
  3180. $data = array();
  3181. global $object_types;
  3182. global $new_region_codes;
  3183. $i = 1;
  3184. foreach($result as $item){
  3185. $data[$item['nam1'].$item['fam1'].$item['otch1'].'_'.($item['region']*$item['region2'])]=$item;
  3186. }
  3187. foreach($data as $item){
  3188. $item['region']=$new_region_codes[$item['region']]['city'];
  3189. $item['filial']=$new_region_codes[$item['filial']]['city'];
  3190. $item['region2']=$new_region_codes[$item['region2']]['city'];
  3191. $item['filial2']=$new_region_codes[$item['filial2']]['city'];
  3192. $item['link']=$object_types[1]['url'].'/'.$item['alias'];
  3193. $item['link2']=$object_types[1]['url'].'/'.$item['alias2'];
  3194. echo $i++."\t<a href='http://".__SITE_URL."/".$item['link']."/'>".$item['fam1'].' '.$item['nam1'].' '.$item['otch1'].' * '.$item['region']."</a> &&& <a href='http://".__SITE_URL."/".$item['link2']."/'>".$item['fam2'].' '.$item['nam2'].' '.$item['otch2'].' * '.$item['region2']."</a><br/>";
  3195. }
  3196. }
  3197. /* напоминает руководителям филиалов
  3198. * о том что есть клиенты,
  3199. * которые хотят платно разместиться */
  3200. public function payment_reminder()
  3201. {
  3202. $count = 0;
  3203. $sql="
  3204. SELECT t.`id`, a.`name`, a.`alias`, f.`filial`
  3205. FROM `timetable` t
  3206. JOIN `actions` a ON a.`id`=t.`action_id`
  3207. JOIN `filial_objects` f ON f.`object_type`=3 AND f.`object_id`=a.`id`
  3208. LEFT JOIN `objects_remove_mark` orm ON orm.`object_type`=6 AND orm.`object_id`=t.`id`
  3209. WHERE t.`need_payment_options` != 0 AND t.`created`<(NOW() - INTERVAL 3 DAY) AND orm.`remove_mark` IS NULL
  3210. GROUP BY t.`id`";
  3211. global $filial_region_info;
  3212. global $object_types;
  3213. if ($this->db->query($sql)) {
  3214. $actions = $this->db->get_result();
  3215. $data = array();
  3216. if (count($actions)) {
  3217. foreach ($actions as $item) {
  3218. $data[$item['filial']][] = $item;
  3219. }
  3220. }
  3221. //отправляем уведомление
  3222. if (count($data)) {
  3223. include_once(__ENGINE_PATH.'/functions/classes/class_mailer.php');
  3224. $mailer = new Mailer();
  3225. foreach ($data as $filial => $item) {
  3226. $count = count($item);
  3227. $email = isset($filial_region_info[$filial]['email']) ? (strlen($filial_region_info[$filial]['email']) ? ($filial != 54 ? $filial_region_info[$filial]['email'] : __PORTAL_EMAIL_2) : __PORTAL_EMAIL_2) : __PORTAL_EMAIL_2;
  3228. if (strlen($email)) {
  3229. $subject = '';
  3230. $msg = '';
  3231. include(__ENGINE_PATH.'/templates/email.admin_payment_reminder.php');
  3232. if (!@$mailer->mail($email, $subject, $msg)) {
  3233. trigger_error('Не удалось отправить информацию об объектах желающих платное размещение', E_USER_WARNING);
  3234. }
  3235. else
  3236. $count++;
  3237. }
  3238. }
  3239. }
  3240. }
  3241. return "отправлено напоминаний - {$count}";
  3242. }
  3243. //1160 больше не нужно, написано было по ошибке
  3244. /*function remind_users_ordered_action_by_email(){
  3245. //для оптимизации запроса
  3246. $date1=date("Y-m-d",gmmktime(gmdate('H'),gmdate('i'),gmdate('s'),gmdate('m'),gmdate('d')+4,gmdate('Y')));
  3247. $date2=date("Y-m-d",gmmktime(gmdate('H'),gmdate('i'),gmdate('s'),gmdate('m'),gmdate('d')+5,gmdate('Y')));
  3248. $sql=" SELECT a.`name`,
  3249. t.`name_extension`,
  3250. a.`alias`,
  3251. UNIX_TIMESTAMP(t.`date`) as `date`,
  3252. t.`time`,
  3253. t.`id` as `timetable_id`,
  3254. u.`id` as `user_id`,
  3255. o.`name` as `user_name`,
  3256. u.`surname`,
  3257. o.`email`
  3258. FROM `timetable` t
  3259. INNER JOIN `timetable_orders` o ON o.`timetable_id`=t.`id` AND o.`type` IN(1,2,11,12)
  3260. INNER JOIN `actions` a ON a.`id`=t.`action_id`
  3261. LEFT JOIN `users` u ON u.`id`=o.`user_id`
  3262. WHERE t.`date`>='".$date1."' AND t.`date`<'".$date2."' AND t.`moderated`=1 AND t.`block`=0
  3263. GROUP BY `email`
  3264. HAVING `email`!=''";
  3265. $this->db->query($sql);
  3266. $data = $this->db->get_result();
  3267. $count=0;
  3268. if(count($data)){
  3269. include_once(__ENGINE_PATH.'/functions/classes/class_mailer.php');
  3270. $mailer=new Mailer();
  3271. global $object_types;
  3272. foreach($data as $item){
  3273. $subject='';
  3274. $msg='';
  3275. include(__ENGINE_PATH.'/templates/email.user_action_reminder.php');
  3276. if(@$mailer->mail($item['email'], $subject,$msg))
  3277. $count++;
  3278. //echo $msg;
  3279. }
  3280. echo "Отправлено E-mail-напоминаний о предстоящем мероприятии: ".$count.'<br/>';
  3281. }
  3282. return $count;
  3283. }*/
  3284. //1160
  3285. function remind_users_ordered_action_by_sms(){
  3286. //для оптимизации запроса
  3287. $date1=date("Y-m-d",gmmktime(gmdate('H'),gmdate('i'),gmdate('s'),gmdate('m'),gmdate('d')+1,gmdate('Y')));
  3288. $date2=date("Y-m-d",gmmktime(gmdate('H'),gmdate('i'),gmdate('s'),gmdate('m'),gmdate('d')+2,gmdate('Y')));
  3289. $sql=" SELECT a.`name`,
  3290. t.`name_extension`,
  3291. a.`alias`,
  3292. UNIX_TIMESTAMP(t.`date`) as `date`,
  3293. o.`name` as `user_name`,
  3294. o.`phone`,
  3295. COALESCE(u.`timezone`,-1) as `timezone`
  3296. FROM `timetable` t
  3297. INNER JOIN `timetable_orders` o ON o.`timetable_id`=t.`id` AND o.`type` IN(1,2,11,12)
  3298. INNER JOIN `actions` a ON a.`id`=t.`action_id`
  3299. LEFT JOIN `users` u ON u.`id`=o.`user_id`
  3300. WHERE t.`date`>='".$date1."' AND t.`date`<'".$date2."' AND t.`moderated`=1 AND t.`block`=0
  3301. GROUP BY `phone`
  3302. HAVING `phone`!=''";
  3303. $this->db->query($sql);
  3304. $data = $this->db->get_result();
  3305. $count=0;
  3306. if(count($data)){
  3307. include_once(__ENGINE_PATH.'/functions/classes/class_sms.php');
  3308. $sms = new Sms();
  3309. global $object_types;
  3310. include_once(__ENGINE_PATH.'/functions/subfunctions/common.timezones.php');
  3311. global $timezones;
  3312. foreach($data as $item){
  3313. $sms_text = '';
  3314. $action_name = html_entity_decode($item['name_extension']?$item['name'].'. '.$item['name_extension']:$item['name']);
  3315. $sms_text = "Завтра состоится мероприятие: {$action_name}, на которое вы подавали заявку. ".__SITE_NAME;
  3316. //если текст смс больше 134 символов, то обрезаем имя мероприятия и добавлем многоточие
  3317. if(mb_strlen($sms_text, 'UTF-8') > 134){
  3318. $action_name = mb_substr($action_name, 0, (134-mb_strlen($sms_text, 'UTF-8')-3), 'UTF-8').'...';
  3319. //формируем новый текст смс
  3320. $sms_text = "Завтра состоится мероприятие: {$action_name}, на которое вы подавали заявку. ".__SITE_NAME;
  3321. }
  3322. //отправляем в 17 часов по местному времени
  3323. if($item["timezone"] != '-1')$hour = 17 - $timezones[$item["timezone"]]["correction"]/3600;
  3324. else $hour = 17;
  3325. $year = gmdate("Y",gmmktime($hour,0,0,gmdate('m'),gmdate('d'),gmdate('Y')));
  3326. $month = gmdate("m",gmmktime($hour,0,0,gmdate('m'),gmdate('d'),gmdate('Y')));
  3327. $day = gmdate("d",gmmktime($hour,0,0,gmdate('m'),gmdate('d'),gmdate('Y')));
  3328. //время отправки (серверное)
  3329. $send_time = $year."-".$month."-".$day." ".($hour < 10 ? "0" : "").$hour.":00:00";
  3330. $phone = preg_replace('/\D/ui','', $item['phone']);
  3331. $sms->save($phone, $sms_text, $send_time);
  3332. $count++;
  3333. //echo $sms_text.'**'.$send_time;
  3334. }
  3335. echo "Отправлено SMS-напоминаний о предстоящем мероприятии: ".$count.'<br/>';
  3336. }
  3337. return $count;
  3338. }
  3339. }
  3340. ?>