PageRenderTime 57ms CodeModel.GetById 31ms RepoModel.GetById 0ms app.codeStats 0ms

/htdocs/public/ticket/view.php

https://github.com/hregis/dolibarr
PHP | 422 lines | 288 code | 71 blank | 63 comment | 99 complexity | dad828e2230772ce667da873fea671ad MD5 | raw file
  1. <?php
  2. /* Copyright (C) 2013-2016 Jean-François FERRY <hello@librethic.io>
  3. * Copyright (C) 2018 Frédéric France <frederic.france@netlogic.fr>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <https://www.gnu.org/licenses/>.
  17. */
  18. /**
  19. * \file htdocs/public/ticket/view.php
  20. * \ingroup ticket
  21. * \brief Public file to show one ticket
  22. */
  23. if (!defined('NOCSRFCHECK')) {
  24. define('NOCSRFCHECK', '1');
  25. }
  26. // Do not check anti CSRF attack test
  27. if (!defined('NOREQUIREMENU')) {
  28. define('NOREQUIREMENU', '1');
  29. }
  30. // If there is no need to load and show top and left menu
  31. if (!defined("NOLOGIN")) {
  32. define("NOLOGIN", '1');
  33. }
  34. if (!defined('NOIPCHECK')) {
  35. define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
  36. }
  37. if (!defined('NOBROWSERNOTIF')) {
  38. define('NOBROWSERNOTIF', '1');
  39. }
  40. // If this page is public (can be called outside logged session)
  41. // For MultiCompany module.
  42. // Do not use GETPOST here, function is not defined and define must be done before including main.inc.php
  43. $entity = (!empty($_GET['entity']) ? (int) $_GET['entity'] : (!empty($_POST['entity']) ? (int) $_POST['entity'] : 1));
  44. if (is_numeric($entity)) {
  45. define("DOLENTITY", $entity);
  46. }
  47. require '../../main.inc.php';
  48. require_once DOL_DOCUMENT_ROOT.'/ticket/class/actions_ticket.class.php';
  49. require_once DOL_DOCUMENT_ROOT.'/core/class/html.formticket.class.php';
  50. require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
  51. require_once DOL_DOCUMENT_ROOT.'/core/lib/ticket.lib.php';
  52. require_once DOL_DOCUMENT_ROOT.'/core/lib/security.lib.php';
  53. require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
  54. require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
  55. // Load translation files required by the page
  56. $langs->loadLangs(array("companies", "other", "ticket"));
  57. // Get parameters
  58. $track_id = GETPOST('track_id', 'alpha');
  59. $cancel = GETPOST('cancel', 'alpha');
  60. $action = GETPOST('action', 'aZ09');
  61. $email = GETPOST('email', 'email');
  62. if (GETPOST('btn_view_ticket')) {
  63. unset($_SESSION['email_customer']);
  64. }
  65. if (isset($_SESSION['email_customer'])) {
  66. $email = $_SESSION['email_customer'];
  67. }
  68. $object = new ActionsTicket($db);
  69. if (empty($conf->ticket->enabled)) {
  70. accessforbidden('', 0, 0, 1);
  71. }
  72. /*
  73. * Actions
  74. */
  75. if ($cancel) {
  76. if (!empty($backtopage)) {
  77. header("Location: ".$backtopage);
  78. exit;
  79. }
  80. $action = 'view_ticket';
  81. }
  82. if ($action == "view_ticket" || $action == "presend" || $action == "close" || $action == "confirm_public_close" || $action == "add_message") {
  83. $error = 0;
  84. $display_ticket = false;
  85. if (!strlen($track_id)) {
  86. $error++;
  87. array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("TicketTrackId")));
  88. $action = '';
  89. }
  90. if (!strlen($email)) {
  91. $error++;
  92. array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("Email")));
  93. $action = '';
  94. } else {
  95. if (!isValidEmail($email)) {
  96. $error++;
  97. array_push($object->errors, $langs->trans("ErrorEmailInvalid"));
  98. $action = '';
  99. }
  100. }
  101. if (!$error) {
  102. $ret = $object->fetch('', '', $track_id);
  103. if ($ret && $object->dao->id > 0) {
  104. // Check if emails provided is the one of author
  105. $emailofticket = CMailFile::getValidAddress($object->dao->origin_email, 2);
  106. if (strtolower($emailofticket) == strtolower($email)) {
  107. $display_ticket = true;
  108. $_SESSION['email_customer'] = $email;
  109. } else {
  110. // Check if emails provided is inside list of contacts
  111. $contacts = $object->dao->liste_contact(-1, 'external');
  112. foreach ($contacts as $contact) {
  113. if (strtolower($contact['email']) == strtolower($email)) {
  114. $display_ticket = true;
  115. $_SESSION['email_customer'] = $email;
  116. break;
  117. } else {
  118. $display_ticket = false;
  119. }
  120. }
  121. }
  122. // Check email of thirdparty of ticket
  123. if ($object->dao->fk_soc > 0 || $object->dao->socid > 0) {
  124. $object->dao->fetch_thirdparty();
  125. if ($email == $object->dao->thirdparty->email) {
  126. $display_ticket = true;
  127. $_SESSION['email_customer'] = $email;
  128. }
  129. }
  130. // Check if email is email of creator
  131. if ($object->dao->fk_user_create > 0) {
  132. $tmpuser = new User($db);
  133. $tmpuser->fetch($object->dao->fk_user_create);
  134. if (strtolower($email) == strtolower($tmpuser->email)) {
  135. $display_ticket = true;
  136. $_SESSION['email_customer'] = $email;
  137. }
  138. }
  139. // Check if email is email of creator
  140. if ($object->dao->fk_user_assign > 0 && $object->dao->fk_user_assign != $object->dao->fk_user_create) {
  141. $tmpuser = new User($db);
  142. $tmpuser->fetch($object->dao->fk_user_assign);
  143. if (strtolower($email) == strtolower($tmpuser->email)) {
  144. $display_ticket = true;
  145. $_SESSION['email_customer'] = $email;
  146. }
  147. }
  148. } else {
  149. $error++;
  150. array_push($object->errors, $langs->trans("ErrorTicketNotFound", $track_id));
  151. $action = '';
  152. }
  153. }
  154. if (!$error && $action == 'confirm_public_close' && $display_ticket) {
  155. if ($object->dao->close($user)) {
  156. setEventMessages($langs->trans('TicketMarkedAsClosed'), null, 'mesgs');
  157. $url = 'view.php?action=view_ticket&track_id='.GETPOST('track_id', 'alpha').(!empty($entity) && !empty($conf->multicompany->enabled)?'&entity='.$entity:'');
  158. header("Location: ".$url);
  159. exit;
  160. } else {
  161. $action = '';
  162. setEventMessages($object->error, $object->errors, 'errors');
  163. }
  164. }
  165. if (!$error && $action == "add_message" && $display_ticket && GETPOSTISSET('btn_add_message')) {
  166. // TODO Add message...
  167. $ret = $object->dao->newMessage($user, $action, 0, 1);
  168. if (!$error) {
  169. $action = 'view_ticket';
  170. }
  171. }
  172. if ($error || $errors) {
  173. setEventMessages($object->error, $object->errors, 'errors');
  174. if ($action == "add_message") {
  175. $action = 'presend';
  176. } else {
  177. $action = '';
  178. }
  179. }
  180. }
  181. //var_dump($action);
  182. //$object->doActions($action);
  183. // Actions to send emails (for ticket, we need to manage the addfile and removefile only)
  184. $triggersendname = 'TICKET_SENTBYMAIL';
  185. $paramname = 'id';
  186. $autocopy = 'MAIN_MAIL_AUTOCOPY_TICKET_TO'; // used to know the automatic BCC to add
  187. $trackid = 'tic'.$object->id;
  188. include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
  189. /*
  190. * View
  191. */
  192. $form = new Form($db);
  193. $formticket = new FormTicket($db);
  194. if (!$conf->global->TICKET_ENABLE_PUBLIC_INTERFACE) {
  195. print '<div class="error">'.$langs->trans('TicketPublicInterfaceForbidden').'</div>';
  196. $db->close();
  197. exit();
  198. }
  199. $arrayofjs = array();
  200. $arrayofcss = array('/ticket/css/styles.css.php');
  201. llxHeaderTicket($langs->trans("Tickets"), "", 0, 0, $arrayofjs, $arrayofcss);
  202. print '<div class="ticketpublicarea">';
  203. if ($action == "view_ticket" || $action == "presend" || $action == "close" || $action == "confirm_public_close") {
  204. if ($display_ticket) {
  205. // Confirmation close
  206. if ($action == 'close') {
  207. print $form->formconfirm($_SERVER["PHP_SELF"]."?track_id=".$track_id.(!empty($entity) && !empty($conf->multicompany->enabled)?'&entity='.$entity:''), $langs->trans("CloseATicket"), $langs->trans("ConfirmCloseAticket"), "confirm_public_close", '', '', 1);
  208. }
  209. print '<div id="form_view_ticket" class="margintoponly">';
  210. print '<table class="ticketpublictable centpercent tableforfield">';
  211. // Ref
  212. print '<tr><td class="titlefield">'.$langs->trans("Ref").'</td><td>';
  213. print img_picto('', 'ticket', 'class="pictofixedwidth"');
  214. print dol_escape_htmltag($object->dao->ref);
  215. print '</td></tr>';
  216. // Tracking ID
  217. print '<tr><td>'.$langs->trans("TicketTrackId").'</td><td>';
  218. print dol_escape_htmltag($object->dao->track_id);
  219. print '</td></tr>';
  220. // Subject
  221. print '<tr><td>'.$langs->trans("Subject").'</td><td>';
  222. print '<span class="bold">';
  223. print dol_escape_htmltag($object->dao->subject);
  224. print '</span>';
  225. print '</td></tr>';
  226. // Statut
  227. print '<tr><td>'.$langs->trans("Status").'</td><td>';
  228. print $object->dao->getLibStatut(2);
  229. print '</td></tr>';
  230. // Type
  231. print '<tr><td>'.$langs->trans("Type").'</td><td>';
  232. print dol_escape_htmltag($object->dao->type_label);
  233. print '</td></tr>';
  234. // Category
  235. print '<tr><td>'.$langs->trans("Category").'</td><td>';
  236. if ($object->dao->category_label) {
  237. print img_picto('', 'category', 'class="pictofixedwidth"');
  238. print dol_escape_htmltag($object->dao->category_label);
  239. }
  240. print '</td></tr>';
  241. // Severity
  242. print '<tr><td>'.$langs->trans("Severity").'</td><td>';
  243. print dol_escape_htmltag($object->dao->severity_label);
  244. print '</td></tr>';
  245. // Creation date
  246. print '<tr><td>'.$langs->trans("DateCreation").'</td><td>';
  247. print dol_print_date($object->dao->datec, 'dayhour');
  248. print '</td></tr>';
  249. // Author
  250. print '<tr><td>'.$langs->trans("Author").'</td><td>';
  251. if ($object->dao->fk_user_create > 0) {
  252. $langs->load("users");
  253. $fuser = new User($db);
  254. $fuser->fetch($object->dao->fk_user_create);
  255. print img_picto('', 'user', 'class="pictofixedwidth"');
  256. print $fuser->getFullName($langs);
  257. } else {
  258. print img_picto('', 'email', 'class="pictofixedwidth"');
  259. print dol_escape_htmltag($object->dao->origin_email);
  260. }
  261. print '</td></tr>';
  262. // Read date
  263. if (!empty($object->dao->date_read)) {
  264. print '<tr><td>'.$langs->trans("TicketReadOn").'</td><td>';
  265. print dol_print_date($object->dao->date_read, 'dayhour');
  266. print '</td></tr>';
  267. }
  268. // Close date
  269. if (!empty($object->dao->date_close)) {
  270. print '<tr><td>'.$langs->trans("TicketCloseOn").'</td><td>';
  271. print dol_print_date($object->dao->date_close, 'dayhour');
  272. print '</td></tr>';
  273. }
  274. // User assigned
  275. print '<tr><td>'.$langs->trans("AssignedTo").'</td><td>';
  276. if ($object->dao->fk_user_assign > 0) {
  277. $fuser = new User($db);
  278. $fuser->fetch($object->dao->fk_user_assign);
  279. print img_picto('', 'user', 'class="pictofixedwidth"');
  280. print $fuser->getFullName($langs, 1);
  281. }
  282. print '</td></tr>';
  283. // Progression
  284. print '<tr><td>'.$langs->trans("Progression").'</td><td>';
  285. print ($object->dao->progress > 0 ? dol_escape_htmltag($object->dao->progress) : '0').'%';
  286. print '</td></tr>';
  287. print '</table>';
  288. print '</div>';
  289. print '<div style="clear: both; margin-top: 1.5em;"></div>';
  290. if ($action == 'presend') {
  291. print load_fiche_titre($langs->trans('TicketAddMessage'), '', 'conversation');
  292. $formticket = new FormTicket($db);
  293. $formticket->action = "add_message";
  294. $formticket->track_id = $object->dao->track_id;
  295. $formticket->id = $object->dao->id;
  296. $formticket->param = array('track_id' => $object->dao->track_id, 'fk_user_create' => '-1',
  297. 'returnurl' => DOL_URL_ROOT.'/public/ticket/view.php'.(!empty($entity) && !empty($conf->multicompany->enabled)?'?entity='.$entity:''));
  298. $formticket->withfile = 2;
  299. $formticket->withcancel = 1;
  300. $formticket->showMessageForm('100%');
  301. }
  302. if ($action != 'presend') {
  303. print '<form method="post" id="form_view_ticket_list" name="form_view_ticket_list" action="'.DOL_URL_ROOT.'/public/ticket/list.php'.(!empty($entity) && !empty($conf->multicompany->enabled)?'?entity='.$entity:'').'">';
  304. print '<input type="hidden" name="token" value="'.newToken().'">';
  305. print '<input type="hidden" name="action" value="view_ticketlist">';
  306. print '<input type="hidden" name="track_id" value="'.$object->dao->track_id.'">';
  307. print '<input type="hidden" name="email" value="'.$_SESSION['email_customer'].'">';
  308. //print '<input type="hidden" name="search_fk_status" value="non_closed">';
  309. print "</form>\n";
  310. print '<div class="tabsAction">';
  311. // List ticket
  312. print '<div class="inline-block divButAction"><a class="left" style="padding-right: 50px" href="javascript:$(\'#form_view_ticket_list\').submit();">'.$langs->trans('ViewMyTicketList').'</a></div>';
  313. if ($object->dao->fk_statut < Ticket::STATUS_CLOSED) {
  314. // New message
  315. print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=presend&mode=init&track_id='.$object->dao->track_id.(!empty($entity) && !empty($conf->multicompany->enabled)?'&entity='.$entity:'').'">'.$langs->trans('AddMessage').'</a></div>';
  316. // Close ticket
  317. if ($object->dao->fk_statut >= Ticket::STATUS_NOT_READ && $object->dao->fk_statut < Ticket::STATUS_CLOSED) {
  318. print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=close&track_id='.$object->dao->track_id.(!empty($entity) && !empty($conf->multicompany->enabled)?'&entity='.$entity:'').'">'.$langs->trans('CloseTicket').'</a></div>';
  319. }
  320. }
  321. print '</div>';
  322. }
  323. // Message list
  324. print load_fiche_titre($langs->trans('TicketMessagesList'), '', 'conversation');
  325. $object->viewTicketMessages(false, true, $object->dao);
  326. } else {
  327. print '<div class="error">Not Allowed<br><a href="'.$_SERVER['PHP_SELF'].'?track_id='.$object->dao->track_id.(!empty($entity) && !empty($conf->multicompany->enabled)?'?entity='.$entity:'').'" rel="nofollow noopener">'.$langs->trans('Back').'</a></div>';
  328. }
  329. } else {
  330. print '<div class="center opacitymedium margintoponly marginbottomonly">'.$langs->trans("TicketPublicMsgViewLogIn").'</div>';
  331. print '<div id="form_view_ticket">';
  332. print '<form method="post" name="form_view_ticket" action="'.$_SERVER['PHP_SELF'].(!empty($entity) && !empty($conf->multicompany->enabled)?'?entity='.$entity:'').'">';
  333. print '<input type="hidden" name="token" value="'.newToken().'">';
  334. print '<input type="hidden" name="action" value="view_ticket">';
  335. print '<p><label for="track_id" style="display: inline-block; width: 30%; "><span class="fieldrequired">'.$langs->trans("TicketTrackId").'</span></label>';
  336. print '<input size="30" id="track_id" name="track_id" value="'.(GETPOST('track_id', 'alpha') ? GETPOST('track_id', 'alpha') : '').'" />';
  337. print '</p>';
  338. print '<p><label for="email" style="display: inline-block; width: 30%; "><span class="fieldrequired">'.$langs->trans('Email').'</span></label>';
  339. print '<input size="30" id="email" name="email" value="'.(GETPOST('email', 'alpha') ? GETPOST('email', 'alpha') : $_SESSION['customer_email']).'" />';
  340. print '</p>';
  341. print '<p style="text-align: center; margin-top: 1.5em;">';
  342. print '<input type="submit" class="button" name="btn_view_ticket" value="'.$langs->trans('ViewTicket').'" />';
  343. print "</p>\n";
  344. print "</form>\n";
  345. print "</div>\n";
  346. }
  347. print "</div>";
  348. // End of page
  349. htmlPrintOnlinePaymentFooter($mysoc, $langs, 0, $suffix, $object);
  350. llxFooter('', 'public');
  351. $db->close();