dolibarr 22.0.5
create_ticket.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2013-2016 Jean-François FERRY <hello@librethic.io>
3 * Copyright (C) 2016 Christophe Battarel <christophe@altairis.fr>
4 * Copyright (C) 2023 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
6 * Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
28/* We need object $user->default_values
29if (!defined('NOREQUIREUSER')) {
30 define('NOREQUIREUSER', '1');
31}*/
32if (!defined('NOREQUIREMENU')) {
33 define('NOREQUIREMENU', '1');
34}
35if (!defined('NOREQUIREHTML')) {
36 define('NOREQUIREHTML', '1');
37}
38if (!defined('NOLOGIN')) {
39 define("NOLOGIN", 1); // This means this output page does not require to be logged.
40}
41if (!defined('NOIPCHECK')) {
42 define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
43}
44if (!defined('NOBROWSERNOTIF')) {
45 define('NOBROWSERNOTIF', '1');
46}
47
48// For MultiCompany module.
49// Do not use GETPOST here, function is not defined and define must be done before including main.inc.php
50// Because 2 entities can have the same ref.
51$entity = (!empty($_GET['entity']) ? (int) $_GET['entity'] : (!empty($_POST['entity']) ? (int) $_POST['entity'] : 1));
52if (is_numeric($entity)) {
53 define("DOLENTITY", $entity);
54}
55
56// Load Dolibarr environment
57require '../../main.inc.php';
58require_once DOL_DOCUMENT_ROOT.'/ticket/class/actions_ticket.class.php';
59require_once DOL_DOCUMENT_ROOT.'/core/class/html.formticket.class.php';
60require_once DOL_DOCUMENT_ROOT.'/core/lib/ticket.lib.php';
61require_once DOL_DOCUMENT_ROOT.'/core/lib/security.lib.php';
62require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
63require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
64require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
65require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
66require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
67require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
68
77// Load translation files required by the page
78$langs->loadLangs(array('companies', 'other', 'mails', 'ticket'));
79
80// Get parameters
81$id = GETPOSTINT('id');
82$msg_id = GETPOSTINT('msg_id');
83$socid = GETPOSTINT('socid');
84$suffix = "";
85
86$action = GETPOST('action', 'aZ09');
87$cancel = GETPOST('cancel');
88
89
90$backtopage = '';
91
92// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
93$hookmanager->initHooks(array('publicnewticketcard', 'globalcard'));
94
95$object = new Ticket($db);
96$extrafields = new ExtraFields($db);
97$contacts = array();
98$with_contact = null;
99if (getDolGlobalInt('TICKET_CREATE_THIRD_PARTY_WITH_CONTACT_IF_NOT_EXIST')) {
100 $with_contact = new Contact($db);
101}
102
103$extrafields->fetch_name_optionals_label($object->table_element);
104
105if (!isModEnabled('ticket')) {
106 httponly_accessforbidden('Module Ticket not enabled');
107}
108
109
110/*
111 * Actions
112 */
113
114$parameters = array(
115 'id' => $id,
116);
117// Note that $action and $object may have been modified by some hooks
118$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action);
119if ($reshook < 0) {
120 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
121}
122// Add file in email form
123if (empty($reshook)) {
124 if ($cancel) {
125 $backtopage = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', DOL_URL_ROOT.'/public/ticket/');
126
127 header("Location: ".$backtopage);
128 exit;
129 }
130
131 if (GETPOST('addfile', 'alpha') && !GETPOST('save', 'alpha')) {
132 include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
133
134 // Set tmp directory
135 // TODO Use a dedicated directory for temporary emails files
136 $vardir = $conf->ticket->dir_output;
137 $upload_dir_tmp = $vardir.'/temp/'.session_id();
138 if (!dol_is_dir($upload_dir_tmp)) {
139 dol_mkdir($upload_dir_tmp);
140 }
141
142 dol_add_file_process($upload_dir_tmp, 0, 0, 'addedfile', '', null, '', 0);
143 $action = 'create_ticket';
144 }
145
146 // Remove file
147 if (GETPOST('removedfile', 'alpha') && !GETPOST('save', 'alpha')) {
148 include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
149
150 // Set tmp directory
151 // TODO Use a dedicated directory for temporary emails files
152 $vardir = $conf->ticket->dir_output.'/';
153 $upload_dir_tmp = $vardir.'/temp/'.session_id();
154
155 // TODO Delete only files that was uploaded from form
156 dol_remove_file_process(GETPOSTINT('removedfile'), 0, 0);
157 $action = 'create_ticket';
158 }
159
160 if ($action == 'create_ticket' && GETPOST('save', 'alpha')) { // Test on permission not required. This is a public form. Security is managed by mitigation.
161 $error = 0;
162 $cid = -1;
163 $origin_email = GETPOST('email', 'email');
164 if (empty($origin_email)) {
165 $error++;
166 array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("Email")));
167 $action = '';
168 } else {
169 // Search company saved with email
170 $searched_companies = $object->searchSocidByEmail($origin_email, 0);
171
172 // Chercher un contact existent avec cette address email
173 // Le premier contact trouvé est utilisé pour déterminer le contact suivi
174 $contacts = $object->searchContactByEmail($origin_email);
175 if (!is_array($contacts)) {
176 $contacts = array();
177 }
178
179 // Ensure that contact is active and select first active contact
180 foreach ($contacts as $key => $contact) {
181 if ((int) $contact->statut == 1) {
182 $cid = $key;
183 break;
184 }
185 }
186
187 // Option to require email exists to create ticket
188 if (getDolGlobalInt('TICKET_EMAIL_MUST_EXISTS') && ($cid < 0 || empty($contacts[$cid]->socid))) {
189 $error++;
190 array_push($object->errors, $langs->trans("ErrorEmailMustExistToCreateTicket"));
191 $action = '';
192 }
193 }
194
195 $contact_lastname = '';
196 $contact_firstname = '';
197 $company_name = '';
198 $contact_phone = '';
199 if ($with_contact) {
200 // set linked contact to add in form
201 if (/* is_array($contacts) && */ count($contacts) == 1) {
202 $with_contact = current($contacts);
203 }
204
205 // check mandatory fields on contact
206 $contact_lastname = trim(GETPOST('contact_lastname', 'alphanohtml'));
207 $contact_firstname = trim(GETPOST('contact_firstname', 'alphanohtml'));
208 $company_name = trim(GETPOST('company_name', 'alphanohtml'));
209 $contact_phone = trim(GETPOST('contact_phone', 'alphanohtml'));
210 if (!($with_contact->id > 0)) {
211 // check lastname
212 if (empty($contact_lastname)) {
213 $error++;
214 array_push($object->errors, $langs->trans('ErrorFieldRequired', $langs->transnoentities('Lastname')));
215 $action = '';
216 }
217 // check firstname
218 if (empty($contact_firstname)) {
219 $error++;
220 array_push($object->errors, $langs->trans('ErrorFieldRequired', $langs->transnoentities('Firstname')));
221 $action = '';
222 }
223 }
224 }
225
226
227 $fieldsToCheck = [
228 'type_code' => ['check' => 'alpha', 'langs' => 'TicketTypeRequest'],
229 'category_code' => ['check' => 'alpha', 'langs' => 'TicketCategory'],
230 'severity_code' => ['check' => 'alpha', 'langs' => 'TicketSeverity'],
231 'subject' => ['check' => 'alphanohtml', 'langs' => 'Subject'],
232 'message' => ['check' => 'restricthtml', 'langs' => 'Message']
233 ];
234
235 FormTicket::checkRequiredFields($fieldsToCheck, $error);
236
237 // Check email address
238 if (!empty($origin_email) && !isValidEmail($origin_email)) {
239 $error++;
240 array_push($object->errors, $langs->trans("ErrorBadEmailAddress", $langs->transnoentities("Email")));
241 $action = '';
242 }
243
244 // Check Captcha code if is enabled
245 if (getDolGlobalInt('MAIN_SECURITY_ENABLECAPTCHA_TICKET')) {
246 $sessionkey = 'dol_antispam_value';
247 $ok = (array_key_exists($sessionkey, $_SESSION) && (strtolower($_SESSION[$sessionkey]) === strtolower(GETPOST('code', 'restricthtml'))));
248 if (!$ok) {
249 $error++;
250 array_push($object->errors, $langs->trans("ErrorBadValueForCode"));
251 $action = '';
252 }
253 }
254
255 if (!$error) {
256 $object->type_code = GETPOST("type_code", 'aZ09');
257 $object->category_code = GETPOST("category_code", 'aZ09');
258 $object->severity_code = GETPOST("severity_code", 'aZ09');
259 $object->ip = getUserRemoteIP();
260
261 $nb_post_max = getDolGlobalInt("MAIN_SECURITY_MAX_POST_ON_PUBLIC_PAGES_BY_IP_ADDRESS", 200);
262 $now = dol_now();
263 $minmonthpost = dol_time_plus_duree($now, -1, "m");
264
265 // Calculate nb of post for IP
266 $nb_post_ip = 0;
267 if ($nb_post_max > 0) { // Calculate only if there is a limit to check
268 $sql = "SELECT COUNT(ref) as nb_tickets";
269 $sql .= " FROM ".MAIN_DB_PREFIX."ticket";
270 $sql .= " WHERE ip = '".$db->escape($object->ip)."'";
271 $sql .= " AND datec > '".$db->idate($minmonthpost)."'";
272 $resql = $db->query($sql);
273 if ($resql) {
274 $num = $db->num_rows($resql);
275 $i = 0;
276 while ($i < $num) {
277 $i++;
278 $obj = $db->fetch_object($resql);
279 $nb_post_ip = $obj->nb_tickets;
280 }
281 }
282 }
283
284 $object->track_id = generate_random_id(16);
285
286 $object->db->begin();
287
288 $object->subject = GETPOST("subject", "alphanohtml");
289 $object->message = GETPOST("message", "restricthtml");
290 $object->origin_email = $origin_email;
291 $object->email_from = $origin_email;
292
293 $object->type_code = GETPOST("type_code", 'aZ09');
294 $object->category_code = GETPOST("category_code", 'aZ09');
295 $object->severity_code = GETPOST("severity_code", 'aZ09');
296
297 if (!is_object($user)) {
298 $user = new User($db);
299 }
300
301 // create third-party with contact
302 $usertoassign = 0;
303 if ($with_contact && !($with_contact->id > 0)) {
304 $company = new Societe($db);
305 if (!empty($company_name)) {
306 $company->name = $company_name;
307 } else {
308 $company->particulier = 1;
309 $company->name = dolGetFirstLastname($contact_firstname, $contact_lastname);
310 }
311 $result = $company->create($user);
312 if ($result < 0) {
313 $error++;
314 $errors = ($company->error ? array($company->error) : $company->errors);
315 $object->errors = array_merge($object->errors, $errors);
316 $action = 'create_ticket';
317 }
318
319 // create contact and link to this new company
320 if (!$error) {
321 $with_contact->email = $origin_email;
322 $with_contact->lastname = $contact_lastname;
323 $with_contact->firstname = $contact_firstname;
324 $with_contact->socid = $company->id;
325 $with_contact->phone_pro = $contact_phone;
326 $result = $with_contact->create($user);
327 if ($result < 0) {
328 $error++;
329 $errors = ($with_contact->error ? array($with_contact->error) : $with_contact->errors);
330 $object->errors = array_merge($object->errors, $errors);
331 $action = 'create_ticket';
332 } else {
333 $contacts = array($with_contact);
334 }
335 }
336 }
337
338 if (!empty($searched_companies) && is_array($searched_companies)) {
339 $object->fk_soc = $searched_companies[0]->id;
340 }
341
342 if (/* is_array($contacts) && */ count($contacts) > 0 && $cid >= 0) {
343 $object->fk_soc = $contacts[$cid]->socid;
344 $usertoassign = $contacts[$cid]->id;
345 }
346
347 $ret = $extrafields->setOptionalsFromPost(null, $object);
348
349 // Generate new ref
350 $object->ref = $object->getDefaultRef();
351
352 $object->context['disableticketemail'] = 1; // Disable emails sent by ticket trigger when creation is done from this page, emails are already sent later
353 $object->context['contactid'] = GETPOSTINT('contactid'); // Disable emails sent by ticket trigger when creation is done from this page, emails are already sent later
354
355 $object->context['createdfrompublicinterface'] = 1; // To make a difference between a ticket created from the public interface and a ticket directly created from dolibarr
356
357 if ($nb_post_max > 0 && $nb_post_ip >= $nb_post_max) {
358 $error++;
359 array_push($object->errors, $langs->trans("AlreadyTooMuchPostOnThisIPAdress"));
360 $action = 'create_ticket';
361 }
362
363 if (!$error) {
364 // Creation of the ticket
365 $id = $object->create($user);
366 if ($id <= 0) {
367 $error++;
368 $errors = ($object->error ? array($object->error) : $object->errors);
369 if ($object->error) {
370 array_push($object->errors, $object->error);
371 }
372 $action = 'create_ticket';
373 }
374 }
375
376 if (!$error && $id > 0) {
377 if ($usertoassign > 0) {
378 $object->add_contact($usertoassign, "SUPPORTCLI", 'external', 0);
379 }
380
381 if (!$error) {
382 $object->db->commit();
383 $action = "infos_success";
384 } else {
385 $object->db->rollback();
386 setEventMessages($object->error, $object->errors, 'errors');
387 $action = 'create_ticket';
388 }
389
390 if (!$error) {
391 $res = $object->fetch($id);
392 if ($res) {
393 // Create form object
394 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
395 include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
396 $formmail = new FormMail($db);
397
398 // Init to avoid errors
399 $filepath = array();
400 $filename = array();
401 $mimetype = array();
402
403 $attachedfiles = $formmail->get_attached_files();
404 $filepath = $attachedfiles['paths'];
405 $filename = $attachedfiles['names'];
406 $mimetype = $attachedfiles['mimes'];
407
408 // Send email to customer
409 $appli = $mysoc->name;
410
411 $subject = '['.$appli.'] '.$langs->transnoentities('TicketNewEmailSubject', $object->ref, $object->track_id);
412 $message = (getDolGlobalString('TICKET_MESSAGE_MAIL_NEW') !== '' ? getDolGlobalString('TICKET_MESSAGE_MAIL_NEW') : $langs->transnoentities('TicketNewEmailBody')).'<br><br>';
413 $message .= $langs->transnoentities('TicketNewEmailBodyInfosTicket').'<br>';
414
415 $url_public_ticket = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', dol_buildpath('/public/ticket/', 2)).'view.php?track_id='.$object->track_id;
416 $infos_new_ticket = $langs->transnoentities('TicketNewEmailBodyInfosTrackId', '<a href="'.$url_public_ticket.'" rel="nofollow noopener">'.$object->track_id.'</a>').'<br>';
417 $infos_new_ticket .= $langs->transnoentities('TicketNewEmailBodyInfosTrackUrl').'<br><br>';
418
419 $message .= $infos_new_ticket;
420 $message .= getDolGlobalString('TICKET_MESSAGE_MAIL_SIGNATURE', $langs->transnoentities('TicketMessageMailSignatureText', $mysoc->name));
421
422 $sendto = GETPOST('email', 'alpha');
423
424 $from = getDolGlobalString('MAIN_INFO_SOCIETE_NOM') . ' <'.getDolGlobalString('TICKET_NOTIFICATION_EMAIL_FROM').'>';
425 $replyto = $from;
426 $sendtocc = '';
427 $deliveryreceipt = 0;
428
429 $old_MAIN_MAIL_AUTOCOPY_TO = getDolGlobalString('TICKET_DISABLE_MAIL_AUTOCOPY_TO');
430 if ($old_MAIN_MAIL_AUTOCOPY_TO !== '') {
431 $conf->global->MAIN_MAIL_AUTOCOPY_TO = '';
432 }
433 include_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
434 $mailfile = new CMailFile($subject, $sendto, $from, $message, $filepath, $mimetype, $filename, $sendtocc, '', $deliveryreceipt, -1, '', '', 'tic'.$object->id, '', 'ticket');
435 if ($mailfile->error || !empty($mailfile->errors)) {
436 setEventMessages($mailfile->error, $mailfile->errors, 'errors');
437 } else {
438 $result = $mailfile->sendfile();
439 }
440 if ($old_MAIN_MAIL_AUTOCOPY_TO !== '') {
441 $conf->global->MAIN_MAIL_AUTOCOPY_TO = $old_MAIN_MAIL_AUTOCOPY_TO;
442 }
443
444 // Send email to TICKET_NOTIFICATION_EMAIL_TO
445 $sendto = getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO');
446 if ($sendto) {
447 $appli = $mysoc->name;
448
449 $subject = '['.$appli.'] '.$langs->transnoentities('TicketNewEmailSubjectAdmin', $object->ref, $object->track_id);
450 $message_admin = $langs->transnoentities('TicketNewEmailBodyAdmin', $object->track_id).'<br><br>';
451 $message_admin .= '<ul><li>'.$langs->trans('Title').' : '.$object->subject.'</li>';
452 $message_admin .= '<li>'.$langs->trans('Type').' : '.$object->type_label.'</li>';
453 $message_admin .= '<li>'.$langs->trans('Category').' : '.$object->category_label.'</li>';
454 $message_admin .= '<li>'.$langs->trans('Severity').' : '.$object->severity_label.'</li>';
455 $message_admin .= '<li>'.$langs->trans('From').' : '.$object->origin_email.'</li>';
456 // Extrafields
457 $extrafields->fetch_name_optionals_label($object->table_element);
458 if (is_array($object->array_options) && count($object->array_options) > 0) {
459 foreach ($object->array_options as $key => $value) {
460 $key = substr($key, 8); // remove "options_"
461 $message_admin .= '<li>'.$langs->trans($extrafields->attributes[$object->table_element]['label'][$key]).' : '.$extrafields->showOutputField($key, $value, '', $object->table_element).'</li>';
462 }
463 }
464 $message_admin .= '</ul>';
465
466 $message_admin .= '<p>'.$langs->trans('Message').' : <br>'.$object->message.'</p>';
467 $message_admin .= '<p><a href="'.dol_buildpath('/ticket/card.php', 2).'?track_id='.$object->track_id.'" rel="nofollow noopener">'.$langs->trans('SeeThisTicketIntomanagementInterface').'</a></p>';
468
469 $from = getDolGlobalString('MAIN_INFO_SOCIETE_NOM') . ' <' . getDolGlobalString('TICKET_NOTIFICATION_EMAIL_FROM').'>';
470 $replyto = $from;
471
472 $old_MAIN_MAIL_AUTOCOPY_TO = getDolGlobalString('TICKET_DISABLE_MAIL_AUTOCOPY_TO');
473 if ($old_MAIN_MAIL_AUTOCOPY_TO !== '') {
474 $conf->global->MAIN_MAIL_AUTOCOPY_TO = '';
475 }
476 include_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
477 $mailfile = new CMailFile($subject, $sendto, $from, $message_admin, $filepath, $mimetype, $filename, $sendtocc, '', $deliveryreceipt, -1, '', '', 'tic'.$object->id, '', 'ticket');
478 if ($mailfile->error || !empty($mailfile->errors)) {
479 setEventMessages($mailfile->error, $mailfile->errors, 'errors');
480 } else {
481 $result = $mailfile->sendfile();
482 }
483 if ($old_MAIN_MAIL_AUTOCOPY_TO !== '') {
484 $conf->global->MAIN_MAIL_AUTOCOPY_TO = $old_MAIN_MAIL_AUTOCOPY_TO;
485 }
486 }
487 }
488
489 // Copy files into ticket directory
490 $object->copyFilesForTicket('');
491
492 //setEventMessages($langs->trans('YourTicketSuccessfullySaved'), null, 'mesgs');
493
494 // Make a redirect to avoid to have ticket submitted twice if we make back
495 $messagetoshow = $langs->trans('MesgInfosPublicTicketCreatedWithTrackId', '{s1}', '{s2}');
496 $messagetoshow = str_replace(array('{s1}', '{s2}'), array('<strong>'.$object->track_id.'</strong>', '<strong>'.$object->ref.'</strong>'), $messagetoshow);
497 setEventMessages($messagetoshow, null, 'warnings');
498 setEventMessages($langs->trans('PleaseRememberThisId'), null, 'warnings');
499
500 header("Location: index.php".(!empty($entity) && isModEnabled('multicompany') ? '?entity='.$entity : ''));
501 exit;
502 }
503 } else {
504 setEventMessages($object->error, $object->errors, 'errors');
505 }
506 }
507 }
508}
509if (!empty($object->errors) || !empty($object->error)) {
510 setEventMessages($object->error, $object->errors, 'errors');
511}
512
513
514/*
515 * View
516 */
517
518$form = new Form($db);
519$formticket = new FormTicket($db);
520
521if (!getDolGlobalInt('TICKET_ENABLE_PUBLIC_INTERFACE')) {
522 print '<div class="error">'.$langs->trans('TicketPublicInterfaceForbidden').'</div>';
523 $db->close();
524 exit();
525}
526
527$arrayofjs = array();
528
529$arrayofcss = array(getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', '/public/ticket/').'css/styles.css.php');
530
531llxHeaderTicket($langs->trans("CreateTicket"), "", 0, 0, $arrayofjs, $arrayofcss);
532
533
534print '<div class="ticketpublicarea ticketlargemargin">';
535
536if ($action != "infos_success") {
537 $formticket->withfromsocid = isset($socid) ? $socid : $user->socid;
538 $formticket->withtitletopic = 1;
539 $formticket->withcompany = 0;
540 $formticket->withusercreate = 1;
541 $formticket->fk_user_create = 0;
542 $formticket->withemail = 1;
543 $formticket->ispublic = 1;
544 $formticket->withfile = 2;
545 $formticket->action = 'create_ticket';
546 $formticket->withcancel = 1;
547
548 $formticket->param = array('returnurl' => $_SERVER['PHP_SELF'].($conf->entity > 1 ? '?entity='.$conf->entity : ''));
549
550 print load_fiche_titre($langs->trans('NewTicket'), '', '', 0, '', 'marginleftonly');
551
552 if (!getDolGlobalString('TICKET_NOTIFICATION_EMAIL_FROM')) {
553 $langs->load("errors");
554 print '<div class="error">';
555 print $langs->trans("ErrorFieldRequired", $langs->transnoentities("TicketEmailNotificationFrom")).'<br>';
556 print $langs->trans("ErrorModuleSetupNotComplete", $langs->transnoentities("Ticket"));
557 print '</div>';
558 } else {
559 //print '<div class="info marginleftonly marginrightonly">'.$langs->trans('TicketPublicInfoCreateTicket').'</div>';
560 $formticket->showForm(0, ($action ? $action : 'create'), 1, $with_contact, '', $object);
561 }
562}
563
564print '</div>';
565
566print '<br>';
567
568if (getDolGlobalInt('TICKET_SHOW_COMPANY_FOOTER')) {
569 // End of page
570 htmlPrintOnlineFooter($mysoc, $langs, 0, $suffix, $object);
571}
572
573llxFooter('', 'public');
574
575$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:48
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:67
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
Class to send emails (with attachments or not) Usage: $mailfile = new CMailFile($subject,...
Class to manage contact/addresses.
Class to manage standard extra fields.
Class to manage generation of HTML components Only common components must be here.
Class permettant la generation du formulaire html d'envoi de mail unitaire Usage: $formail = new Form...
static checkRequiredFields(array $fields, int &$errors)
Check required fields.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
htmlPrintOnlineFooter($fromcompany, $langs, $addformmessage=0, $suffix='', $object=null)
Show footer of company in HTML public pages.
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
Definition date.lib.php:125
dol_add_file_process($upload_dir, $allowoverwrite=0, $updatesessionordb=0, $keyforsourcefile='addedfile', $savingdocmask='', $link=null, $trackid='', $generatethumbs=1, $object=null, $forceFullTextIndexation='', $mode=0)
Get and save an upload file (for example after submitting a new file in a mail form).
dol_remove_file_process($filenb, $donotupdatesession=0, $donotdeletefile=1, $trackid='')
Remove an uploaded file (for example after submitting a new file a mail form).
dol_is_dir($folder)
Test if filename is a directory.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dolGetFirstLastname($firstname, $lastname, $nameorder=-1)
Return firstname and lastname in correct order.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
getUserRemoteIP($trusted=0)
Return the real IP of remote user.
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Definition member.php:79
Class to generate the form for creating a new ticket.
httponly_accessforbidden($message='1', $http_response_code=403, $stringalreadysanitized=0)
Show a message to say access is forbidden and stop program.
generate_random_id($car=16)
Generate a random id.
llxHeaderTicket($title, $head="", $disablejs=0, $disablehead=0, $arrayofjs=[], $arrayofcss=[])
Show http header, open body tag and show HTML header banner for public pages for tickets.