dolibarr 22.0.5
view.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2020 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
4 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
26if (!defined('NOLOGIN')) {
27 define("NOLOGIN", 1); // This means this output page does not require to be logged.
28}
29if (!defined('NOCSRFCHECK')) {
30 define("NOCSRFCHECK", 1); // We accept to go on this page from external web site.
31}
32if (!defined('NOIPCHECK')) {
33 define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
34}
35if (!defined('NOBROWSERNOTIF')) {
36 define('NOBROWSERNOTIF', '1');
37}
38
39// Load Dolibarr environment
40require '../../main.inc.php';
41require_once DOL_DOCUMENT_ROOT.'/recruitment/class/recruitmentjobposition.class.php';
42require_once DOL_DOCUMENT_ROOT.'/recruitment/class/recruitmentcandidature.class.php';
43require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
44require_once DOL_DOCUMENT_ROOT.'/core/lib/security.lib.php';
45require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
46require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
47require_once DOL_DOCUMENT_ROOT . '/core/lib/public.lib.php';
48require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
49
58// Load translation files required by the page
59$langs->loadLangs(array("companies", "other", "recruitment"));
60
61// Get parameters
62$action = GETPOST('action', 'aZ09');
63$cancel = GETPOST('cancel', 'alpha');
64$email = GETPOST('email', 'alpha');
65$firstname = GETPOST('firstname', 'alpha');
66$lastname = GETPOST('lastname', 'alpha');
67$birthday = GETPOST('birthday', 'alpha');
68$phone = GETPOST('phone', 'alpha');
69$message = GETPOST('message', 'alpha');
70$requestedremuneration = GETPOST('requestedremuneration', 'alpha');
71
72$ref = GETPOST('ref', 'alpha');
73
74if (GETPOST('btn_view')) {
75 unset($_SESSION['email_customer']);
76}
77if (isset($_SESSION['email_customer'])) {
78 $email = $_SESSION['email_customer'];
79}
80
82
83if (!$ref) {
84 print $langs->trans('ErrorBadParameters')." - ref missing";
85 exit;
86}
87
88
89// Define $urlwithroot
90//$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
91//$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
92$urlwithroot = DOL_MAIN_URL_ROOT; // This is to use same domain name than current. For Paypal payment, we can use internal URL like localhost.
93$backtopage = $urlwithroot.'/public/recruitment/index.php';
94
95// Security check
96if (!isModEnabled("recruitment")) {
97 httponly_accessforbidden('Module Recruitment not enabled');
98}
99
100$object->fetch(0, $ref);
101$user->loadDefaultValues();
102$errmsg = "";
103
104$extrafields = new ExtraFields($db);
105
106/*
107 * Actions
108 */
109
110if ($cancel) {
111 if (!empty($backtopage)) {
112 header("Location: ".$backtopage);
113 exit;
114 }
115}
116
117if ($action == "dosubmit") { // Test on permission not required here (anonymous action protected by mitigation of /public/... urls)
118 $error = 0;
119 $db->begin();
120 if (!strlen($ref)) {
121 $error++;
122 array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("Ref")));
123 $action = 'view';
124 }
125 if (!strlen($email)) {
126 $error++;
127 array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("Email")));
128 $action = 'view';
129 } else {
130 if (!isValidEmail($email)) {
131 $error++;
132 array_push($object->errors, $langs->trans("ErrorEmailInvalid"));
133 $action = 'view';
134 }
135 }
136 if (!strlen($lastname)) {
137 $error++;
138 array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("Lastname")));
139 $action = 'view';
140 }
141
142 if (!$error) {
143 $sql = "SELECT rrc.rowid FROM ".MAIN_DB_PREFIX."recruitment_recruitmentcandidature as rrc";
144 $sql .= " WHERE rrc.email = '". $db->escape($email)."'";
145 $sql .= " AND rrc.entity IN (". getEntity($object->element, 0).")";
146 $resql = $db->query($sql);
147 if ($resql) {
148 $num = $db->num_rows($resql);
149 if ($num > 0) {
150 $error++;
151 setEventMessages($langs->trans("ErrorRecruitmmentCandidatureAlreadyExists", $email), null, 'errors');
152 }
153 } else {
154 dol_print_error($db);
155 $error++;
156 }
157 }
158
159 if (!$error) { // Test on permission not required here (anonymous action protected by mitigation of /public/... urls)
160 $candidature = new RecruitmentCandidature($db);
161
162 $candidature->firstname = GETPOST('firstname', 'alpha');
163 $candidature->lastname = GETPOST('lastname', 'alpha');
164 $candidature->email = GETPOST('email', 'alpha');
165 $candidature->phone = GETPOST('phone', 'alpha');
166 $candidature->date_birth = GETPOST('birthday', 'alpha');
167 $candidature->requestedremuneration = GETPOST('requestedremuneration', 'alpha');
168 $candidature->description = GETPOST('message', 'alpha');
169 $candidature->fk_recruitmentjobposition = $object->id;
170
171 $candidature->ip = getUserRemoteIP();
172
173 // Test MAIN_SECURITY_MAX_POST_ON_PUBLIC_PAGES_BY_IP_ADDRESS
174 $nb_post_max = getDolGlobalInt("MAIN_SECURITY_MAX_POST_ON_PUBLIC_PAGES_BY_IP_ADDRESS", 200);
175
176 if (checkNbPostsForASpeceificIp($candidature, $nb_post_max) <= 0) {
177 $error++;
178 $errmsg .= implode('<br>', $candidature->errors);
179 }
180
181 // Fill array 'array_options' with data from add form
182 $extrafields->fetch_name_optionals_label($candidature->table_element);
183 $ret = $extrafields->setOptionalsFromPost(null, $candidature);
184 if ($ret < 0) {
185 $error++;
186 $errmsg .= $candidature->error;
187 }
188
189 if (!$error) {
190 $result = $candidature->create($user);
191 if ($result <= 0) {
192 $error++;
193 $errmsg .= implode('<br>', $candidature->errors);
194 }
195 }
196 if (!$error) {
197 $candidature->validate($user);
198 if ($result <= 0) {
199 $error++;
200 $errmsg .= implode('<br>', $candidature->errors);
201 }
202 }
203 }
204
205 if (!$error) {
206 $db->commit();
207 setEventMessages($langs->trans("RecruitmentCandidatureSaved"), null);
208 header("Location: " . $backtopage);
209 exit;
210 } else {
211 $db->rollback();
212 $action = "view";
213 }
214}
215
216// Actions to send emails (for ticket, we need to manage the addfile and removefile only)
217$triggersendname = 'CANDIDATURE_SENTBYMAIL';
218$paramname = 'id';
219$autocopy = 'MAIN_MAIL_AUTOCOPY_CANDIDATURE_TO'; // used to know the automatic BCC to add
220$trackid = 'recruitmentcandidature'.$object->id;
221include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
222
223
224
225/*
226 * View
227 */
228
229$form = new Form($db);
230$now = dol_now();
231
232$head = '';
233if (getDolGlobalString('MAIN_RECRUITMENT_CSS_URL')) {
234 $head = '<link rel="stylesheet" type="text/css" href="' . getDolGlobalString('MAIN_RECRUITMENT_CSS_URL').'?lang='.$langs->defaultlang.'">'."\n";
235}
236
237$conf->dol_hide_topmenu = 1;
238$conf->dol_hide_leftmenu = 1;
239
240if (!$conf->global->RECRUITMENT_ENABLE_PUBLIC_INTERFACE) {
241 $langs->load("errors");
242 print '<div class="error">'.$langs->trans('ErrorPublicInterfaceNotEnabled').'</div>';
243 $db->close();
244 exit();
245}
246
247$arrayofjs = array();
248$arrayofcss = array();
249
250$replacemainarea = (empty($conf->dol_hide_leftmenu) ? '<div>' : '').'<div>';
251llxHeader($head, $langs->trans("PositionToBeFilled"), '', '', 0, 0, '', '', '', 'onlinepaymentbody', $replacemainarea, 1, 1);
252dol_htmloutput_errors($errmsg);
253
254print '<span id="dolpaymentspan"></span>'."\n";
255print '<div class="center">'."\n";
256print '<form id="dolpaymentform" class="center" name="paymentform" action="'.$_SERVER["PHP_SELF"].'" method="POST">'."\n";
257print '<input type="hidden" name="token" value="'.newToken().'">'."\n";
258print '<input type="hidden" name="action" value="dosubmit">'."\n";
259print '<input type="hidden" name="tag" value="'.GETPOST("tag", 'alpha').'">'."\n";
260print '<input type="hidden" name="suffix" value="'.GETPOST("suffix", 'alpha').'">'."\n";
261print '<input type="hidden" name="securekey" value="'.$SECUREKEY.'">'."\n";
262print '<input type="hidden" name="entity" value="'.$entity.'" />';
263print "\n";
264print '<!-- Form to view job -->'."\n";
265
266// Show logo (search order: logo defined by ONLINE_SIGN_LOGO_suffix, then ONLINE_SIGN_LOGO_, then small company logo, large company logo, theme logo, common logo)
267// Define logo and logosmall
268$logosmall = $mysoc->logo_small;
269$logo = $mysoc->logo;
270$paramlogo = 'ONLINE_RECRUITMENT_LOGO_'.$suffix;
271if (getDolGlobalString($paramlogo)) {
272 $logosmall = getDolGlobalString($paramlogo);
273} elseif (getDolGlobalString('ONLINE_RECRUITMENT_LOGO')) {
274 $logosmall = getDolGlobalString('ONLINE_RECRUITMENT_LOGO');
275}
276//print '<!-- Show logo (logosmall='.$logosmall.' logo='.$logo.') -->'."\n";
277// Define urllogo
278$urllogo = '';
279$urllogofull = '';
280if (!empty($logosmall) && is_readable($conf->mycompany->dir_output.'/logos/thumbs/'.$logosmall)) {
281 $urllogo = DOL_URL_ROOT.'/viewimage.php?modulepart=mycompany&amp;entity='.$conf->entity.'&amp;file='.urlencode('logos/thumbs/'.$logosmall);
282 $urllogofull = $dolibarr_main_url_root.'/viewimage.php?modulepart=mycompany&entity='.$conf->entity.'&file='.urlencode('logos/thumbs/'.$logosmall);
283} elseif (!empty($logo) && is_readable($conf->mycompany->dir_output.'/logos/'.$logo)) {
284 $urllogo = DOL_URL_ROOT.'/viewimage.php?modulepart=mycompany&amp;entity='.$conf->entity.'&amp;file='.urlencode('logos/'.$logo);
285 $urllogofull = $dolibarr_main_url_root.'/viewimage.php?modulepart=mycompany&entity='.$conf->entity.'&file='.urlencode('logos/'.$logo);
286}
287// Output html code for logo
288if ($urllogo) {
289 print '<div class="backgreypublicpayment">';
290 print '<div class="logopublicpayment">';
291 if (!empty($mysoc->url)) {
292 print '<a href="'.$mysoc->url.'" target="_blank" rel="noopener">';
293 }
294 print '<img id="dolpaymentlogo" src="'.$urllogofull.'">';
295 if (!empty($mysoc->url)) {
296 print '</a>';
297 }
298 print '</div>';
299 if (!getDolGlobalString('MAIN_HIDE_POWERED_BY')) {
300 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>';
301 }
302 print '</div>';
303}
304
305if (getDolGlobalString('RECRUITMENT_IMAGE_PUBLIC_INTERFACE')) {
306 print '<div class="backimagepublicrecruitment">';
307 print '<img id="idRECRUITMENT_IMAGE_PUBLIC_INTERFACE" src="' . getDolGlobalString('RECRUITMENT_IMAGE_PUBLIC_INTERFACE').'">';
308 print '</div>';
309}
310
311
312print '<table id="dolpaymenttable" summary="Job position offer" class="center">'."\n";
313
314// Output introduction text
315$text = '';
316if (getDolGlobalString('RECRUITMENT_NEWFORM_TEXT')) {
317 $reg = array();
318 if (preg_match('/^\‍((.*)\‍)$/', $conf->global->RECRUITMENT_NEWFORM_TEXT, $reg)) {
319 $text .= $langs->trans($reg[1])."<br>\n";
320 } else {
321 $text .= getDolGlobalString('RECRUITMENT_NEWFORM_TEXT') . "<br>\n";
322 }
323 $text = '<tr><td align="center"><br>'.$text.'<br></td></tr>'."\n";
324}
325if (empty($text)) {
326 $text .= '<tr><td class="textpublicpayment" colspan=2><br>'.$langs->trans("JobOfferToBeFilled", $mysoc->name);
327 $text .= ' &nbsp; - &nbsp; <strong>'.$mysoc->name.'</strong>';
328 $text .= ' &nbsp; - &nbsp; <span class="nowraponall"><span class="fa fa-calendar secondary"></span> '.dol_print_date($object->date_creation).'</span>';
329 $text .= '</td></tr>'."\n";
330 $text .= '<tr><td class="textpublicpayment" colspan=2><h1 class="paddingleft paddingright">'.$object->label.'</h1><br></td></tr>'."\n";
331}
332print $text;
333
334// Output payment summary form
335print '<tr><td class="left" colspan=2>';
336
337print '<div with="100%" id="tablepublicpayment">';
338print '<div class="opacitymedium">'.$langs->trans("ThisIsInformationOnJobPosition").' :</div>'."\n";
339
340$error = 0;
341$found = true;
342
343print '<br>';
344
345// Label
346print $langs->trans("Label").' : ';
347print '<b>'.dol_escape_htmltag($object->label).'</b><br>';
348
349// Date
350print $langs->trans("DateExpected").' : ';
351print '<b>';
352if ($object->date_planned > $now) {
353 print dol_print_date($object->date_planned, 'day');
354} else {
355 print $langs->trans("ASAP");
356}
357print '</b><br>';
358
359// Remuneration
360print $langs->trans("Remuneration").' : ';
361print '<b>';
362print dol_escape_htmltag($object->remuneration_suggested);
363print '</b><br>';
364
365// Contact
366$tmpuser = new User($db);
367$tmpuser->fetch($object->fk_user_recruiter);
368
369print $langs->trans("ContactForRecruitment").' : ';
370$emailforcontact = $object->email_recruiter;
371if (empty($emailforcontact)) {
372 $emailforcontact = $tmpuser->email ?? '';
373 if (empty($emailforcontact)) {
374 $emailforcontact = $mysoc->email ?? '';
375 }
376}
377print '<b class="wordbreak">';
378print $tmpuser->getFullName($langs);
379print ' &nbsp; '.dol_print_email($emailforcontact, 0, 0, 1, 0, 0, 'envelope');
380print '</b>';
381print '</b><br>';
382
384 print info_admin($langs->trans("JobClosedTextCandidateFound"), 0, 0, '0', 'warning');
385}
387 print info_admin($langs->trans("JobClosedTextCanceled"), 0, 0, '0', 'warning');
388}
389
390print '<br>';
391
392// Description
393
394$text = $object->description;
395print $text;
396print '<input type="hidden" name="ref" value="'.$object->ref.'">';
397
398print '</div>'."\n";
399print "\n";
400
401
402if ($action != 'dosubmit') {
403 if ($found && !$error) {
404 // We are in a management option and no error
405 print '</td></tr>'."\n";
406 print '<tr><td class="titlefieldcreate fieldrequired left">'.$langs->trans("Lastname").'</td><td class="left">';
407 print '<input type="text" class="flat minwidth400 --success" name="lastname" maxlength="128" value="'.$lastname.'">';
408 print '</td></tr>'."\n";
409
410 print '<tr><td class="titlefieldcreate left">'.$langs->trans("Firstname").'</td><td class="left">';
411 print '<input type="text" class="flat minwidth400 --success" name="firstname" maxlength="128" value="'.$firstname.'">';
412 print '</td></tr>'."\n";
413
414 print '<tr><td class="titlefieldcreate fieldrequired left">'.$langs->trans("Email").'</td><td class="left">';
415 print img_picto("", "email").'<input type="text" class="flat minwidth100 --success" name="email" value="'.$email.'">';
416 print '</td></tr>'."\n";
417
418 print '<tr><td class="titlefieldcreate left">'.$langs->trans("Phone").'</td><td class="left">';
419 print img_picto("", "phone").'<input type="text" class="flat minwidth100 --success" name="phone" value="'.$phone.'">';
420 print '</td></tr>'."\n";
421
422 print '<tr><td class="titlefieldcreate left minwidth300">'.$langs->trans("DateOfBirth").'</td><td class="left">';
423 print $form->selectDate($birthday, 'birthday', 0, 0, 1, "", 1, 0);
424 print '</td></tr>'."\n";
425
426 print '<tr><td class="titlefieldcreate left">'.$langs->trans("RequestedRemuneration").'</td><td class="left">';
427 print '<input type="text" class="flat minwidth100 --success" name="requestedremuneration" value="'.$requestedremuneration.'">';
428 print '</td></tr>'."\n";
429
430 // Other attributes
432 $parameters['tpl_context'] = 'public'; // define template context to public
433 $parameters['tdclass'] = 'left';
434 $extrafields->fetch_name_optionals_label("recruitment_recruitmentcandidature");
435 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
436
437 print '<tr><td class="titlefieldcreate left">'.$langs->trans("Message").'</td><td class="left">';
438 print '<textarea class="flat quatrevingtpercent" rows="'.ROWS_5.'" name="message">'.$message.'</textarea>';
439 print '</td></tr>'."\n";
440
441 print '<tr><td colspan=2>';
442 print $form->buttonsSaveCancel('Submit', 'Cancel');
443 print '</td></tr>'."\n";
444 } else {
445 dol_print_error_email('ERRORSUBMITAPPLICATION');
446 }
447} else {
448 // Print
449}
450
451print '</td></tr>'."\n";
452
453print '</table>'."\n";
454
455print '</form>'."\n";
456print '</div>'."\n";
457print '<br>';
458
459
460htmlPrintOnlineFooter($mysoc, $langs);
461
462llxFooter('', 'public');
463
464$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:67
global $dolibarr_main_url_root
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:73
Class to manage standard extra fields.
Class to manage generation of HTML components Only common components must be here.
Class for RecruitmentCandidature.
Class for RecruitmentJobPosition.
Class to manage Dolibarr users.
htmlPrintOnlineFooter($fromcompany, $langs, $addformmessage=0, $suffix='', $object=null)
Show footer of company in HTML public pages.
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_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_error_email($prefixcode, $errormessage='', $errormessages=array(), $morecss='error', $email='')
Show a public email and error code to contact if technical error.
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...
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
dol_htmloutput_errors($mesgstring='', $mesgarray=array(), $keepembedded=0)
Print formatted error messages to output (Used to show messages on html output).
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
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...
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Definition member.php:79
checkNbPostsForASpeceificIp($object, $nb_post_max)
Check if the object exceeded the number of posts for a specific ip in the same week.
httponly_accessforbidden($message='1', $http_response_code=403, $stringalreadysanitized=0)
Show a message to say access is forbidden and stop program.