messages.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. <?php
  2. //define the messages classs
  3. if (!class_exists('messages')) {
  4. class messages {
  5. /**
  6. * declare public variables
  7. */
  8. public $destinations;
  9. public $domain_uuid;
  10. public $message_date_begin;
  11. public $message_date_end;
  12. public $quick_select;
  13. /**
  14. * declare private variables
  15. */
  16. private $app_name;
  17. private $app_uuid;
  18. private $permission_prefix;
  19. private $list_page;
  20. private $table;
  21. private $uuid_prefix;
  22. private $settings;
  23. /**
  24. * called when the object is created
  25. */
  26. public function __construct($settings = null) {
  27. if (is_null($this->domain_uuid)) {
  28. $this->domain_uuid = $_SESSION['domain_uuid'];
  29. }
  30. if (!isset($settings)) {
  31. $this->settings = new settings();
  32. }
  33. //assign private variables
  34. $this->app_name = 'messages';
  35. $this->app_uuid = '4a20815d-042c-47c8-85df-085333e79b87';
  36. $this->permission_prefix = 'message_';
  37. $this->list_page = 'messages_log.php';
  38. $this->table = 'messages';
  39. $this->uuid_prefix = 'message_';
  40. }
  41. /**
  42. * called when there are no references to a particular object
  43. * unset the variables used in the class
  44. */
  45. public function __destruct() {
  46. foreach ($this as $key => $value) {
  47. unset($this->$key);
  48. }
  49. }
  50. /**
  51. * delete records
  52. */
  53. public function delete($records) {
  54. if (permission_exists($this->permission_prefix.'delete')) {
  55. //add multi-lingual support
  56. $language = new text;
  57. $text = $language->get();
  58. //validate the token
  59. $token = new token;
  60. if (!$token->validate($_SERVER['PHP_SELF'])) {
  61. message::add($text['message-invalid_token'],'negative');
  62. header('Location: '.$this->list_page);
  63. exit;
  64. }
  65. //delete multiple records
  66. if (is_array($records) && @sizeof($records) != 0) {
  67. //build the delete array
  68. foreach ($records as $x => $record) {
  69. if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
  70. $array[$this->table][$x][$this->uuid_prefix.'uuid'] = $record['uuid'];
  71. $array[$this->table][$x]['domain_uuid'] = $_SESSION['domain_uuid'];
  72. $array['message_media'][$x][$this->uuid_prefix.'uuid'] = $record['uuid'];
  73. $array['message_media'][$x]['domain_uuid'] = $_SESSION['domain_uuid'];
  74. }
  75. }
  76. //delete the checked rows
  77. if (is_array($array) && @sizeof($array) != 0) {
  78. //grant temporary permissions
  79. $p = permissions::new();
  80. $p->add('message_media_delete', 'temp');
  81. //execute delete
  82. $database = new database;
  83. $database->app_name = $this->app_name;
  84. $database->app_uuid = $this->app_uuid;
  85. $database->delete($array);
  86. unset($array);
  87. //revoke temporary permissions
  88. $p->delete('message_media_delete', 'temp');
  89. //set message
  90. message::add($text['message-delete']);
  91. }
  92. unset($records);
  93. }
  94. }
  95. } //method
  96. /**
  97. * send a message
  98. */
  99. public function send($message_type, $message_from, $message_to, $message_text, $message_media = '') {
  100. //santize the data
  101. $message_type = 'sms';
  102. $message_from = preg_replace("/[^\+?0-9]/", "", $message_from);
  103. $message_to = preg_replace('/[^\+?0-9]/', '', $message_to);
  104. //error check
  105. if (!is_numeric($message_from) || !is_numeric($message_to)) {
  106. exit;
  107. }
  108. //handle media (if any)
  109. if (!empty($message_media) && is_array($message_media) && @sizeof($message_media) != 0) {
  110. // reorganize media array, ignore errored files
  111. $f = 0;
  112. foreach ($message_media['error'] as $index => $error) {
  113. if ($error == 0) {
  114. $tmp_media[$f]['uuid'] = uuid();
  115. $tmp_media[$f]['name'] = $message_media['name'][$index];
  116. $tmp_media[$f]['type'] = $message_media['type'][$index];
  117. $tmp_media[$f]['tmp_name'] = $message_media['tmp_name'][$index];
  118. $tmp_media[$f]['size'] = $message_media['size'][$index];
  119. $f++;
  120. }
  121. }
  122. $message_media = $tmp_media;
  123. unset($tmp_media, $f);
  124. }
  125. $message_type = is_array($message_media) && @sizeof($message_media) != 0 ? 'mms' : 'sms';
  126. //get the contact uuid
  127. //$sql = "select c.contact_uuid ";
  128. //$sql .= "from v_contacts as c, v_contact_phones as p ";
  129. //$sql .= "where p.contact_uuid = c.contact_uuid ";
  130. //$sql .= "and p.phone_number like :phone_number ";
  131. //$sql .= "and c.domain_uuid = :domain_uuid ";
  132. //$parameters['phone_number'] = '%'.$message_to.'%';
  133. //$parameters['domain_uuid'] = $domain_uuid;
  134. //$database = new database;
  135. //$contact_uuid = $database->select($sql, $parameters, 'column');
  136. //unset($sql, $parameters);
  137. //prepare message to send
  138. $message['to'] = $message_to;
  139. $message['text'] = $message_text;
  140. //if (is_array($message_media) && @sizeof($message_media) != 0) {
  141. // $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? 'https://' : 'http://';
  142. // foreach ($message_media as $index => $media) {
  143. // $path = $protocol.$_SERVER['HTTP_HOST'].'/app/messages/message_media.php?id='.$media['uuid'].'&action=download&.'.strtolower(pathinfo($media['name'], PATHINFO_EXTENSION));
  144. // $message['media'][] = $path;
  145. // }
  146. //}
  147. $http_content = json_encode($message);
  148. //use the phone number to get the destination details
  149. $sql = "SELECT * FROM v_destinations ";
  150. $sql .= "WHERE ( ";
  151. $sql .= " destination_prefix || destination_area_code || destination_number = :destination_number ";
  152. $sql .= " OR destination_trunk_prefix || destination_area_code || destination_number = :destination_number ";
  153. $sql .= " OR destination_prefix || destination_number = :destination_number ";
  154. $sql .= " OR '+' || destination_prefix || destination_number = :destination_number ";
  155. $sql .= " OR '+' || destination_prefix || destination_area_code || destination_number = :destination_number ";
  156. $sql .= " OR destination_area_code || destination_number = :destination_number ";
  157. $sql .= " OR destination_number = :destination_number ";
  158. $sql .= ") ";
  159. $sql .= "and provider_uuid is not null ";
  160. $sql .= "and destination_enabled = 'true'; ";
  161. $parameters['destination_number'] = $message_from;
  162. // if (!empty($debug)) {
  163. // file_put_contents($log_file, "sql: ".$sql."\n", FILE_APPEND);
  164. // //echo $sql."\n";
  165. // file_put_contents($log_file, print_r($parameters, true)."\n", FILE_APPEND);
  166. // }
  167. $database = new database;
  168. $row = $database->select($sql, $parameters, 'row');
  169. //view_array($row, false);
  170. if (isset($row)) {
  171. $domain_uuid = $row['domain_uuid'];
  172. $provider_uuid = $row['provider_uuid'];
  173. $user_uuid = $row['user_uuid'];
  174. $group_uuid = $row['group_uuid'];
  175. unset($row);
  176. }
  177. //if (!empty($debug)) {
  178. // view_array($row,false);
  179. //file_put_contents($log_file, print_r($row, true)."\n", FILE_APPEND);
  180. //}
  181. unset($sql, $parameters);
  182. //debug
  183. //echo "provider_uuid: ".$provider_uuid."\n";
  184. //get the provider settings
  185. $sql = "select provider_setting_category, provider_setting_subcategory, ";
  186. $sql .= "provider_setting_name, provider_setting_value, provider_setting_order \n";
  187. $sql .= "from v_provider_settings \n";
  188. $sql .= "where provider_uuid = :provider_uuid \n";
  189. $sql .= "and provider_setting_category = 'outbound' \n";
  190. $sql .= "and provider_setting_enabled = 'true'; \n";
  191. $parameters['provider_uuid'] = $provider_uuid;
  192. $database = new database;
  193. $provider_settings = $database->select($sql, $parameters, 'all');
  194. unset($parameters);
  195. //echo $sql;
  196. //print_r($parameters);
  197. //print_r($provider_settings);
  198. //
  199. //echo "\n";
  200. //process the provider settings array
  201. foreach ($provider_settings as $row) {
  202. //format the phone numbers
  203. if ($row['provider_setting_subcategory'] == 'format') {
  204. if ($row['provider_setting_name'] == 'message_from') {
  205. $message_from = format_string($row['provider_setting_value'], $message_from);
  206. }
  207. if ($row['provider_setting_name'] == 'message_to') {
  208. $message_to = format_string($row['provider_setting_value'], $message_to);
  209. }
  210. }
  211. }
  212. //continue only if message from and to have a value
  213. if (!isset($message_from) || !isset($message_to)) {
  214. return false;
  215. }
  216. //add the permission
  217. $p = permissions::new();
  218. $p->add('message_queue_add', 'temp');
  219. //build the message array
  220. $message_queue_uuid = uuid();
  221. $array['message_queue'][0]['domain_uuid'] = $_SESSION["domain_uuid"];
  222. $array['message_queue'][0]['message_queue_uuid'] = $message_queue_uuid;
  223. $array['message_queue'][0]['user_uuid'] = $_SESSION["user_uuid"];
  224. $array['message_queue'][0]['group_uuid'] = $group_uuid;
  225. //$array['message_queue'][0]['contact_uuid'] = $contact_uuid;
  226. $array['message_queue'][0]['provider_uuid'] = $provider_uuid;
  227. $array['message_queue'][0]['hostname'] = system('hostname');
  228. $array['message_queue'][0]['message_status'] = 'waiting';
  229. $array['message_queue'][0]['message_type'] = $message_type;
  230. $array['message_queue'][0]['message_direction'] = 'outbound';
  231. $array['message_queue'][0]['message_date'] = 'now()';
  232. $array['message_queue'][0]['message_from'] = $message_from;
  233. $array['message_queue'][0]['message_to'] = $message_to;
  234. $array['message_queue'][0]['message_text'] = $message_text;
  235. //view_array($array);
  236. //build message media array (if necessary)
  237. $media_exists = false;
  238. if (is_array($message_media) && @sizeof($message_media) != 0) {
  239. $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? 'https://' : 'http://';
  240. foreach($message_media as $index => $media) {
  241. //create the media path
  242. $media_url = $protocol.$_SERVER['HTTP_HOST'].'/app/messages/media/'.$media['uuid'].'/'.$media['name'];
  243. //add the media to the array
  244. $array['message_media'][$index]['message_media_uuid'] = $media['uuid'];
  245. $array['message_media'][$index]['message_uuid'] = $message_queue_uuid;
  246. $array['message_media'][$index]['domain_uuid'] = $_SESSION["domain_uuid"];
  247. $array['message_media'][$index]['user_uuid'] = $_SESSION["user_uuid"];
  248. $array['message_media'][$index]['message_media_name'] = $media['name'];
  249. $array['message_media'][$index]['message_media_type'] = strtolower(pathinfo($media['name'], PATHINFO_EXTENSION));
  250. $array['message_media'][$index]['message_media_date'] = 'now()';
  251. $array['message_media'][$index]['message_media_url'] = $media_url;
  252. $array['message_media'][$index]['message_media_content'] = base64_encode(file_get_contents($media['tmp_name']));
  253. }
  254. $p->add('message_media_add', 'temp');
  255. $media_exists = true;
  256. }
  257. //no message or media to send - do not send
  258. //if ($message_text == '' && !$media_exists) {
  259. // return;
  260. //}
  261. //save to the data
  262. $database = new database;
  263. $database->app_name = 'messages';
  264. $database->app_uuid = '4a20815d-042c-47c8-85df-085333e79b87';
  265. $database->save($array, false);
  266. //$message = $database->message;
  267. //view_array($message, true);
  268. unset($array);
  269. //remove the permission
  270. $p->delete('message_queue_add', 'temp');
  271. $p->delete('message_media_add', 'temp');
  272. } //method
  273. public function message_summary() {
  274. //set the time zone
  275. if (!empty($this->settings->get('domain', 'time_zone'))) {
  276. $time_zone = $this->settings->get('domain', 'time_zone');
  277. }
  278. else {
  279. $time_zone = date_default_timezone_get();
  280. }
  281. //set the time zone for php
  282. date_default_timezone_set($time_zone);
  283. //build the date range
  284. if (!empty($this->message_date_begin) || !empty($this->message_date_end)) {
  285. unset($this->quick_select);
  286. if (strlen($this->message_date_begin) > 0 && !empty($this->message_date_end)) {
  287. $sql_date_range = " and message_date between :message_date_begin::timestamptz and :message_date_end::timestamptz \n";
  288. $parameters['message_date_begin'] = $this->message_date_begin.':00.000 '.$time_zone;
  289. $parameters['message_date_end'] = $this->message_date_end.':59.999 '.$time_zone;
  290. }
  291. else {
  292. if (!empty($this->message_date_begin)) {
  293. $sql_date_range = "and message_date >= :message_date_begin::timestamptz \n";
  294. $parameters['message_date_begin'] = $this->message_date_begin.':00.000 '.$time_zone;
  295. }
  296. if (!empty($this->message_date_end)) {
  297. $sql_date_range .= "and message_date <= :message_date_end::timestamptz \n";
  298. $parameters['message_date_end'] = $this->message_date_end.':59.999 '.$time_zone;
  299. }
  300. }
  301. }
  302. else {
  303. switch ($this->quick_select) {
  304. case 1: $sql_date_range = "and message_date >= '".date('Y-m-d H:i:s.000', strtotime("-1 week"))." ".$time_zone."'::timestamptz \n"; break; //last 7 days
  305. case 2: $sql_date_range = "and message_date >= '".date('Y-m-d H:i:s.000', strtotime("-1 hour"))." ".$time_zone."'::timestamptz \n"; break; //last hour
  306. case 3: $sql_date_range = "and message_date >= '".date('Y-m-d')." "."00:00:00.000 ".$time_zone."'::timestamptz \n"; break; //today
  307. case 4: $sql_date_range = "and message_date between '".date('Y-m-d',strtotime("-1 day"))." "."00:00:00.000 ".$time_zone."'::timestamptz and '".date('Y-m-d',strtotime("-1 day"))." "."23:59:59.999 ".$time_zone."'::timestamptz \n"; break; //yesterday
  308. case 5: $sql_date_range = "and message_date >= '".date('Y-m-d',strtotime("this week"))." "."00:00:00.000 ".$time_zone."' \n"; break; //this week
  309. case 6: $sql_date_range = "and message_date >= '".date('Y-m-')."01 "."00:00:00.000 ".$time_zone."'::timestamptz \n"; break; //this month
  310. case 7: $sql_date_range = "and message_date >= '".date('Y-')."01-01 "."00:00:00.000 ".$time_zone."'::timestamptz \n"; break; //this year
  311. }
  312. }
  313. $sql = "with \n";
  314. $sql .= "message_inbound as ( \n";
  315. $sql .= "select \n";
  316. $sql .= "m.domain_uuid as domain_uuid, \n";
  317. $sql .= "d.destination_uuid as destination_uuid, \n";
  318. $sql .= "m.message_to as destination, \n";
  319. //message_read
  320. $sql .= "count(*) \n";
  321. $sql .= "filter (where m.message_read IS TRUE) \n";
  322. $sql .= "as message_read, \n";
  323. //message_unread
  324. $sql .= "count(*) \n";
  325. $sql .= "filter (where m.message_read IS NOT TRUE) \n";
  326. $sql .= "as message_unread, \n";
  327. //message_received
  328. $sql .= "count(*) \n";
  329. $sql .= "as message_received, \n";
  330. $sql .= "0 as message_sent \n";
  331. $sql .= "from v_messages m, v_destinations d \n";
  332. if (!(!empty($_GET['show']) && $_GET['show'] === 'all' && permission_exists('message_summary_all'))) {
  333. $sql .= "where m.domain_uuid = :domain_uuid \n";
  334. }
  335. else {
  336. $sql .= "where true \n";
  337. }
  338. $sql .= $sql_date_range ?? '';
  339. $sql .= "and m.message_direction = 'inbound' \n";
  340. $sql .= "and m.message_to in (d.destination_number, concat(d.destination_prefix, d.destination_number), concat('+', d.destination_prefix, d.destination_number)) \n";
  341. $sql .= "group by m.domain_uuid, d.destination_uuid, m.message_to \n";
  342. $sql .= "), message_outbound as ( \n";
  343. $sql .= "select \n";
  344. $sql .= "m.domain_uuid as domain_uuid, \n";
  345. $sql .= "d.destination_uuid as destination_uuid, \n";
  346. $sql .= "m.message_from as destination, \n";
  347. $sql .= "0 as message_read, \n";
  348. $sql .= "0 as message_unread, \n";
  349. $sql .= "0 as message_received, \n";
  350. //message_sent
  351. $sql .= "count(*) \n";
  352. $sql .= "as message_sent \n";
  353. $sql .= "from v_messages m, v_destinations d \n";
  354. if (!(!empty($_GET['show']) && $_GET['show'] === 'all' && permission_exists('message_summary_all'))) {
  355. $sql .= "where m.domain_uuid = :domain_uuid \n";
  356. }
  357. else {
  358. $sql .= "where true \n";
  359. }
  360. $sql .= $sql_date_range ?? '';
  361. $sql .= "and m.message_direction = 'outbound' \n";
  362. $sql .= "and m.message_from in (d.destination_number, concat(d.destination_prefix, d.destination_number), concat('+', d.destination_prefix, d.destination_number)) \n";
  363. $sql .= "group by m.domain_uuid, d.destination_uuid, m.message_from \n";
  364. $sql .= ") \n";
  365. $sql .= "select \n";
  366. $sql .= "n.domain_uuid, \n";
  367. $sql .= "d.destination_uuid, \n";
  368. $sql .= "d.destination_description, \n";
  369. $sql .= "n.domain_name, \n";
  370. $sql .= "t.destination, \n";
  371. $sql .= "sum(t.message_read) as message_read, \n";
  372. $sql .= "sum(t.message_unread) as message_unread, \n";
  373. $sql .= "sum(t.message_received) as message_received, \n";
  374. $sql .= "sum(t.message_sent) as message_sent \n";
  375. $sql .= "from ( \n";
  376. $sql .= "select * from message_inbound \n";
  377. $sql .= "union \n";
  378. $sql .= "select * from message_outbound \n";
  379. $sql .= ") as t, v_domains n, v_destinations d \n";
  380. $sql .= "where \n";
  381. $sql .= "n.domain_uuid = t.domain_uuid \n";
  382. $sql .= "and d.destination_uuid = t.destination_uuid \n";
  383. $sql .= "group by n.domain_uuid, d.destination_uuid, d.destination_description, n.domain_name, t.destination \n";
  384. $sql .= "order by t.destination asc \n";
  385. if (!(!empty($_GET['show']) && $_GET['show'] === 'all' && permission_exists('message_summary_all'))) {
  386. $parameters['domain_uuid'] = $this->domain_uuid;
  387. }
  388. $database = database::new();
  389. $summary = $database->select($sql, $parameters, 'all');
  390. unset($parameters);
  391. //view_array($database->message);
  392. //return the array
  393. return $summary;
  394. } //method
  395. } //class
  396. }
  397. ?>