dolibarr 24.0.2
attendee_new.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2021 Dorian Vabre <dorian.vabre@gmail.com>
3 * Copyright (C) 2023 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
5 * Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (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 General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
27if (!defined('NOLOGIN')) {
28 define("NOLOGIN", 1); // This means this output page does not require to be logged.
29}
30if (!defined('NOCSRFCHECK')) {
31 define("NOCSRFCHECK", 1); // We accept to go on this page from external web site.
32}
33if (!defined('NOIPCHECK')) {
34 define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
35}
36if (!defined('NOBROWSERNOTIF')) {
37 define('NOBROWSERNOTIF', '1');
38}
39if (!defined('NOIPCHECK')) {
40 define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
41}
42
43
44// For MultiCompany module.
45// Do not use GETPOST here, function is not defined and define must be done before including main.inc.php
46// Because 2 entities can have the same ref
47$entity = (!empty($_GET['entity']) ? (int) $_GET['entity'] : (!empty($_POST['entity']) ? (int) $_POST['entity'] : 1));
48if (is_numeric($entity)) {
49 define("DOLENTITY", $entity);
50}
51
52// Load Dolibarr environment
53require '../../main.inc.php';
54require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
55require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
56require_once DOL_DOCUMENT_ROOT.'/eventorganization/class/conferenceorbooth.class.php';
57require_once DOL_DOCUMENT_ROOT.'/eventorganization/class/conferenceorboothattendee.class.php';
58require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
59require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
60require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/paymentterm.class.php';
61require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
62require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
63require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
64
66
78// Init vars
79$errmsg = '';
80$errors = array();
81$error = 0;
82$backtopage = GETPOST('backtopage', 'alpha');
83$action = GETPOST('action', 'aZ09');
84
85$email = GETPOST("email");
86$societe = GETPOST("societe");
87$emailcompany = GETPOST("emailcompany");
88$note_public = GETPOST('note_public', "restricthtml");
89$firstname = GETPOST('firstname');
90$lastname = GETPOST('lastname');
91
92// Getting id from Post and decoding it
93$type = GETPOST('type', 'aZ09');
94if ($type == 'conf') {
95 $id = GETPOSTINT('id');
96} else {
97 $id = GETPOSTINT('fk_project') ? GETPOSTINT('fk_project') : GETPOSTINT('id');
98}
99
100$conference = new ConferenceOrBooth($db);
101$confattendee = new ConferenceOrBoothAttendee($db);
102$project = new Project($db);
103$object = $confattendee;
104
105if ($type == 'conf') {
106 $resultconf = $conference->fetch($id);
107 if ($resultconf < 0) {
108 print 'Bad value for parameter id';
109 exit;
110 }
111 $resultproject = $project->fetch($conference->fk_project);
112 if ($resultproject < 0) {
113 $error++;
114 $errmsg .= $project->error;
115 $errors = array_merge($errors, $project->errors);
116 }
117}
118
119$currentnbofattendees = 0;
120if ($type == 'global') {
121 $resultproject = $project->fetch($id);
122 if ($resultproject < 0) {
123 $error++;
124 $errmsg .= $project->error;
125 $errors = array_merge($errors, $project->errors);
126 } else {
127 $sql = "SELECT COUNT(*) as nb FROM ".MAIN_DB_PREFIX."eventorganization_conferenceorboothattendee";
128 $sql .= " WHERE fk_project = ".((int) $project->id);
129 $sql .= " AND status IN (0, 1)";
130
131 $resql = $db->query($sql);
132 if ($resql) {
133 $obj = $db->fetch_object($resql);
134 if ($obj) {
135 $currentnbofattendees = $obj->nb;
136 } else {
138 }
139 }
140 }
141}
142
143// Security check
144$securekeyreceived = GETPOST('securekey', 'alpha');
145$securekeytocompare = dol_hash(getDolGlobalString('EVENTORGANIZATION_SECUREKEY').'conferenceorbooth'.((int) $id), 'md5');
146
147// We check if the securekey collected is OK
148if (!hash_equals($securekeytocompare, $securekeyreceived)) {
149 print $langs->trans('MissingOrBadSecureKey');
150 exit;
151}
152
153// Load translation files
154$langs->loadLangs(array("main", "companies", "install", "other", "eventorganization"));
155
156// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
157$hookmanager->initHooks(array('publicnewmembercard', 'globalcard'));
158
159$extrafields = new ExtraFields($db);
160
161$user->loadDefaultValues();
162
163// Security check
164if (empty($conf->eventorganization->enabled)) {
165 httponly_accessforbidden('Module Event organization not enabled');
166}
167
168$extrafields->fetch_name_optionals_label($object->table_element); // fetch optionals attributes and labels
169
170
185function llxHeaderVierge($title, $head = "", $disablejs = 0, $disablehead = 0, $arrayofjs = [], $arrayofcss = [], $ws = '') // @phan-suppress-current-line PhanRedefineFunction
186{
187 global $conf, $langs, $mysoc;
188
189 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss); // Show html headers
190
191 print '<body id="mainbody" class="publicnewmemberform">';
192
193 // Define urllogo
194 $urllogo = DOL_URL_ROOT.'/theme/common/login_logo.png';
195
196 if (!empty($mysoc->logo_small) && is_readable($conf->mycompany->dir_output.'/logos/thumbs/'.$mysoc->logo_small)) {
197 $urllogo = DOL_URL_ROOT.'/viewimage.php?cache=1&amp;modulepart=mycompany&amp;file='.urlencode('logos/thumbs/'.$mysoc->logo_small);
198 } elseif (!empty($mysoc->logo) && is_readable($conf->mycompany->dir_output.'/logos/'.$mysoc->logo)) {
199 $urllogo = DOL_URL_ROOT.'/viewimage.php?cache=1&amp;modulepart=mycompany&amp;file='.urlencode('logos/'.$mysoc->logo);
200 } elseif (is_readable(DOL_DOCUMENT_ROOT.'/theme/dolibarr_logo.svg')) {
201 $urllogo = DOL_URL_ROOT.'/theme/dolibarr_logo.svg';
202 }
203
204 print '<div class="center">';
205 // Output html code for logo
206 if ($urllogo) {
207 print '<div class="backgreypublicpayment">';
208 print '<div class="logopublicpayment">';
209 print '<img id="dolpaymentlogo" src="'.$urllogo.'"';
210 print '>';
211 print '</div>';
212 if (!getDolGlobalString('MAIN_HIDE_POWERED_BY')) {
213 print '<div class="poweredbypublicpayment opacitymedium right"><a class="poweredbyhref" href="https://www.dolibarr.org?utm_medium=website&utm_source=poweredby" target="dolibarr" rel="noopener">'.$langs->trans("PoweredBy").'<br><img class="poweredbyimg" src="'.DOL_URL_ROOT.'/theme/dolibarr_logo.svg" width="80px"></a></div>';
214 }
215 print '</div>';
216 }
217
218 if (getDolGlobalString('EVENTORGANIZATION_IMAGE_PUBLIC_INTERFACE')) {
219 print '<div class="backimagepubliceventorganizationsubscription">';
220 print '<img id="idEVENTORGANIZATION_IMAGE_PUBLIC_INTERFACE" src="' . getDolGlobalString('EVENTORGANIZATION_IMAGE_PUBLIC_INTERFACE').'">';
221 print '</div>';
222 }
223
224 print '</div>';
225
226 print '<div class="divmainbodylarge">';
227}
228
236function llxFooterVierge() // @phan-suppress-current-line PhanRedefineFunction
237{
238 print '</div>';
239
240 printCommonFooter('public');
241
242 print "</body>\n";
243 print "</html>\n";
244}
245
246
247
248/*
249 * Actions
250 */
251
252$parameters = array();
253// Note that $action and $object may have been modified by some hooks
254$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action);
255if ($reshook < 0) {
256 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
257}
258
259// Action called when page is submitted
260if (empty($reshook) && $action == 'add' && (!empty($conference->id) && $conference->status == 2 || !empty($project->id) && $project->status == Project::STATUS_VALIDATED)) { // Test on permission not required. Check are done on securitykey and mitigation
261 $error = 0;
262
263 $urlback = '';
264
265 $db->begin();
266
267 if (!GETPOST("email")) {
268 $error++;
269 $errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Email"))."<br>\n";
270 }
271 // If the price has been set, name is required for the invoice
272 if (!GETPOST("societe") && !empty((float) $project->price_registration)) {
273 $error++;
274 $errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Company"))."<br>\n";
275 }
276 if (GETPOST("email") && !isValidEmail(GETPOST("email"))) {
277 $error++;
278 $langs->load("errors");
279 $errmsg .= $langs->trans("ErrorBadEMail", GETPOST("email"))."<br>\n";
280 }
281 if (!GETPOST("country_id")) {
282 $error++;
283 $errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Country"))."<br>\n";
284 }
285
286 $thirdparty = null;
287
288 if (!$error) {
289 // Check if attendee already exists (by email and for this event)
290 $filter = array();
291
292 if ($type == 'global') {
293 $filter = "(t.fk_project:=:".((int) $id).") AND (t.email:=:'".$db->escape($email)."')";
294 }
295 if ($type == 'conf') {
296 $filter = "(t.fk_actioncomm:=:".((int) $id).") AND (t.email:=:'".$db->escape($email)."')";
297 }
298
299 // Check if there is already an attendee into table eventorganization_conferenceorboothattendee for same event (or conference/booth)
300 $resultfetchconfattendee = $confattendee->fetchAll('', '', 0, 0, $filter);
301
302 $attendeealreadyexists = false;
303 if ($resultfetchconfattendee < 0) {
304 $error++;
305 $errmsg .= $confattendee->error;
306 $errors = array_merge($errors, $confattendee->errors);
307 } elseif (is_array($resultfetchconfattendee) && count($resultfetchconfattendee) > 0) {
308 // Found confattendee
309 $confattendee = array_shift($resultfetchconfattendee);
310 $attendeealreadyexists = true;
311 } else {
312 // Need to create a confattendee
313 $confattendee->date_creation = dol_now();
314 }
315
316 // An unpaid registration can be submitted again to update attendee details
317 // and extrafields. A paid registration remains immutable here.
318 if (!$error && (!$attendeealreadyexists || empty((float) $confattendee->amount))) {
319 $confattendee->date_subscription = dol_now();
320 $confattendee->email = $email;
321 $confattendee->fk_project = $project->id;
322 $confattendee->fk_actioncomm = $id;
323 $confattendee->note_public = $note_public;
324 $confattendee->firstname = $firstname;
325 $confattendee->lastname = $lastname;
326
327 // Fill array 'array_options' with data from add form
328 $extrafields->fetch_name_optionals_label($confattendee->table_element);
329 $ret = $extrafields->setOptionalsFromPost(null, $confattendee);
330 if ($ret < 0) {
331 $error++;
332 $errmsg .= $confattendee->error;
333 }
334
335 if (!$error && $attendeealreadyexists) {
336 $resultconfattendee = $confattendee->update($user);
337 if ($resultconfattendee < 0) {
338 $error++;
339 $errmsg .= $confattendee->error;
340 $errors = array_merge($errors, $confattendee->errors);
341 }
342 }
343 }
344
345 if (!$error && !$attendeealreadyexists) {
346 // Count recent already posted event
347 $confattendee->ip = getUserRemoteIP();
348 $nb_post_max = getDolGlobalInt("MAIN_SECURITY_MAX_POST_ON_PUBLIC_PAGES_BY_IP_ADDRESS", 200);
349 $now = dol_now();
350 $minmonthpost = dol_time_plus_duree($now, -1, "m");
351 // Calculate nb of post for IP
352 $nb_post_ip = 0;
353 if ($nb_post_max > 0) { // Calculate only if there is a limit to check
354 $sql = "SELECT COUNT(ref) as nb_attendee";
355 $sql .= " FROM ".MAIN_DB_PREFIX."eventorganization_conferenceorboothattendee";
356 $sql .= " WHERE ip = '".$db->escape($confattendee->ip)."'";
357 $sql .= " AND date_creation > '".$db->idate($minmonthpost)."'";
358 $resql = $db->query($sql);
359 if ($resql) {
360 $num = $db->num_rows($resql);
361 $i = 0;
362 while ($i < $num) {
363 $i++;
364 $obj = $db->fetch_object($resql);
365 $nb_post_ip = $obj->nb_attendee;
366 }
367 }
368 }
369
370 $resultconfattendee = -1;
371
372 if ($nb_post_max > 0 && $nb_post_ip >= $nb_post_max) {
373 $error++;
374 $errmsg .= $langs->trans("AlreadyTooMuchPostOnThisIPAdress");
375 array_push($confattendee->errors, $langs->trans("AlreadyTooMuchPostOnThisIPAdress"));
376 setEventMessage($errmsg, 'errors');
377 } else {
378 $resultconfattendee = $confattendee->create($user);
379 }
380 if ($resultconfattendee < 0) {
381 $error++;
382 $errmsg .= $confattendee->error;
383 $errors = array_merge($errors, $confattendee->errors);
384 }
385 }
386
387 // At this point, we have an existing $confattendee. It may not be linked to a thirdparty.
388 //var_dump($confattendee);
389
390 // If the registration has already been paid for this attendee
391 if (!$error && !empty($confattendee->date_subscription) && !empty((float) $confattendee->amount)) {
392 $securekeyurl = dol_hash(getDolGlobalString('EVENTORGANIZATION_SECUREKEY') . 'conferenceorbooth'.((int) $id), 'md5');
393 $redirection = $dolibarr_main_url_root.'/public/eventorganization/subscriptionok.php?id='.((int) $id).'&securekey='.urlencode($securekeyurl);
394
395 $mesg = $langs->trans("RegistrationAndPaymentWereAlreadyRecorded", $email);
396 setEventMessages($mesg, null, 'mesgs');
397
398 $db->commit();
399
400 header("Location: ".$redirection);
401 exit;
402 }
403
404 $resultfetchthirdparty = 0;
405
406 $genericcompanyname = $langs->trans('EventParticipant').' '.($emailcompany ? $emailcompany : $email); // Keep this label simple so we can retrieve same thirdparty for another event
407
408 // Getting the thirdparty or creating it
409 $thirdparty = new Societe($db);
410 $contact = new Contact($db);
411 // Fetch using fk_soc if the attendee was already found
412 if (!empty($confattendee->fk_soc) && $confattendee->fk_soc > 0) {
413 $resultfetchthirdparty = $thirdparty->fetch($confattendee->fk_soc);
414 } else {
415 if (!getDolGlobalString('EVENTORGANIZATION_DISABLE_RETREIVE_THIRDPARTY_FROM_NAME')) {
416 // Fetch using the field input by end user if we have just created the attendee
417 if ($resultfetchthirdparty <= 0 && !empty($societe) && !empty($emailcompany)) {
418 $resultfetchthirdparty = $thirdparty->fetch(0, $societe, '', '', '', '', '', '', '', '', $emailcompany);
419 if ($resultfetchthirdparty > 0) {
420 // We found a unique result with the name + emailcompany, so we set the fk_soc of attendee
421 $confattendee->fk_soc = $thirdparty->id;
422 $confattendee->update($user);
423 } elseif ($resultfetchthirdparty == -2) {
424 $thirdparty->error = $langs->trans("ErrorSeveralCompaniesWithNameContactUs", $mysoc->email);
425 }
426 }
427 // Fetch using the field input by end user if we have just created the attendee
428 if ($resultfetchthirdparty <= 0 && !empty($societe) && !empty($email) && $email != $emailcompany) {
429 $resultfetchthirdparty = $thirdparty->fetch(0, $societe, '', '', '', '', '', '', '', '', $email);
430 if ($resultfetchthirdparty > 0) {
431 // We found a unique result with the name + email, so we set the fk_soc of attendee
432 $confattendee->fk_soc = $thirdparty->id;
433 $confattendee->update($user);
434 } elseif ($resultfetchthirdparty == -2) {
435 $thirdparty->error = $langs->trans("ErrorSeveralCompaniesWithNameContactUs", $mysoc->email);
436 }
437 }
438 }
439 if ($resultfetchthirdparty <= 0 && !empty($emailcompany)) {
440 // Try to find thirdparty from the email only
441 $resultfetchthirdparty = $thirdparty->fetch(0, '', '', '', '', '', '', '', '', '', $emailcompany);
442 if ($resultfetchthirdparty > 0) {
443 // We found a unique result with that email only, so we set the fk_soc of attendee
444 $confattendee->fk_soc = $thirdparty->id;
445 $confattendee->update($user);
446 } elseif ($resultfetchthirdparty == -2) {
447 $thirdparty->error = $langs->trans("ErrorSeveralCompaniesWithEmailContactUs", $mysoc->email);
448 }
449 }
450 if ($resultfetchthirdparty <= 0 && !empty($email) && $email != $emailcompany) {
451 // Try to find thirdparty from the email only
452 $resultfetchthirdparty = $thirdparty->fetch(0, '', '', '', '', '', '', '', '', '', $email);
453 if ($resultfetchthirdparty > 0) {
454 // We found a unique result with that email only, so we set the fk_soc of attendee
455 $confattendee->fk_soc = $thirdparty->id;
456 $confattendee->update($user);
457 } elseif ($resultfetchthirdparty == -2) {
458 $thirdparty->error = $langs->trans("ErrorSeveralCompaniesWithEmailContactUs", $mysoc->email);
459 }
460 }
461 if ($resultfetchthirdparty <= 0 && !empty($genericcompanyname)) {
462 // Try to find thirdparty from the generic mail only
463 $resultfetchthirdparty = $thirdparty->fetch(0, $genericcompanyname, '', '', '', '', '', '', '', '', '');
464 if ($resultfetchthirdparty > 0) {
465 // We found a unique result with that name + email, so we set the fk_soc of attendee
466 $confattendee->fk_soc = $thirdparty->id;
467 $confattendee->update($user);
468 } elseif ($resultfetchthirdparty == -2) {
469 $thirdparty->error = $langs->trans("ErrorSeveralCompaniesWithNameContactUs", $mysoc->email);
470 }
471 }
472
473 // TODO Add more tests on a VAT number, profid or a name ?
474
475 if ($resultfetchthirdparty <= 0 && !empty($email)) {
476 // Try to find the thirdparty from the contact
477 $resultfetchcontact = $contact->fetch(0, null, '', $email);
478 if ($resultfetchcontact > 0 && $contact->fk_soc > 0) {
479 $thirdparty->fetch($contact->fk_soc);
480 $confattendee->fk_soc = $thirdparty->id;
481 $confattendee->update($user);
482 $resultfetchthirdparty = 1;
483 }
484 }
485
486 if ($resultfetchthirdparty <= 0 && !empty($societe)) {
487 // Try to find thirdparty from the company name only
488 $resultfetchthirdparty = $thirdparty->fetch(0, $societe, '', '', '', '', '', '', '', '', '');
489 if ($resultfetchthirdparty > 0) {
490 // We found a unique result with that name only, so we set the fk_soc of attendee
491 $confattendee->fk_soc = $thirdparty->id;
492 $confattendee->update($user);
493 } elseif ($resultfetchthirdparty == -2) {
494 $thirdparty->error = "ErrorSeveralCompaniesWithNameContactUs";
495 }
496 }
497 }
498
499 // If price is empty, no need to create a thirdparty, so we force $resultfetchthirdparty as if we have already found thirdp party.
500 if (empty((float) $project->price_registration)) {
501 $resultfetchthirdparty = 1;
502 }
503
504 if ($resultfetchthirdparty < 0) {
505 // If an error was found
506 $error++;
507 $errmsg .= $thirdparty->error;
508 $errors = array_merge($errors, $thirdparty->errors);
509 } elseif ($resultfetchthirdparty == 0) { // No thirdparty found + a payment is expected
510 // Creation of a new thirdparty
511 if (!empty($societe)) {
512 $thirdparty->name = $societe;
513 } else {
514 $thirdparty->name = $genericcompanyname;
515 }
516 $thirdparty->address = GETPOST("address");
517 $thirdparty->zip = GETPOST("zipcode");
518 $thirdparty->town = GETPOST("town");
519 $thirdparty->client = $thirdparty::PROSPECT;
520 $thirdparty->fournisseur = 0;
521 $thirdparty->country_id = GETPOSTINT("country_id");
522 $thirdparty->state_id = GETPOSTINT("state_id");
523 $thirdparty->email = ($emailcompany ? $emailcompany : $email);
524
525 // Load object modCodeTiers
526 $module = getDolGlobalString('SOCIETE_CODECLIENT_ADDON', 'mod_codeclient_leopard');
527 if (substr($module, 0, 15) == 'mod_codeclient_' && substr($module, -3) == 'php') {
528 $module = substr($module, 0, dol_strlen($module) - 4);
529 }
530 $dirsociete = array_merge(array('/core/modules/societe/'), $conf->modules_parts['societe']);
531 foreach ($dirsociete as $dirroot) {
532 $res = dol_include_once($dirroot.$module.'.php');
533 if ($res) {
534 break;
535 }
536 }
537 $modCodeClient = new $module($db);
538 '@phan-var-force ModeleThirdPartyCode $modCodeClient';
539
540 if (empty($tmpcode) && !empty($modCodeClient->code_auto)) {
541 $tmpcode = $modCodeClient->getNextValue($thirdparty, 0);
542 }
543 $thirdparty->code_client = $tmpcode;
544
545 $readythirdparty = $thirdparty->create($user);
546 if ($readythirdparty < 0) {
547 $error++;
548 $errmsg .= $thirdparty->error;
549 $errors = array_merge($errors, $thirdparty->errors);
550 } else {
551 $thirdparty->country_code = getCountry($thirdparty->country_id, '2', $db, $langs);
552 $thirdparty->country = getCountry($thirdparty->country_code, '', $db, $langs);
553
554 // Update attendee country to match country of thirdparty
555 $confattendee->fk_soc = $thirdparty->id;
556 $confattendee->update($user);
557 }
558 }
559 }
560
561 if (!$error && is_object($thirdparty)) {
562 // If the registration needs a payment
563 if (!empty((float) $project->price_registration)) {
564 $outputlangs = $langs;
565
566 // TODO Use default language of $thirdparty->default_lang to build $outputlang
567
568 $outputlangs->loadLangs(array("eventorganization"));
569
570 // Get product to use for invoice
571 $productforinvoicerow = new Product($db);
572 $productforinvoicerow->id = 0;
573
574 $resultprod = 0;
575 if (getDolGlobalInt('SERVICE_CONFERENCE_ATTENDEE_SUBSCRIPTION') > 0) {
576 $resultprod = $productforinvoicerow->fetch(getDolGlobalInt('SERVICE_CONFERENCE_ATTENDEE_SUBSCRIPTION'));
577 }
578
579 $facture = null;
580 // Create the draft invoice for the payment
581 if ($resultprod < 0) {
582 $error++;
583 $errmsg .= $productforinvoicerow->error;
584 $errors = array_merge($errors, $productforinvoicerow->errors);
585 } else {
586 $facture = new Facture($db);
587 if (empty($confattendee->fk_invoice)) {
588 $facture->type = Facture::TYPE_STANDARD;
589 $facture->socid = $thirdparty->id;
590 $facture->paye = 0;
591 $facture->date = dol_now();
592 $facture->cond_reglement_id = $confattendee->cond_reglement_id;
593 $facture->fk_project = $project->id;
594 $facture->status = Facture::STATUS_DRAFT;
595
596 if (empty($facture->cond_reglement_id)) {
597 $paymenttermstatic = new PaymentTerm($confattendee->db);
598 $facture->cond_reglement_id = $paymenttermstatic->getDefaultId();
599 if (empty($facture->cond_reglement_id)) {
600 $error++;
601 $confattendee->error = 'ErrorNoPaymentTermRECEPFound';
602 $confattendee->errors[] = $confattendee->error;
603 }
604 }
605 $resultfacture = $facture->create($user);
606 if ($resultfacture <= 0) {
607 $confattendee->error = $facture->error;
608 $confattendee->errors = $facture->errors;
609 $error++;
610 } else {
611 $confattendee->fk_invoice = $resultfacture;
612 $confattendee->update($user);
613 }
614 } else {
615 $facture->fetch($confattendee->fk_invoice);
616 }
617
618 // Add link between invoice and the attendee registration
619 /*if (!$error) {
620 $facture->add_object_linked($confattendee->element, $confattendee->id);
621 }*/
622 }
623
624 if (!$error) {
625 // Add line to draft invoice
626 $vattouse = get_default_tva($mysoc, $thirdparty, $productforinvoicerow->id);
627
628 $labelforproduct = $outputlangs->trans("EventFee", $project->title);
629 if ($project->location) {
630 $labelforproduct .= ' - '.$project->location;
631 }
632 $date_start = $project->date_start_event;
633 $date_end = $project->date_end_event;
634
635 // If there is no lines yet, we add one
636 if (empty($facture->lines)) {
637 $pu_ttc = (float) $project->price_registration;
638 $pu_ht = 0;
639 $price_base_type = 'TTC';
640
641 $result = $facture->addline($labelforproduct, $pu_ht, 1, $vattouse, 0, 0, $productforinvoicerow->id, 0, $date_start, $date_end, 0, 0, 0, $price_base_type, $pu_ttc, 1);
642 if ($result <= 0) {
643 $confattendee->error = $facture->error;
644 $confattendee->errors = $facture->errors;
645 $error++;
646 }
647 }
648 }
649
650 if (!$error && is_object($facture)) {
651 $db->commit();
652
653 // Registration was recorded and invoice was generated, but payment not yet done.
654 // TODO
655 // Send an email to says registration shas been received and that we are waiting for the payment.
656 // Should send email template (EventOrganizationEmailRegistrationEvent) saved into conf EVENTORGANIZATION_TEMPLATE_EMAIL_REGISTRATION_EVENT.
657
658 // Now we redirect to the payment page
659 $sourcetouse = 'organizedeventregistration';
660 $reftouse = $facture->id;
661 $redirection = $dolibarr_main_url_root.'/public/payment/newpayment.php?source='.urlencode((string) ($sourcetouse)).'&ref='.urlencode((string) ($reftouse));
662 if (getDolGlobalString('PAYMENT_SECURITY_TOKEN')) {
663 $redirection .= '&securekey='.dol_hash(getDolGlobalString('PAYMENT_SECURITY_TOKEN') . $sourcetouse . $reftouse, '2'); // Use the source in the hash to avoid duplicates if the references are identical
664 }
665
666 header("Location: ".$redirection);
667 exit;
668 } else {
669 $db->rollback();
670 }
671 } else {
672 // No price has been set. Validate the subscription before committing.
673 $resultsetstatus = $confattendee->setStatut(1);
674 if ($resultsetstatus < 0) {
675 $error++;
676 $errmsg .= $confattendee->error;
677 $errors = array_merge($errors, $confattendee->errors);
678 }
679
680 if (!$error) {
681 $db->commit();
682
683 // Sending mail
684 require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
685 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
686 $formmail = new FormMail($db);
687 // Set output language
688 $outputlangs = new Translate('', $conf);
689 $outputlangs->setDefaultLang(empty($thirdparty->default_lang) ? $mysoc->default_lang : $thirdparty->default_lang);
690 // Load traductions files required by page
691 $outputlangs->loadLangs(array("main", "members", "eventorganization"));
692 // Get email content from template
693 $arraydefaultmessage = null;
694
695 $labeltouse = getDolGlobalInt('EVENTORGANIZATION_TEMPLATE_EMAIL_AFT_SUBS_EVENT');
696 if (!empty($labeltouse)) {
697 $arraydefaultmessage = $formmail->getEMailTemplate($db, 'eventorganization_send', $user, $outputlangs, $labeltouse, 1, '');
698 }
699
700 if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
701 $subject = $arraydefaultmessage->topic;
702 $msg = $arraydefaultmessage->content;
703 } else {
704 $subject = '';
705 $msg = '';
706 }
707
708 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $thirdparty);
709 complete_substitutions_array($substitutionarray, $outputlangs, $object);
710
711 $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
712 $texttosend = make_substitutions($msg, $substitutionarray, $outputlangs);
713
714 $sendto = !empty($thirdparty->email) ? $thirdparty->email :
715 $confattendee->email;
716
717 $from = getDolGlobalString('MAILING_EMAIL_FROM');
718 $urlback = $_SERVER["REQUEST_URI"];
719
720 $ishtml = dol_textishtml($texttosend); // May contain urls
721
722 if (!empty($sendto)) {
723 $mailfile = new CMailFile($subjecttosend, $sendto, $from, $texttosend, array(), array(), array(), '', '', 0, ($ishtml ? 1 : 0));
724 $result = $mailfile->sendfile();
725 if ($result) {
726 dol_syslog("EMail sent to ".$sendto, LOG_DEBUG, 0, '_payment');
727 } else {
728 dol_syslog("Failed to send EMail to ".$sendto, LOG_ERR, 0, '_payment');
729 }
730 }
731
732 $securekeyurl = dol_hash(getDolGlobalString('EVENTORGANIZATION_SECUREKEY') . 'conferenceorbooth'.((int) $id), 'md5');
733 $redirection = $dolibarr_main_url_root.'/public/eventorganization/subscriptionok.php?id='.((int) $id).'&securekey='.urlencode($securekeyurl);
734
735 header("Location: ".$redirection);
736 exit;
737 } else {
738 $db->rollback();
739 }
740 }
741 //Header("Location: ".$urlback);
742 //exit;
743 } else {
744 $db->rollback();
745 }
746}
747
748
749/*
750 * View
751 */
752
753$form = new Form($db);
754$formcompany = new FormCompany($db);
755
756llxHeaderVierge($langs->trans("NewRegistration"));
757
758
759print '<div align="center">';
760print '<div id="divsubscribe">';
761
762// Sub banner
763print '<div class="center subscriptionformbanner subbanner justify margintoponly paddingtop marginbottomonly padingbottom">';
764print load_fiche_titre($langs->trans("NewRegistration"), '', '', 0, '', 'center');
765// Welcome message
766print '<span class="opacitymedium">'.$langs->trans("EvntOrgWelcomeMessage").'</span>';
767print '<br>';
768// Title
769print '<span class="eventlabel large">'.dolPrintHTML($project->title . ' '. $conference->label).'</span><br>';
770print '</div>';
771
772// Help text
773print '<div class="justify subscriptionformhelptext">';
774
775if ($project->date_start_event || $project->date_end_event) {
776 print '<br><span class="fa fa-calendar pictofixedwidth opacitymedium"></span>';
777}
778if ($project->date_start_event) {
779 $format = 'day';
780 $tmparray = dol_getdate($project->date_start_event, false, '');
781 if ($tmparray['hours'] || $tmparray['minutes'] || $tmparray['seconds']) {
782 $format = 'dayhour';
783 }
784 print dol_print_date($project->date_start_event, $format);
785}
786if ($project->date_start_event && $project->date_end_event) {
787 print ' - ';
788}
789if ($project->date_end_event) {
790 $format = 'day';
791 $tmparray = dol_getdate($project->date_end_event, false, '');
792 if ($tmparray['hours'] || $tmparray['minutes'] || $tmparray['seconds']) {
793 $format = 'dayhour';
794 }
795 print dol_print_date($project->date_end_event, $format);
796}
797if ($project->date_start_event || $project->date_end_event) {
798 print '<br>';
799}
800if ($project->location) {
801 print '<span class="fa fa-map-marked-alt pictofixedwidth opacitymedium"></span>'.dolPrintHTML($project->location).'<br>';
802}
803if ($project->note_public) {
804 print '<br><span class="opacitymedium">'.dol_htmlentitiesbr($project->note_public).'</span><br>';
805}
806
807print '</div>';
808
809
810$maxattendees = 0;
811if ($conference->id > 0) {
812 /* date of project is not date of event so commented
813 print $langs->trans("Date").': ';
814 print dol_print_date($conference->datep);
815 if ($conference->date_end) {
816 print ' - ';
817 print dol_print_date($conference->datef);
818 }*/
819} else {
820 /* date of project is not date of event so commented
821 print $langs->trans("Date").': ';
822 print dol_print_date($project->date_start);
823 if ($project->date_end) {
824 print ' - ';
825 print dol_print_date($project->date_end);
826 }*/
827 $maxattendees = $project->max_attendees; // Max attendeed for the project/event
828}
829
830if ($maxattendees && $currentnbofattendees >= $maxattendees) {
831 print '<br>';
832 print '<div class="warning">'.$langs->trans("MaxNbOfAttendeesReached").'</div>';
833 print '<br>';
834}
835
836
837
838dol_htmloutput_errors($errmsg, $errors);
839
840if ((!empty($conference->id) && $conference->status == ConferenceOrBooth::STATUS_CONFIRMED) || (!empty($project->id) && $project->status == Project::STATUS_VALIDATED)) {
841 if (empty($maxattendees) ||
842 ($currentnbofattendees < $maxattendees &&
843 (!getDolGlobalString('EVENTORGANIZATION_ALLOW_REGISTRATION_WHEN_MAX_REACHED') || (getDolGlobalString('EVENTORGANIZATION_ALLOW_REGISTRATION_WHEN_MAX_REACHED') == GETPOST('EVENTORGANIZATION_ALLOW_REGISTRATION_WHEN_MAX_REACHED')))
844 )) {
845 // Print form
846 print '<form action="' . $_SERVER["PHP_SELF"] . '" method="POST" name="newmember">' . "\n";
847 print '<input type="hidden" name="token" value="' . newToken() . '" / >';
848 print '<input type="hidden" name="entity" value="' . $entity . '" />';
849 print '<input type="hidden" name="action" value="add" />';
850 print '<input type="hidden" name="type" value="' . $type . '" />';
851 print '<input type="hidden" name="id" value="' . $conference->id . '" />';
852 print '<input type="hidden" name="fk_project" value="' . $project->id . '" />';
853 print '<input type="hidden" name="securekey" value="' . $securekeyreceived . '" />';
854 if (GETPOST('EVENTORGANIZATION_ALLOW_REGISTRATION_WHEN_MAX_REACHED')) {
855 print '<input type="hidden" name="EVENTORGANIZATION_ALLOW_REGISTRATION_WHEN_MAX_REACHED" value="' . GETPOST('EVENTORGANIZATION_ALLOW_REGISTRATION_WHEN_MAX_REACHED') . '" />';
856 }
857
858 print '<br>';
859 print '<br>';
860 //print '<span class="opacitymedium">' . $langs->trans("FieldsWithAreMandatory", '*') . '</span><br>';
861 //print $langs->trans("FieldsWithIsForPublic",'**').'<br>';
862
863 print dol_get_fiche_head();
864
865 print '<script type="text/javascript">
866 jQuery(document).ready(function () {
867 jQuery(document).ready(function () {
868 jQuery("#selectcountry_id").change(function() {
869 document.newmember.action.value="create";
870 document.newmember.submit();
871 });
872 });
873 });
874 </script>';
875
876 print '<table class="border" summary="form to subscribe" id="tablesubscribe">' . "\n";
877
878 // Firstname
879 print '<tr><td><span class="fieldrequired">';
880 print $langs->trans("Firstname") . '</span></td><td>';
881 print img_picto('', 'user', 'class="pictofixedwidth"');
882 print '<input type="text" name="firstname" maxlength="255" class="minwidth200 widthcentpercentminusx maxwidth300" value="' . dol_escape_htmltag($firstname) . '" required autofocus></td></tr>' . "\n";
883
884 // Lastname
885 print '<tr><td><span class="fieldrequired">';
886 print $langs->trans("Lastname") . '</span></td><td>';
887 print img_picto('', 'user', 'class="pictofixedwidth"');
888 print '<input type="text" name="lastname" maxlength="255" class="minwidth200 widthcentpercentminusx maxwidth300" value="' . dol_escape_htmltag($lastname) . '" required></td></tr>' . "\n";
889
890 // Email
891 print '<tr><td><span class="fieldrequired">' . $langs->trans("EmailAttendee") . '</span></td><td>';
892 print img_picto('', 'email', 'class="pictofixedwidth"');
893 print '<input type="text" name="email" maxlength="255" class="minwidth200 widthcentpercentminusx maxwidth300" value="' . dol_escape_htmltag(GETPOST('email')) . '" required></td></tr>' . "\n";
894
895 // Company
896 print '<tr id="trcompany" class="trcompany"><td>';
897 if (!empty((float) $project->price_registration)) {
898 print '<span class="fieldrequired">';
899 }
900 print $langs->trans("Company");
901 if (!empty((float) $project->price_registration)) {
902 print '</span>';
903 }
904 print '</td><td>';
905 print img_picto('', 'company', 'class="pictofixedwidth"');
906 print '<input type="text" name="societe" class="minwidth200 widthcentpercentminusx maxwidth300" value="' . dol_escape_htmltag(GETPOST('societe')) . '"'.(empty((float) $project->price_registration) ? '' : ' required').'></td></tr>' . "\n";
907
908 // Email company for invoice
909 if (!empty((float) $project->price_registration)) {
910 print '<tr><td>' . $form->textwithpicto($langs->trans("EmailCompany"), $langs->trans("EmailCompanyForInvoice")) . '</td><td>';
911 print img_picto('', 'email', 'class="pictofixedwidth"');
912 print '<input type="text" name="emailcompany" maxlength="255" class="minwidth200 widthcentpercentminusx maxwidth300" value="' . dol_escape_htmltag(GETPOST('emailcompany')) . '"></td></tr>' . "\n";
913 }
914
915 // Address
916 print '<tr><td>' . $langs->trans("Address") . '</td><td>' . "\n";
917 print '<textarea name="address" id="address" wrap="soft" class="centpercent" rows="' . ROWS_2 . '">' . dol_escape_htmltag(GETPOST('address', 'restricthtml'), 0, 1) . '</textarea></td></tr>' . "\n";
918
919 // Zip / Town
920 print '<tr><td>' . $langs->trans('Zip') . ' / ' . $langs->trans('Town') . '</td><td>';
921 print $formcompany->select_ziptown(GETPOST('zipcode'), 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6, 1);
922 print ' / ';
923 print $formcompany->select_ziptown(GETPOST('town'), 'town', array('zipcode', 'selectcountry_id', 'state_id'), 0, 1);
924 print '</td></tr>';
925
926 // Country
927 print '<tr><td><span class="fieldrequired">'.$langs->trans('Country').'</span></td><td>';
928 print img_picto('', 'country', 'class="pictofixedwidth"');
929 $country_id = GETPOST('country_id');
930 if (!$country_id && getDolGlobalString('MEMBER_NEWFORM_FORCECOUNTRYCODE')) {
931 $country_id = getCountry($conf->global->MEMBER_NEWFORM_FORCECOUNTRYCODE, '2', $db, $langs);
932 }
933 if (!$country_id && !empty($conf->geoipmaxmind->enabled)) {
934 $country_code = dol_user_country();
935 //print $country_code;
936 if ($country_code) {
937 $new_country_id = getCountry($country_code, '3', $db, $langs);
938 //print 'xxx'.$country_code.' - '.$new_country_id;
939 if ($new_country_id) {
940 $country_id = $new_country_id;
941 }
942 }
943 }
944 $country_code = getCountry($country_id, '2', $db, $langs);
945 print $form->select_country($country_id, 'country_id', '', 0, 'minwidth200 widthcentpercentminusx maxwidth300');
946 print '</td></tr>';
947 // State
948 if (!getDolGlobalString('SOCIETE_DISABLE_STATE')) {
949 print '<tr><td>' . $langs->trans('State') . '</td><td>';
950 if ($country_code) {
951 print img_picto('', 'state', 'class="pictofixedwidth"');
952 print $formcompany->select_state(GETPOSTINT("state_id"), $country_code);
953 } else {
954 print '';
955 }
956 print '</td></tr>';
957 }
958
959 if (!empty((float) $project->price_registration)) {
960 print '<tr><td>' . $langs->trans('Price') . '</td><td>';
961 print '<span class="amount price-registration">'.price($project->price_registration, 1, $langs, 1, -1, -1, $conf->currency).'</span>';
962 print '</td></tr>';
963 }
964
965 // Other attributes
966 $parameters['tpl_context'] = 'public'; // define template context to public
967 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
968
969 $notetoshow = $note_public;
970 print '<tr><td>' . $langs->trans('Note') . '</td><td>';
971 if (getDolGlobalString('EVENTORGANIZATION_DEFAULT_NOTE_ON_REGISTRATION')) {
972 $notetoshow = str_replace('\n', "\n", getDolGlobalString('EVENTORGANIZATION_DEFAULT_NOTE_ON_REGISTRATION'));
973 }
974 print '<textarea name="note_public" class="centpercent" rows="'.ROWS_9.'">'.dol_escape_htmltag($notetoshow, 0, 1).'</textarea>';
975 print '</td></tr>';
976
977
978
979 print "</table>\n";
980
981 print dol_get_fiche_end();
982
983 // Save
984 print '<div class="center">';
985 print '<input type="submit" value="' . $langs->trans("Submit") . '" id="submitsave" class="button">';
986 if (!empty($backtopage)) {
987 print ' &nbsp; &nbsp; <input type="submit" value="' . $langs->trans("Cancel") . '" id="submitcancel" class="button button-cancel">';
988 }
989 print '</div>';
990
991 print "</form>\n";
992
993 print "<br>";
994 }
995} else {
996 print '<br><br>';
997 if ($project->status == $project::STATUS_DRAFT) {
998 print $langs->trans("ConferenceIsNotConfirmed");
999 } else {
1000 print $langs->trans("EventRegistrationAreClosed");
1001 }
1002 print '<br><br>';
1003}
1004
1005print '</div></div>';
1006
1008
1009$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
global $dolibarr_main_url_root
llxHeaderVierge($title, $head="", $disablejs=0, $disablehead=0, $arrayofjs=[], $arrayofcss=[], $ws='')
Show header for new member.
llxFooterVierge()
Show footer for new member.
Class to send emails (with attachments or not) Usage: $mailfile = new CMailFile($subject,...
Class for ConferenceOrBoothAttendee.
Class for ConferenceOrBooth.
Class to manage contact/addresses.
Class to manage standard extra fields.
Class to manage invoices.
const STATUS_DRAFT
Draft status.
const TYPE_STANDARD
Standard invoice.
Class to build HTML component for third parties management Only common components are here.
Class to manage generation of HTML components Only common components must be here.
Class to manage a HTML form to send a unitary email Usage: $formail = new FormMail($db) $formmail->pr...
Class to manage payment terms records in dictionary.
Class to manage products or services.
Class to manage projects.
const STATUS_VALIDATED
Open/Validated status.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
global $mysoc
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0, $tz='')
Add a delay to a date.
Definition date.lib.php:129
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
$date_start
Variables from include:
dol_now($mode='gmt')
Return date for now.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dol_user_country()
Return country code for current user.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
printCommonFooter($zone='private')
Print common footer : conf->global->MAIN_HTML_FOOTER js for switch of menu hider js for conf->global-...
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
complete_substitutions_array(&$substitutionarray, $outputlangs, $object=null, $parameters=null, $callfunc="completesubstitutionarray")
Complete the $substitutionarray with more entries coming from external module that had set the "subst...
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
dol_textishtml($msg, $option=0)
Return if a text is a html content.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
getUserRemoteIP($trusted=0)
Return the real IP of remote user.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
dol_htmloutput_errors($mesgstring='', $mesgarray=array(), $keepembedded=0)
Print formatted error messages to output (Used to show messages on html output).
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs=array(), $arrayofcss=array(), $disableforlogin=0, $disablenofollow=0, $disablenoindex=0)
Output html header of a page.
httponly_accessforbidden($message='1', $http_response_code=403, $stringalreadysanitized=0)
Show a message to say access is forbidden and stop program.
dol_hash($chain, $type='0', $nosalt=0, $mode=0)
Returns a hash (non reversible encryption) of a string.