Multimag  0.2.992
badpricenotify.php
См. документацию.
1 <?php
2 
3 // MultiMag v0.2 - Complex sales system
4 //
5 // Copyright (C) 2005-2018, BlackLight, TND Team, http://tndproject.org
6 //
7 // This program is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU Affero General Public License as
9 // published by the Free Software Foundation, either version 3 of the
10 // License, or (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU Affero General Public License for more details.
16 //
17 // You should have received a copy of the GNU Affero General Public License
18 // along with this program. If not, see <http://www.gnu.org/licenses/>.
19 //
20 
21 namespace actions;
22 
23 require_once($CONFIG['location'] . '/web/include/doc.core.php');
24 
26 class BadPriceNotify extends \Action {
27 
29  public function __construct($config, $db) {
30  parent::__construct($config, $db);
31  $this->interval = self::HOURLY;
32  }
33 
35  public function getName() {
36  return "Информирование о потенциально неверных ценах наименований";
37  }
38 
40  public function isEnabled() {
41  return \cfg::get('auto', 'badpricenotify') &&
42  (
43  \cfg::get('badpricenotify', 'threshold_low') ||
44  \cfg::get('badpricenotify', 'threshold_high')
45  );
46  }
48  public function run() {
49  $t_l = \cfg::get('badpricenotify', 'threshold_low');
50  $t_h = \cfg::get('badpricenotify', 'threshold_high');
51 
52  $docadm_notify = array();
53  $users_notify = array();
54  $last_users = array();
55  $res = $this->db->query("SELECT `object_id`, `user` AS `user_id` FROM `doc_log` WHERE `object`='pos' ORDER BY `time` DESC");
56  while($line = $res->fetch_assoc()) {
57  if(!isset($last_users[$line['object_id']])) {
58  $last_users[$line['object_id']] = $line['user_id'];
59  }
60  }
61 
62  $res = $this->db->query("SELECT `id`, `cost` AS `price`, `name`, `vc` FROM `doc_base` WHERE `pos_type`=0");
63  while($line = $res->fetch_assoc()) {
64  $line['in_price'] = \getInCost($line['id']);
65  if($line['in_price']>0) {
66  $x = round($line['price'] / $line['in_price'] * 100);
67  if( $t_l>0 && $x<100 && ( (100-$x)>=$t_l ) ) { // threshold low
68  $n_info = array('id'=>$line['id'], 'type'=>'l', 'value'=>100-$x,
69  'price'=>$line['price'], 'in_price'=>$line['in_price'],
70  'name'=>$line['name'], 'vc'=>$line['vc']);
71  $docadm_notify[] = $n_info;
72  if(isset($last_users[$line['id']])) {
73  $users_notify[$last_users[$line['id']]][] = $n_info;
74  }
75  }
76  if( $t_h>0 && $x>100 && ( ($x-100)>=$t_h ) ) { // threshold high
77  $n_info = array('id'=>$line['id'], 'type'=>'h', 'value'=>$x-100,
78  'price'=>$line['price'], 'in_price'=>$line['in_price'],
79  'name'=>$line['name'], 'vc'=>$line['vc']);
80  $docadm_notify[] = $n_info;
81  if(isset($last_users[$line['id']])) {
82  $users_notify[$last_users[$line['id']]][] = $n_info;
83  }
84  }
85  }
86  }
87 
88  $default_firm_id = \cfg::get('site', 'default_firm');
89  $site_name = \cfg::get('site', 'name');
90  $site_display_name = \cfg::get('site', 'display_name');
91  $doc_adm_email = \cfg::get('site', 'doc_adm_email');
92 
93  // Получить название фирмы, от которой выполняется рассылка
94  $res = $this->db->query("SELECT `firm_name` FROM `doc_vars` WHERE `id`='{$default_firm_id}'");
95  list($firm_name) = $res->fetch_row();
96 
97  if(count($docadm_notify)>0) {
98  $header = "Здравствуйте, Администратор документов!\n";
99  $header .= "Как сотрудника интернет-магазина http://{$site_name} и компании $firm_name, информирую о следующем:\n\n";
100 
101  $footer = "Вы получили это письмо потому что Ваш email установлен как адрес администратора документов в настройках сайта {$site_display_name} "
102  . "( http://{$site_name})\nИзмените адрес в настройках, если не хотите получать подобные уведомления.";
103  $this->sendMessage($docadm_notify, $header, $footer, $doc_adm_email);
104 
105 
106  // Оповещаем только подписанных агентов с нефиксированной ценой, у которых были специальные цены в предыдущем периоде
107  $res = $this->db->query("SELECT `user_id`, `worker`, `worker_email`, `worker_real_name` FROM `users_worker_info` WHERE `worker`>0");
108  while ($worker_info = $res->fetch_assoc()) {
109  if(!isset($users_notify[$worker_info['user_id']])) {
110  continue;
111  }
112  $header = "Здравствуйте, {$worker_info['worker_real_name']}!\n";
113  $header .= "Как последнего, кто изменял перечисленные ниже наименования в интернет-магазине http://{$site_name}, "
114  . "информирую о следующем:\n\n";
115 
116  $footer = "Вы получили это письмо потому что являетесь сотрудником компании $firm_name, обслуживающей интернет-магазин "
117  . "{$site_display_name} ( http://{$site_name})\nЧтобы перестать получать уведомления, "
118  . "Вам нужно исправить цены, либо перестать быть сотрудником компании $firm_name.";
119  $this->sendMessage($users_notify[$worker_info['user_id']], $header, $footer, $worker_info['worker_email']);
120  }
121  }
122 
123  }
124 
125  function sendMessage($pos_data, $header, $footer, $email) {
126  $site_name = \cfg::get('site', 'name');
127  $site_display_name = \cfg::get('site', 'display_name');
128  $admin_email = \cfg::get('site', 'admin_email');
129 
130  $mail_text = $header;
131  $mail_text .= "У следующих складских наименований, базовая цена выходит за допустимые пределы:\n\n";
132 
133  foreach($pos_data as $pos_info) {
134  $text_line = 'Для наименования '.$pos_info['name'];
135  if($pos_info['vc']) {
136  $text_line .= " ({$pos_info['vc']})";
137  }
138  $text_line .= "\n ID:".str_pad($pos_info['id'], 6, ' ', STR_PAD_LEFT);
139  $text_line .= ' - цена ' . ($pos_info['type']=='l'?'меньше':'больше') . ' актуальной';
140  $text_line .= " на {$pos_info['value']}%:";
141  $text_line .= "\n базовая:{$pos_info['price']}, актуальная:{$pos_info['in_price']}\n";
142  $mail_text .= $text_line;
143  }
144 
145  $mail_text .= "\n\n\n".$footer;
146  if($this->verbose) {
147  echo $mail_text;
148  }
149  $email_message = new \email_message();
150  $email_message->default_charset = "UTF-8";
151  $email_message->SetEncodedEmailHeader("To", $email, $email);
152  $email_message->SetEncodedHeader("Subject", 'Уведомление о проблемах с ценами - ' . $site_name);
153  $email_message->SetEncodedEmailHeader("From", $admin_email, $site_display_name);
154  $email_message->SetHeader("Sender", $admin_email);
155  $email_message->SetHeader("X-Multimag-version", MULTIMAG_VERSION);
156 
157  $email_message->AddQuotedPrintableTextPart($mail_text);
158  $error = $email_message->Send();
159 
160  if (strcmp($error, "")) {
161  throw new \Exception('Не удалось отправить сообщение на адрес '.$email.': '.$error);
162  }
163  }
164 
165 }
$res
Definition: fixer.php:178
run()
Запустить
getInCost($pos_id, $limit_date=0, $serv_mode=0)
Definition: doc.core.php:470
$mail_text
Definition: inet_backup.php:11
$line
Definition: priceload.php:39
const MULTIMAG_VERSION
Definition: core.common.php:21
$db
sendMessage($pos_data, $header, $footer, $email)
Информирование о потенциально неверных ценах наименований при помощи email.
__construct($config, $db)
Конструктор
isEnabled()
Проверить, разрешен ли периодический запуск действия
static get($sect, $param, $default=null)
Definition: cfg.php:46
$x
Definition: images.php:27
getName()
Получить название действия
$CONFIG['site']['admin_name']