newticket.php
上传用户:gzy2002
上传日期:2010-02-11
资源大小:1785k
文件大小:18k
源码类别:

电子政务应用

开发平台:

Java

  1. <?php
  2. // +-------------------------------------------------------------+
  3. // | DeskPRO v [2.0.1 Production]
  4. // | Copyright (C) 2001 - 2004 Headstart Solutions Limited
  5. // | Supplied by WTN-WDYL
  6. // | Nullified by WTN-WDYL
  7. // | Distribution via WebForum, ForumRU and associated file dumps
  8. // +-------------------------------------------------------------+
  9. // | DESKPRO IS NOT FREE SOFTWARE
  10. // +-------------------------------------------------------------+
  11. // | License ID : Full Enterprise License =) ...
  12. // | License Owner : WTN-WDYL Team
  13. // +-------------------------------------------------------------+
  14. // | $RCSfile: newticket.php,v $
  15. // | $Date: 2004/02/12 21:16:57 $
  16. // | $Revision: 1.72 $
  17. // +-------------------------------------------------------------+
  18. // | File Details:
  19. // | - Ticket creation interface.
  20. // +-------------------------------------------------------------+
  21. error_reporting(E_ALL & ~E_NOTICE);
  22. require_once('./global.php');
  23. //Nullify WTN-WDYL Team
  24. max_limits('tickets');
  25. $template_cache = templatecache('NEW_newticket,HF_footer,HF_header');
  26. ############################### NEED TO BE REGISTERED ###############################
  27. // run user checks
  28. user_p_checks();
  29. // not logged in? do we require registration?
  30. if ($settings[require_registration] AND !$session[userid]) {
  31. login_form();
  32. }
  33. // is the user expired?
  34. if ($user['id']) {
  35. $exp = user_expired($user['id']);
  36. if (is_array($exp)) {
  37. $user_expired = 1;
  38. $user_expired_tickets = $exp[0];
  39. $user_expired_date = $exp[1];
  40. }
  41. }
  42. if ($user_expired) {
  43. error($dplang['expired_user']);
  44. }
  45. ############################### START PROCESSING ###############################
  46. // default do
  47. $_REQUEST['do'] = trim($_REQUEST['do']);
  48. if (!isset($_REQUEST['do']) or $_REQUEST['do'] == "") {
  49. $_REQUEST['do'] = "start";
  50. }
  51. // globalise variables
  52. $global = array (
  53. array('tempticketid'),  // used for attachments
  54. array('email')
  55. );
  56. rg($global);
  57. $page = 'newquestion';
  58. $navigation = ' // ' . "<a class="light" href="newticket.php">$dplang[ask_question]</a>";
  59. ############################### PROCESS A TEMPORARY ATTACHMENT ###############################
  60. if ($_REQUEST['attachment_upload']) {
  61. $attachment = validate_attachment($attachment_error);
  62. if ($attachment) {
  63. $attach = add_attachment();
  64. $attachment_yes = 1;
  65. // blobid is unique
  66. if ($tempticketid == '' OR !$tempticketid) {
  67. $tempticketid = $attach[blobid];
  68. }
  69. $db->query("
  70. INSERT INTO ticket_attachments SET
  71. blobid = '$attach[blobid]',
  72. filename = '" . mysql_escape_string($attach[name]) . "',
  73. filesize = '" . mysql_escape_string($attach[size]) . "',
  74. extension = '" . mysql_escape_string($attach[extension]) . "',
  75. temporaryid = '" . mysql_escape_string($tempticketid) . "',
  76. timestamp = '" . mktime() . "'" .
  77. iff($user['id'], ", userid = '$user[id]'")
  78. );
  79. $redo = 1;
  80. } else {
  81. if ($attachment_error) {
  82. // attachment error type
  83. if ($attachment_error == 1) {
  84. $attachment_no_big = 1;
  85. } elseif ($attachment_error == 2) {
  86. $attachment_no_filetype = 1;
  87. } else {
  88. $attachment_no = 1;
  89. }
  90. $stop = 1;
  91. }
  92. }
  93. $_REQUEST['do'] = "start";
  94. }
  95. ############################### DELETE A TEMPORARY ATTACHMENT ###############################
  96. if ($_REQUEST['delattachid']) {
  97. $result = $db->query_return("
  98. SELECT blobid 
  99. FROM ticket_attachments 
  100. WHERE id = '" . mysql_escape_string($_REQUEST['delattachid']) . "'
  101. ");
  102. $db->query("DELETE FROM blobs WHERE id = '$result[blobid]'");
  103. $db->query("DELETE FROM ticket_attachments WHERE
  104. id = '" . mysql_escape_string($_REQUEST['delattachid']) . "'
  105. ");
  106. $_REQUEST['do'] = "start";
  107. $redo = 1;
  108. }
  109. ############################### PROCESS SUBMITTED FORM ###############################
  110. if ($_REQUEST['do'] == "submit") {
  111. //////////////// Check to see if ticket has already been created ////////////////
  112. // last hour. We don't want to scan whole database
  113. $check_time = mktime() - 3600;
  114. $check_ticket = $db->query_return("
  115. SELECT ticket.ref
  116. FROM ticket
  117. LEFT JOIN ticket_message ON (ticket.id = ticket_message.ticketid)
  118. WHERE email = '" . addslashes($_REQUEST[email]) . "'
  119. AND (ticket.date_opened > $check_time)
  120. AND ticket_message.message = '" . addslashes($_REQUEST[message]) . "'
  121. ");
  122. if ($db->num_rows()) {
  123. jump("view.php?ticketref=$check_ticket[ref]", 'redirect_new_ticket');
  124. }
  125. // term for category and priority to only allow cats/pris that are open to unregistered users
  126. if (!$user) {
  127. $term = 'AND !require_registration';
  128. } else {
  129. unset($term);
  130. }
  131. //////////////// category ////////////////
  132. if ($settings['category_user_viewable'] AND $settings['category_user_editable']) {
  133. $db->query("SELECT * FROM ticket_cat 
  134. WHERE user_view 
  135. AND user_select
  136. $term
  137. ORDER by cat_order
  138. ");
  139. while ($cat = $db->row_array()) {
  140. $cats[] = $cat['id'];
  141. if ($cat['id'] == $_REQUEST['category']) {
  142. $cat_data = $cat;
  143. }
  144. }
  145. // only valid categories
  146. if (!(@in_array($_REQUEST['category'], $cats))) {
  147. unset($_REQUEST['category']);
  148. }
  149. // category required
  150. if ($settings['category_require_selection'] AND !$_REQUEST['category']) {
  151. $stop = 1;
  152. $error_category = 1;
  153. }
  154. }
  155. //////////////// priority ////////////////
  156. if (!$settings[priority_disable] AND $settings[priority_user_viewable] AND $settings[priority_user_editable]) {
  157. $db->query(" SELECT * FROM ticket_pri
  158. WHERE user_view
  159. AND user_select
  160. $term
  161. ORDER by pri_order
  162. ");
  163. while ($pri = $db->row_array()) {
  164. $pris[] = $pri[id];
  165. if ($pri[id] == $_REQUEST[priority]) {
  166. $pri_data = $pri;
  167. }
  168. }
  169. // only valid priorities
  170. if (!(@in_array($_REQUEST[priority], $pris))) {
  171. unset($_REQUEST[priority]);
  172. }
  173. // priority required
  174. if ($settings[priority_require_selection] AND !$_REQUEST[priority]) {
  175. $stop = 1;
  176. $error_priority = 1;
  177. }
  178. }
  179. //////////////// email ////////////////
  180. if ($user) {
  181. // must be an email associated with the user
  182. if ($email == $user[email] OR $email == '') {
  183. $email = $user[email];
  184. } else {
  185. $db->query("SELECT email FROM user_email WHERE userid = '$session[userid]' AND validated");
  186. while ($result = $db->row_array()) {
  187. $email_array[] = $result[email];
  188. }
  189. if (!@in_array($email, $email_array)) {
  190. $stop = 1;
  191. $error_notyou_email = 1;
  192. $error_email = 1;
  193. }
  194. }
  195. } else {
  196. // check email is valid
  197. if (!validate_email($email)) {
  198. $stop = 1;
  199. $error_bad_email = 1;
  200. $error_email = 1;
  201. } elseif (banned_email($email)) {
  202. $stop = 1;
  203. $error_banned_email = 1;
  204. $error_email = 1;
  205. }
  206. }
  207. //////////////// subject ////////////////
  208. if (strlen($_REQUEST[subject]) < 5) {
  209. $stop = 1;
  210. $error_subject = 1;
  211. }
  212. //////////////// message ////////////////
  213. // check that the post box is not too large
  214. if (strlen($_REQUEST[message]) > $settings[max_size] AND $settings[max_size] != 0) {
  215. $stop = 1;
  216. $error_post_big = 1;
  217. $error_post = 1;
  218. }
  219. // check that the post box is not empty as well
  220. if (strlen($_REQUEST[message]) < 5) {
  221. $stop = 1;
  222. $error_post_small = 1;
  223. $error_post = 1;
  224. }
  225. //////////////// custom fields ////////////////
  226. $db->query("SELECT * from ticket_def WHERE ticket_start");
  227. while ($result = $db->row_array()) {
  228. $data = field_def_val($result, $_REQUEST[custom_fields][$result[name]], $_REQUEST[custom_fields]["extra" . $result[name]]);
  229. if ($data === NULL) {
  230. $tmp = unserialize($result[error_message]);
  231. $error_message = $tmp[$session[language]];
  232. // form errors;
  233. $custom_error[] = array('error' => $error_message);
  234. // for form design
  235. $custom_errors[] = $result[name];
  236. $stop = 1;
  237. } else {
  238. $query2 .= " $result[name] = '" . mysql_escape_string($data) . "', ";
  239. }
  240. }
  241. //////////////// attachments ////////////////
  242. // attachment during this upload
  243. $attachment = validate_attachment($attachment_error);
  244. if ($attachment_error AND $attachment_error != 5) {
  245. // attachment error type
  246. if ($attachment_error == 1) {
  247. $attachment_no_big = 1;
  248. } elseif ($attachment_error == 2) {
  249. $attachment_no_filetype = 1;
  250. } else {
  251. $attachment_no = 1;
  252. }
  253. $stop = 1;
  254. }
  255. //////////////// error / create ticket ////////////////
  256. if ($stop) {
  257. $_REQUEST['do'] = "start";
  258. } else {
  259. $_REQUEST['do'] = "create";
  260. }
  261. }
  262. ############################### CREATE NEW TICKET ###############################
  263. if ($_REQUEST['do'] == "start") {
  264. if (!$email) {
  265. $email = $user[email];
  266. }
  267. // sort emails
  268. if ($session[userid]) {
  269. $email_array[] = $user[email];
  270. $db->query("SELECT email FROM user_email WHERE userid = '$session[userid]' AND validated");
  271. while ($result = $db->row_array()) {
  272. $email_array[] = $result[email];
  273. }
  274. if (count($email_array) > 1) {
  275. $email_html = form_select('email', $email_array, $email, '', 1);
  276. }
  277. } else {
  278. $email_html = form_input('email', $email);
  279. }
  280. // categories
  281. $categories = user_category_array('new');
  282. if (is_array($categories)) {
  283. $category_html = form_select('category', $categories, $_REQUEST[category]);
  284. }
  285. // priorities
  286. $priorities = user_priority_array('new');
  287. if (is_array($priorities)) {
  288. $priority_html = form_select('priority', $priorities, $_REQUEST[priority]);
  289. }
  290. // get rest of ticket data
  291. $db->query(
  292. "SELECT * from ticket_def
  293. WHERE ticket_start
  294. ORDER by displayorder"
  295. );
  296. $custom = array();
  297. while ($result = $db->row_array()) {
  298. unset($name, $description, $error, $html);
  299. $tmp = unserialize($result[display_name]);
  300. $name = $tmp[$session[language]];
  301. $tmp = unserialize($result[description]);
  302. $description = $tmp[$session[language]];
  303. if ($stop OR $redo) {
  304. $html = field_def($result, 'redo', $_REQUEST[custom_fields][$result[name]], $_REQUEST[custom_fields]["extra" . $result[name]]);
  305. } else {
  306. $html = field_def($result);
  307. }
  308. $tmp = unserialize($result[error_message]);
  309. $error = $tmp[$session[language]];
  310. // two arrays, one for loop and one to allow custom form design
  311. $custom[] = array(
  312. 'name' => $name,
  313. 'description' => $description,
  314. 'html' => $html,
  315. 'error' => iff(@in_array($result[name], $custom_errors), $error, '')
  316. );
  317. ${$result[name]} = array(
  318. 'name' => $name,
  319. 'description' => $description,
  320. 'html' => $html,
  321. 'error' => iff(@in_array($result[name], $custom_errors), $error, '')
  322. );
  323. }
  324. $attach = array();
  325. $db->query(" SELECT * FROM ticket_attachments 
  326. WHERE temporaryid = '" . mysql_escape_string($tempticketid) . "' 
  327. AND temporaryid
  328. ");
  329. while ($result = $db->row_array()) {
  330. $attach[] = array(
  331. 'id' => $result[id],
  332. 'name' => $result[filename],
  333. 'filesize' => filesize_display($result[filesize])
  334. );
  335. }
  336. eval(makeeval('header', 'HF_header'));
  337. eval(makeeval('footer', 'HF_footer'));
  338. eval(makeeval('echo', 'NEW_newticket'));
  339. }
  340. ############################### ADD TICKET TO DATABASE AND PROCESS ################################
  341. if ($_REQUEST['do'] == "create") {
  342. /////////////////////// CHECK / CREATE USER ///////////////////////
  343. // logged in
  344. if (!$session[userid]) {
  345. // old user who is not logged in
  346. if ($user[id] = userid_from_email($email)) {
  347. $loggedout_user = 1;
  348. $user = $db->query_return("SELECT * FROM user WHERE id = '$user[id]'");
  349. } else {
  350. // create user
  351. $new_user = 1;
  352. // passwords
  353. $password = make_pass(8);
  354. $password_cookie = md5($session[sessionid] . $password . uniqid(rand(),1));
  355. $password_cookie = substr($password_cookie, 0, 8);
  356. $password_url = md5($password . uniqid(rand(),1) . $session[sessionid]);
  357. $password_url = substr($password_url, 0, 8);
  358. // create username and check valid
  359. $username = make_username($email);
  360. // validate number
  361. $validate_number = substr(md5(time()),0,6);
  362. $db->query("
  363. INSERT into user SET
  364. password = '" . mysql_escape_string($password) . "',
  365. password_cookie = '" . mysql_escape_string($password_cookie) . "',
  366. password_url = '" . mysql_escape_string($password_url) . "',
  367. email = '" . mysql_escape_string($email) . "',
  368. name = '" . mysql_escape_string($_REQUEST[name]) . "',
  369. date_registered = '" . mktime() . "',
  370. validate_key = '" . addslashes($validate_number) . "',
  371. username = '" . mysql_escape_string($username) . "'" .
  372. iff($settings['manual_validation'], ", awaiting_manual_validation = '1'") .
  373. iff($settings['validate_email'], ", awaiting_validation = '1'") . "
  374. ");
  375. $user[id] = $db->last_id();
  376. $user = $db->query_return("SELECT * FROM user WHERE id = '$user[id]'");
  377. $user_details = $user; // needed for email to admins
  378. update_session('user', $user[id]);
  379. dp_setcookie('dp_user_userid', $user[id], 'ever');
  380. dp_setcookie('dp_user_password', $password_cookie, 'ever');
  381. $send_emails = explode(',', $settings[email_registeradmin]);
  382. if (is_array($send_emails)) {
  383. foreach ($send_emails AS $key => $var) {
  384. $var = trim($var);
  385. if (validate_email($var)) {
  386. $toemail = $var;
  387. eval(makeemaileval('message', 'TECHBODY_newuser', $subject));
  388. dp_mail($var, $subject, $message);
  389. }
  390. }
  391. }
  392. }
  393. } else {
  394. $loggedin_user = 1;
  395. }
  396. /////////////////////// CREATE TICKET ///////////////////////
  397. $ticketref = make_ticket_ref();
  398. $authcode = substr(md5(rand(0,100000) . mktime()), 0, 8);
  399. // start the sql statment (including custom fields
  400. $query = "
  401. INSERT into ticket SET 
  402. $query2
  403. subject = '" . mysql_escape_string($_REQUEST[subject]) . "',
  404. language = '$session[language]', 
  405. category = '" . mysql_escape_string($_REQUEST[category]) . "',
  406. priority = '" . mysql_escape_string($_REQUEST[priority]) . "',
  407. userid = '$user[id]',
  408. is_open = '1',
  409. awaiting_tech = '1',
  410. date_awaiting_toggled = '" . mktime() . "',
  411. date_opened = '" . mktime() . "',
  412. authcode = '$authcode',
  413. ref = '$ticketref'
  414. ";
  415. // set ticket to hidden if the user is awaiting a form of validation
  416. // i) new users and and settings to validate
  417. // ii) already awaiting a form of validation
  418. // tech must validate themselves
  419. if ($user[awaiting_manual_validation] OR ($settings[manual_validation] AND $new_user)) {
  420. $query .= ", nodisplay = '3'";
  421. } elseif ($user[awaiting_validation] OR ($settings[validate_email] AND $new_user)) {
  422. // user must validate themselves
  423. $query .= ", nodisplay = '2'";
  424. }
  425. // user e-mail
  426. if ($_REQUEST['email']) {
  427. $query .= ", email = '". mysql_escape_string($_REQUEST['email']) . "'";
  428. }
  429. // auto assignemnt (category overrides priority)
  430. if ($pri_data[auto_assign_tech]) {
  431. $query .= ", tech = '$pri_data[auto_assign_tech]'";
  432. } elseif ($cat_data[auto_assign_tech]) {
  433. $query .= ", tech = '$cat_data[auto_assign_tech]'";
  434. }
  435. // add new thread to database and get back id
  436. $db->query($query);
  437. $id = $db->last_id();
  438. ticketlog($id, 'created');
  439. /////////////////////// ATTACHMENTS ///////////////////////
  440. if ($attachment) {
  441. $attach = add_attachment();
  442. $db->query("
  443. INSERT INTO ticket_attachments SET
  444. blobid = '$attach[blobid]',
  445. filename = '" . mysql_escape_string($attach[name]) . "',
  446. filesize = '" . mysql_escape_string($attach[size]) . "',
  447. extension = '" . mysql_escape_string($attach[extension]) . "',
  448. ticketid = '" . mysql_escape_string($id) . "',
  449. userid = '$user[id]',
  450. timestamp = '" . mktime() . "'
  451. ");
  452. $attachment_id = $db->last_id();
  453. // attachments to send
  454. $attach['id'] = $attachment_id;
  455. // to link to an attachment for those techs that don't want to download it
  456. $email_attachment[] = $attach;
  457. }
  458. // any previous attachments
  459. if ($_REQUEST[tempticketid]) {
  460. $db->query("SELECT blobs.blobdata, ticket_attachments.id, filename, extension
  461. FROM ticket_attachments
  462. LEFT JOIN blobs ON (blobs.id = ticket_attachments.blobid)
  463. ");
  464. // get the attachments to email
  465. while ($result = $db->row_array()) {
  466. $email_attachments[] = array(
  467. 'data' => $result[blobdata],
  468. 'name' => $result[filename],
  469. 'extension' => $result[extension]
  470. );
  471. }
  472. $db->query("UPDATE ticket_attachments SET
  473. ticketid = '" . mysql_escape_string($id) . "',
  474. userid = '$user[id]',
  475. temporaryid = ''
  476. WHERE temporaryid = '" . mysql_escape_string($_REQUEST[tempticketid]) . "'
  477. ");
  478. }
  479. /////////////////////// ADD REPLY TO DATABASE ///////////////////////
  480. // add the new post to database
  481. $db->query("
  482. INSERT into ticket_message SET
  483. message = '" . mysql_escape_string($_REQUEST[message]) . "',
  484. ticketid = '" . intval($id) . "',
  485. userid = '$user[id]',
  486. date = '" . mktime() . "',
  487. ipaddress = '" . mysql_escape_string($ipaddress) . "'
  488. ");
  489. /////////////////////// CLEAN VARIABLES TO USE IN EMAIL ///////////////////////
  490. $ticket = $db->query_return("
  491. SELECT ticket.*
  492. FROM ticket
  493. WHERE ticket.id = '" . intval($id) . "'
  494. ");
  495. // logged in
  496. if (!$user) {
  497. global $user;
  498. $user = array(
  499. 'id' => $user[id],
  500. 'password' => $password,
  501. 'password_cookie' => $password_cookie,
  502. 'password_url' => $password_url,
  503. 'subject' => $subject,
  504. 'email' => $email,
  505. 'username' => $username
  506. );
  507. }
  508. $message = $_REQUEST['message'];
  509. $ticket['body'] = $message;
  510. /////////////////////// SEND EMAILS ///////////////////////
  511. notify_user('new_user', $ticket, $user, $_REQUEST[message], $email_attachment);
  512. notify_technicians('new', $ticket, $user, $_REQUEST[message], $email_attachment);
  513. /////////////////////// JUMP DEPENDING ON USER STATUS ///////////////////////
  514. if ($loggedin_user) {
  515. jump("view.php?ticketref=$ticketref", 'redirect_new_ticket');
  516. } elseif ($loggedout_user) {
  517. jump("view.php?ticketref=$ticketref&newticket=1", 'redirect_new_ticket');
  518. } elseif ($new_user) {
  519. jump("view.php?ticketref=$ticketref", 'redirect_new_ticket');
  520. }
  521. }
  522. ?>