Browse Source

Merge branch '18.0' of git@github.com:Dolibarr/dolibarr.git into 19.0

Conflicts:
	htdocs/core/triggers/interface_50_modTicket_TicketEmail.class.php
	htdocs/public/ticket/create_ticket.php
	htdocs/public/ticket/index.php
	htdocs/public/ticket/list.php
	htdocs/public/ticket/view.php
	htdocs/ticket/agenda.php
	htdocs/ticket/card.php
	htdocs/ticket/class/ticket.class.php
	htdocs/ticket/contact.php
	htdocs/ticket/document.php
	htdocs/ticket/index.php
	htdocs/ticket/list.php
	htdocs/ticket/messaging.php
	htdocs/ticket/stats/index.php
Laurent Destailleur 1 year ago
parent
commit
dd5d70ad5d

+ 210 - 208
htdocs/admin/oauthlogintokens.php

@@ -159,253 +159,255 @@ if ($mode == 'setup' && $user->admin) {
 	$oauthstateanticsrf = bin2hex(random_bytes(128/8));
 
 	// $list is defined into oauth.lib.php to the list of supporter OAuth providers.
-	foreach ($listinsetup as $key) {
-		$supported = 0;
-		$keyforsupportedoauth2array = $key[0];						// May be OAUTH_GOOGLE_NAME or OAUTH_GOOGLE_xxx_NAME
-		$keyforsupportedoauth2array = preg_replace('/^OAUTH_/', '', $keyforsupportedoauth2array);
-		$keyforsupportedoauth2array = preg_replace('/_NAME$/', '', $keyforsupportedoauth2array);
-		if (preg_match('/^.*-/', $keyforsupportedoauth2array)) {
-			$keybeforeprovider = preg_replace('/-.*$/', '', $keyforsupportedoauth2array);
-			$keyforprovider = preg_replace('/^.*-/', '', $keyforsupportedoauth2array);
-		} else {
-			$keybeforeprovider = $keyforsupportedoauth2array;
-			$keyforprovider = '';
-		}
-		$keyforsupportedoauth2array = preg_replace('/-.*$/', '', $keyforsupportedoauth2array);
-		$keyforsupportedoauth2array = 'OAUTH_'.$keyforsupportedoauth2array.'_NAME';
+	if (!empty($listinsetup)) {
+		foreach ($listinsetup as $key) {
+			$supported = 0;
+			$keyforsupportedoauth2array = $key[0];						// May be OAUTH_GOOGLE_NAME or OAUTH_GOOGLE_xxx_NAME
+			$keyforsupportedoauth2array = preg_replace('/^OAUTH_/', '', $keyforsupportedoauth2array);
+			$keyforsupportedoauth2array = preg_replace('/_NAME$/', '', $keyforsupportedoauth2array);
+			if (preg_match('/^.*-/', $keyforsupportedoauth2array)) {
+				$keybeforeprovider = preg_replace('/-.*$/', '', $keyforsupportedoauth2array);
+				$keyforprovider = preg_replace('/^.*-/', '', $keyforsupportedoauth2array);
+			} else {
+				$keybeforeprovider = $keyforsupportedoauth2array;
+				$keyforprovider = '';
+			}
+			$keyforsupportedoauth2array = preg_replace('/-.*$/', '', $keyforsupportedoauth2array);
+			$keyforsupportedoauth2array = 'OAUTH_'.$keyforsupportedoauth2array.'_NAME';
 
 
-		$OAUTH_SERVICENAME = (empty($supportedoauth2array[$keyforsupportedoauth2array]['name']) ? 'Unknown' : $supportedoauth2array[$keyforsupportedoauth2array]['name'].($keyforprovider ? '-'.$keyforprovider : ''));
+			$OAUTH_SERVICENAME = (empty($supportedoauth2array[$keyforsupportedoauth2array]['name']) ? 'Unknown' : $supportedoauth2array[$keyforsupportedoauth2array]['name'].($keyforprovider ? '-'.$keyforprovider : ''));
 
-		$shortscope = '';
-		if (getDolGlobalString($key[4])) {
-			$shortscope = getDolGlobalString($key[4]);
-		}
-		$state = $shortscope;	// TODO USe a better state
-
-		// Define $urltorenew, $urltodelete, $urltocheckperms
-		if ($keyforsupportedoauth2array == 'OAUTH_GITHUB_NAME') {
-			// List of keys that will be converted into scopes (from constants 'SCOPE_state_in_uppercase' in file of service).
-			// We pass this param list in to 'state' because we need it before and after the redirect.
-
-			// Note: github does not accept csrf key inside the state parameter (only known values)
-			$urltorenew = $urlwithroot.'/core/modules/oauth/github_oauthcallback.php?shortscope='.urlencode($shortscope).'&state='.urlencode($shortscope).'&backtourl='.urlencode(DOL_URL_ROOT.'/admin/oauthlogintokens.php');
-			$urltodelete = $urlwithroot.'/core/modules/oauth/github_oauthcallback.php?action=delete&token='.newToken().'&backtourl='.urlencode(DOL_URL_ROOT.'/admin/oauthlogintokens.php');
-			$urltocheckperms = 'https://github.com/settings/applications/';
-		} elseif ($keyforsupportedoauth2array == 'OAUTH_GOOGLE_NAME') {
-			// List of keys that will be converted into scopes (from constants 'SCOPE_state_in_uppercase' in file of service).
-			// List of scopes for Google are here: https://developers.google.com/identity/protocols/oauth2/scopes
-			// We pass this key list into the param 'state' because we need it before and after the redirect.
-			$urltorenew = $urlwithroot.'/core/modules/oauth/google_oauthcallback.php?shortscope='.urlencode($shortscope).'&state='.urlencode($state).'-'.$oauthstateanticsrf.'&backtourl='.urlencode(DOL_URL_ROOT.'/admin/oauthlogintokens.php');
-			$urltodelete = $urlwithroot.'/core/modules/oauth/google_oauthcallback.php?action=delete&token='.newToken().'&backtourl='.urlencode(DOL_URL_ROOT.'/admin/oauthlogintokens.php');
-			$urltocheckperms = 'https://security.google.com/settings/security/permissions';
-		} elseif (!empty($supportedoauth2array[$keyforsupportedoauth2array]['returnurl'])) {
-			$urltorenew = $urlwithroot.$supportedoauth2array[$keyforsupportedoauth2array]['returnurl'].'?shortscope='.urlencode($shortscope).'&state='.urlencode($state).'&backtourl='.urlencode(DOL_URL_ROOT.'/admin/oauthlogintokens.php');
-			$urltodelete = $urlwithroot.$supportedoauth2array[$keyforsupportedoauth2array]['returnurl'].'?action=delete&token='.newToken().'&backtourl='.urlencode(DOL_URL_ROOT.'/admin/oauthlogintokens.php');
-			$urltocheckperms = '';
-		} else {
-			$urltorenew = '';
-			$urltodelete = '';
-			$urltocheckperms = '';
-		}
+			$shortscope = '';
+			if (getDolGlobalString($key[4])) {
+				$shortscope = getDolGlobalString($key[4]);
+			}
+			$state = $shortscope;	// TODO USe a better state
+
+			// Define $urltorenew, $urltodelete, $urltocheckperms
+			if ($keyforsupportedoauth2array == 'OAUTH_GITHUB_NAME') {
+				// List of keys that will be converted into scopes (from constants 'SCOPE_state_in_uppercase' in file of service).
+				// We pass this param list in to 'state' because we need it before and after the redirect.
+
+				// Note: github does not accept csrf key inside the state parameter (only known values)
+				$urltorenew = $urlwithroot.'/core/modules/oauth/github_oauthcallback.php?shortscope='.urlencode($shortscope).'&state='.urlencode($shortscope).'&backtourl='.urlencode(DOL_URL_ROOT.'/admin/oauthlogintokens.php');
+				$urltodelete = $urlwithroot.'/core/modules/oauth/github_oauthcallback.php?action=delete&token='.newToken().'&backtourl='.urlencode(DOL_URL_ROOT.'/admin/oauthlogintokens.php');
+				$urltocheckperms = 'https://github.com/settings/applications/';
+			} elseif ($keyforsupportedoauth2array == 'OAUTH_GOOGLE_NAME') {
+				// List of keys that will be converted into scopes (from constants 'SCOPE_state_in_uppercase' in file of service).
+				// List of scopes for Google are here: https://developers.google.com/identity/protocols/oauth2/scopes
+				// We pass this key list into the param 'state' because we need it before and after the redirect.
+				$urltorenew = $urlwithroot.'/core/modules/oauth/google_oauthcallback.php?shortscope='.urlencode($shortscope).'&state='.urlencode($state).'-'.$oauthstateanticsrf.'&backtourl='.urlencode(DOL_URL_ROOT.'/admin/oauthlogintokens.php');
+				$urltodelete = $urlwithroot.'/core/modules/oauth/google_oauthcallback.php?action=delete&token='.newToken().'&backtourl='.urlencode(DOL_URL_ROOT.'/admin/oauthlogintokens.php');
+				$urltocheckperms = 'https://security.google.com/settings/security/permissions';
+			} elseif (!empty($supportedoauth2array[$keyforsupportedoauth2array]['returnurl'])) {
+				$urltorenew = $urlwithroot.$supportedoauth2array[$keyforsupportedoauth2array]['returnurl'].'?shortscope='.urlencode($shortscope).'&state='.urlencode($state).'&backtourl='.urlencode(DOL_URL_ROOT.'/admin/oauthlogintokens.php');
+				$urltodelete = $urlwithroot.$supportedoauth2array[$keyforsupportedoauth2array]['returnurl'].'?action=delete&token='.newToken().'&backtourl='.urlencode(DOL_URL_ROOT.'/admin/oauthlogintokens.php');
+				$urltocheckperms = '';
+			} else {
+				$urltorenew = '';
+				$urltodelete = '';
+				$urltocheckperms = '';
+			}
 
-		if ($urltorenew) {
-			$urltorenew .= '&keyforprovider='.urlencode($keyforprovider);
-		}
-		if ($urltodelete) {
-			$urltodelete .= '&keyforprovider='.urlencode($keyforprovider);
-		}
+			if ($urltorenew) {
+				$urltorenew .= '&keyforprovider='.urlencode($keyforprovider);
+			}
+			if ($urltodelete) {
+				$urltodelete .= '&keyforprovider='.urlencode($keyforprovider);
+			}
 
-		// Show value of token
-		$tokenobj = null;
-		// Token
-		require_once DOL_DOCUMENT_ROOT.'/includes/OAuth/bootstrap.php';
-		// Dolibarr storage
-		$storage = new DoliStorage($db, $conf, $keyforprovider);
-		try {
-			// $OAUTH_SERVICENAME is for example 'Google-keyforprovider'
-			print '<!-- '.$OAUTH_SERVICENAME.' -->'."\n";
-			$tokenobj = $storage->retrieveAccessToken($OAUTH_SERVICENAME);
-			//print $storage->token.'<br>';
-			//print $tokenobj->getExtraParams()['id_token'].'<br>';
-			//print $tokenobj->getAccessToken().'<br>';
-		} catch (Exception $e) {
-			// Return an error if token not found
-			//print $e->getMessage();
-		}
+			// Show value of token
+			$tokenobj = null;
+			// Token
+			require_once DOL_DOCUMENT_ROOT.'/includes/OAuth/bootstrap.php';
+			// Dolibarr storage
+			$storage = new DoliStorage($db, $conf, $keyforprovider);
+			try {
+				// $OAUTH_SERVICENAME is for example 'Google-keyforprovider'
+				print '<!-- '.$OAUTH_SERVICENAME.' -->'."\n";
+				$tokenobj = $storage->retrieveAccessToken($OAUTH_SERVICENAME);
+				//print $storage->token.'<br>';
+				//print $tokenobj->getExtraParams()['id_token'].'<br>';
+				//print $tokenobj->getAccessToken().'<br>';
+			} catch (Exception $e) {
+				// Return an error if token not found
+				//print $e->getMessage();
+			}
 
-		// Set other properties
-		$refreshtoken = false;
-		$expiredat = '';
+			// Set other properties
+			$refreshtoken = false;
+			$expiredat = '';
 
-		$expire = false;
-		// Is token expired or will token expire in the next 30 seconds
-		if (is_object($tokenobj)) {
-			$expire = ($tokenobj->getEndOfLife() !== $tokenobj::EOL_NEVER_EXPIRES && $tokenobj->getEndOfLife() !== $tokenobj::EOL_UNKNOWN && time() > ($tokenobj->getEndOfLife() - 30));
-		}
-		if ($key[1] != '' && $key[2] != '') {
+			$expire = false;
+			// Is token expired or will token expire in the next 30 seconds
 			if (is_object($tokenobj)) {
-				$refreshtoken = $tokenobj->getRefreshToken();
-
-				$endoflife = $tokenobj->getEndOfLife();
-				if ($endoflife == $tokenobj::EOL_NEVER_EXPIRES) {
-					$expiredat = $langs->trans("Never");
-				} elseif ($endoflife == $tokenobj::EOL_UNKNOWN) {
-					$expiredat = $langs->trans("Unknown");
-				} else {
-					$expiredat = dol_print_date($endoflife, "dayhour", 'tzuserrel');
+				$expire = ($tokenobj->getEndOfLife() !== $tokenobj::EOL_NEVER_EXPIRES && $tokenobj->getEndOfLife() !== $tokenobj::EOL_UNKNOWN && time() > ($tokenobj->getEndOfLife() - 30));
+			}
+			if ($key[1] != '' && $key[2] != '') {
+				if (is_object($tokenobj)) {
+					$refreshtoken = $tokenobj->getRefreshToken();
+
+					$endoflife = $tokenobj->getEndOfLife();
+					if ($endoflife == $tokenobj::EOL_NEVER_EXPIRES) {
+						$expiredat = $langs->trans("Never");
+					} elseif ($endoflife == $tokenobj::EOL_UNKNOWN) {
+						$expiredat = $langs->trans("Unknown");
+					} else {
+						$expiredat = dol_print_date($endoflife, "dayhour", 'tzuserrel');
+					}
 				}
 			}
-		}
-
-		$submit_enabled = 0;
-
-		print '<form method="post" action="'.$_SERVER["PHP_SELF"].'?mode=setup&amp;driver='.$driver.'" autocomplete="off">';
-		print '<input type="hidden" name="token" value="'.newToken().'">';
-		print '<input type="hidden" name="action" value="setconst">';
 
-		print '<div class="div-table-responsive-no-min">';
-		print '<table class="noborder centpercent">'."\n";
+			$submit_enabled = 0;
 
-		// Api Name
-		$label = $langs->trans($keyforsupportedoauth2array);
-		print '<tr class="liste_titre">';
-		print '<th class="titlefieldcreate">';
-		print img_picto('', $supportedoauth2array[$keyforsupportedoauth2array]['picto'], 'class="pictofixedwidth"');
-		if ($label == $keyforsupportedoauth2array) {
-			print $supportedoauth2array[$keyforsupportedoauth2array]['name'];
-		} else {
-			print $label;
-		}
-		if ($keyforprovider) {
-			print ' (<b>'.$keyforprovider.'</b>)';
-		} else {
-			print ' (<b>'.$langs->trans("NoName").'</b>)';
-		}
-		print '</th>';
-		print '<th></th>';
-		print '<th></th>';
-		print "</tr>\n";
+			print '<form method="post" action="'.$_SERVER["PHP_SELF"].'?mode=setup&amp;driver='.$driver.'" autocomplete="off">';
+			print '<input type="hidden" name="token" value="'.newToken().'">';
+			print '<input type="hidden" name="action" value="setconst">';
 
-		print '<tr class="oddeven">';
-		print '<td'.(empty($key['required']) ? '' : ' class="required"').'>';
-		//var_dump($key);
-		print $langs->trans("OAuthIDSecret").'</td>';
-		print '<td>';
-		print '<span class="opacitymedium">'.$langs->trans("SeePreviousTab").'</span>';
-		print '</td>';
-		print '<td>';
-		print '</td>';
-		print '</tr>'."\n";
-
-		// Scopes
-		print '<tr class="oddeven">';
-		print '<td>'.$langs->trans("Scopes").'</td>';
-		print '<td colspan="2">';
-		$currentscopes = getDolGlobalString($key[4]);
-		print $currentscopes;
-		print '</td></tr>';
+			print '<div class="div-table-responsive-no-min">';
+			print '<table class="noborder centpercent">'."\n";
 
-		print '<tr class="oddeven">';
-		print '<td'.(empty($key['required']) ? '' : ' class="required"').'>';
-		//var_dump($key);
-		print $langs->trans("IsTokenGenerated");
-		print '</td>';
-		print '<td>';
-		if (is_object($tokenobj)) {
-			print $form->textwithpicto(yn(1), $langs->trans("HasAccessToken").' : '.dol_print_date($storage->date_modification, 'dayhour').' state='.dol_escape_htmltag($storage->state));
-		} else {
-			print '<span class="opacitymedium">'.$langs->trans("NoAccessToken").'</span>';
-		}
-		print '</td>';
-		print '<td width="50%">';
-		// Links to delete/checks token
-		if (is_object($tokenobj)) {
-			//test on $storage->hasAccessToken($OAUTH_SERVICENAME) ?
-			if ($urltodelete) {
-				print '<a class="button smallpaddingimp" href="'.$urltodelete.'">'.$langs->trans('DeleteAccess').'</a><br>';
+			// Api Name
+			$label = $langs->trans($keyforsupportedoauth2array);
+			print '<tr class="liste_titre">';
+			print '<th class="titlefieldcreate">';
+			print img_picto('', $supportedoauth2array[$keyforsupportedoauth2array]['picto'], 'class="pictofixedwidth"');
+			if ($label == $keyforsupportedoauth2array) {
+				print $supportedoauth2array[$keyforsupportedoauth2array]['name'];
 			} else {
-				print '<span class="opacitymedium">'.$langs->trans('GoOnTokenProviderToDeleteToken').'</span><br>';
+				print $label;
 			}
-		}
-		// Request remote token
-		if ($urltorenew) {
-			print '<a class="button smallpaddingimp" href="'.$urltorenew.'">'.$langs->trans('GetAccess').'</a>';
-			print $form->textwithpicto('', $langs->trans('RequestAccess'));
-			print '<br>';
-		}
-		// Check remote access
-		if ($urltocheckperms) {
-			print '<br>'.$langs->trans("ToCheckDeleteTokenOnProvider", $OAUTH_SERVICENAME).': <a href="'.$urltocheckperms.'" target="_'.strtolower($OAUTH_SERVICENAME).'">'.$urltocheckperms.'</a>';
-		}
-		print '</td>';
-		print '</tr>';
-
-		print '<tr class="oddeven">';
-		print '<td'.(empty($key['required']) ? '' : ' class="required"').'>';
-		//var_dump($key);
-		print $langs->trans("Token").'</td>';
-		print '<td colspan="2">';
-
-		if (is_object($tokenobj)) {
-			$tokentoshow = $tokenobj->getAccessToken();
-			print '<span class="" title="'.dol_escape_htmltag($tokentoshow).'">'.showValueWithClipboardCPButton($tokentoshow, 1, dol_trunc($tokentoshow, 32)).'</span><br>';
-			//print 'Refresh: '.$tokenobj->getRefreshToken().'<br>';
-			//print 'EndOfLife: '.$tokenobj->getEndOfLife().'<br>';
-			//var_dump($tokenobj->getExtraParams());
-			/*print '<br>Extra: <br><textarea class="quatrevingtpercent">';
-			print ''.join(',',$tokenobj->getExtraParams());
-			print '</textarea>';*/
-		}
-		print '</td>';
-		print '</tr>'."\n";
+			if ($keyforprovider) {
+				print ' (<b>'.$keyforprovider.'</b>)';
+			} else {
+				print ' (<b>'.$langs->trans("NoName").'</b>)';
+			}
+			print '</th>';
+			print '<th></th>';
+			print '<th></th>';
+			print "</tr>\n";
 
-		if (is_object($tokenobj)) {
-			// Token refresh
 			print '<tr class="oddeven">';
 			print '<td'.(empty($key['required']) ? '' : ' class="required"').'>';
 			//var_dump($key);
-			print $langs->trans("TOKEN_REFRESH");
+			print $langs->trans("OAuthIDSecret").'</td>';
+			print '<td>';
+			print '<span class="opacitymedium">'.$langs->trans("SeePreviousTab").'</span>';
 			print '</td>';
-			print '<td colspan="2">';
-			print '<span class="" title="'.dol_escape_htmltag($refreshtoken).'">'.showValueWithClipboardCPButton($refreshtoken, 1, dol_trunc($refreshtoken, 32)).'</span>';
+			print '<td>';
 			print '</td>';
-			print '</tr>';
+			print '</tr>'."\n";
+
+			// Scopes
+			print '<tr class="oddeven">';
+			print '<td>'.$langs->trans("Scopes").'</td>';
+			print '<td colspan="2">';
+			$currentscopes = getDolGlobalString($key[4]);
+			print $currentscopes;
+			print '</td></tr>';
 
-			// Token expired
 			print '<tr class="oddeven">';
 			print '<td'.(empty($key['required']) ? '' : ' class="required"').'>';
 			//var_dump($key);
-			print $langs->trans("TOKEN_EXPIRED");
+			print $langs->trans("IsTokenGenerated");
 			print '</td>';
-			print '<td colspan="2">';
-			print yn($expire);
+			print '<td>';
+			if (is_object($tokenobj)) {
+				print $form->textwithpicto(yn(1), $langs->trans("HasAccessToken").' : '.dol_print_date($storage->date_modification, 'dayhour').' state='.dol_escape_htmltag($storage->state));
+			} else {
+				print '<span class="opacitymedium">'.$langs->trans("NoAccessToken").'</span>';
+			}
+			print '</td>';
+			print '<td width="50%">';
+			// Links to delete/checks token
+			if (is_object($tokenobj)) {
+				//test on $storage->hasAccessToken($OAUTH_SERVICENAME) ?
+				if ($urltodelete) {
+					print '<a class="button smallpaddingimp" href="'.$urltodelete.'">'.$langs->trans('DeleteAccess').'</a><br>';
+				} else {
+					print '<span class="opacitymedium">'.$langs->trans('GoOnTokenProviderToDeleteToken').'</span><br>';
+				}
+			}
+			// Request remote token
+			if ($urltorenew) {
+				print '<a class="button smallpaddingimp" href="'.$urltorenew.'">'.$langs->trans('GetAccess').'</a>';
+				print $form->textwithpicto('', $langs->trans('RequestAccess'));
+				print '<br>';
+			}
+			// Check remote access
+			if ($urltocheckperms) {
+				print '<br>'.$langs->trans("ToCheckDeleteTokenOnProvider", $OAUTH_SERVICENAME).': <a href="'.$urltocheckperms.'" target="_'.strtolower($OAUTH_SERVICENAME).'">'.$urltocheckperms.'</a>';
+			}
 			print '</td>';
 			print '</tr>';
 
-			// Token expired at
 			print '<tr class="oddeven">';
 			print '<td'.(empty($key['required']) ? '' : ' class="required"').'>';
 			//var_dump($key);
-			print $langs->trans("TOKEN_EXPIRE_AT");
-			print '</td>';
+			print $langs->trans("Token").'</td>';
 			print '<td colspan="2">';
-			print $expiredat;
+
+			if (is_object($tokenobj)) {
+				$tokentoshow = $tokenobj->getAccessToken();
+				print '<span class="" title="'.dol_escape_htmltag($tokentoshow).'">'.showValueWithClipboardCPButton($tokentoshow, 1, dol_trunc($tokentoshow, 32)).'</span><br>';
+				//print 'Refresh: '.$tokenobj->getRefreshToken().'<br>';
+				//print 'EndOfLife: '.$tokenobj->getEndOfLife().'<br>';
+				//var_dump($tokenobj->getExtraParams());
+				/*print '<br>Extra: <br><textarea class="quatrevingtpercent">';
+				 print ''.join(',',$tokenobj->getExtraParams());
+				 print '</textarea>';*/
+			}
 			print '</td>';
-			print '</tr>';
-		}
+			print '</tr>'."\n";
+
+			if (is_object($tokenobj)) {
+				// Token refresh
+				print '<tr class="oddeven">';
+				print '<td'.(empty($key['required']) ? '' : ' class="required"').'>';
+				//var_dump($key);
+				print $langs->trans("TOKEN_REFRESH");
+				print '</td>';
+				print '<td colspan="2">';
+				print '<span class="" title="'.dol_escape_htmltag($refreshtoken).'">'.showValueWithClipboardCPButton($refreshtoken, 1, dol_trunc($refreshtoken, 32)).'</span>';
+				print '</td>';
+				print '</tr>';
+
+				// Token expired
+				print '<tr class="oddeven">';
+				print '<td'.(empty($key['required']) ? '' : ' class="required"').'>';
+				//var_dump($key);
+				print $langs->trans("TOKEN_EXPIRED");
+				print '</td>';
+				print '<td colspan="2">';
+				print yn($expire);
+				print '</td>';
+				print '</tr>';
+
+				// Token expired at
+				print '<tr class="oddeven">';
+				print '<td'.(empty($key['required']) ? '' : ' class="required"').'>';
+				//var_dump($key);
+				print $langs->trans("TOKEN_EXPIRE_AT");
+				print '</td>';
+				print '<td colspan="2">';
+				print $expiredat;
+				print '</td>';
+				print '</tr>';
+			}
 
-		print '</table>';
-		print '</div>';
+			print '</table>';
+			print '</div>';
 
-		if (!empty($driver)) {
-			if ($submit_enabled) {
-				print $form->buttonsSaveCancel("Modify", '');
+			if (!empty($driver)) {
+				if ($submit_enabled) {
+					print $form->buttonsSaveCancel("Modify", '');
+				}
 			}
-		}
 
-		print '</form>';
-		print '<br>';
+			print '</form>';
+			print '<br>';
+		}
 	}
 }
 

+ 1 - 1
htdocs/core/lib/ticket.lib.php

@@ -162,7 +162,7 @@ function showDirectPublicLink($object)
 	$email = CMailFile::getValidAddress($object->origin_email, 2);
 	$url = '';
 	if ($email) {
-		$url = dol_buildpath('/public/ticket/view.php', 3).'?track_id='.$object->track_id.'&email='.$email;
+		$url = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', dol_buildpath('/public/ticket/', 3)).'view.php?track_id='.$object->track_id.'&email='.$email;
 	}
 
 	$out = '';

+ 3 - 1
htdocs/core/triggers/interface_50_modTicket_TicketEmail.class.php

@@ -427,7 +427,9 @@ class InterfaceTicketEmail extends DolibarrTriggers
 			$message = dol_nl2br($message);
 		}
 		$message_customer .= '<p>'.$langs->trans('Message').' : <br><br>'.$message.'</p><br>';
-		$url_public_ticket = ($conf->global->TICKET_URL_PUBLIC_INTERFACE ? getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE') . '/view.php' : dol_buildpath('/public/ticket/view.php', 2)).'?track_id='.$object->track_id;
+
+		$url_public_ticket = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', dol_buildpath('/public/ticket/', 2)).'view.php?track_id='.$object->track_id;
+
 		$message_customer .= '<p>'.$langs->trans($see_ticket).' : <a href="'.$url_public_ticket.'">'.$url_public_ticket.'</a></p>';
 		$message_customer .= '<p>'.$langs->trans('TicketEmailPleaseDoNotReplyToThisEmail').'</p>';
 

+ 23 - 4
htdocs/emailcollector/class/emailcollector.class.php

@@ -1294,6 +1294,8 @@ class EmailCollector extends CommonObject
 				if (strpos($rule['rulevalue'], '!') === 0) {
 					// The value start with !, so we exclude the criteria
 					$not = 'NOT ';
+					// Then remove the ! from the string for next filters
+					$rule['rulevalue'] = substr($rule['rulevalue'], 1);
 				}
 
 				if ($rule['type'] == 'from') {
@@ -1432,6 +1434,8 @@ class EmailCollector extends CommonObject
 				if (strpos($rule['rulevalue'], '!') === 0) {
 					// The value start with !, so we exclude the criteria
 					$not = 'NOT ';
+					// Then remove the ! from the string for next filters
+					$rule['rulevalue'] = substr($rule['rulevalue'], 1);
 				}
 
 				if ($rule['type'] == 'from') {
@@ -2410,10 +2414,25 @@ class EmailCollector extends CommonObject
 										if ($operation['type'] == 'loadthirdparty') {
 											dol_syslog("Third party with id=".$idtouseforthirdparty." email=".$emailtouseforthirdparty." name=".$nametouseforthirdparty." name_alias=".$namealiastouseforthirdparty." was not found");
 
-											$errorforactions++;
-											$langs->load("errors");
-											$this->error = $langs->trans('ErrorFailedToLoadThirdParty', $idtouseforthirdparty, $emailtouseforthirdparty, $nametouseforthirdparty, $namealiastouseforthirdparty);
-											$this->errors[] = $this->error;
+											//search into contacts of thirdparty
+											$resultContact = $contactstatic->fetch('', '', '', $emailtouseforthirdparty);
+											if ($resultContact > 0) {
+												$idtouseforthirdparty = $contactstatic->socid;
+												$result = $thirdpartystatic->fetch($idtouseforthirdparty);
+												if ($result > 0) {
+													dol_syslog("Third party with id=".$idtouseforthirdparty." email=".$emailtouseforthirdparty." name=".$nametouseforthirdparty." name_alias=".$namealiastouseforthirdparty." was found thanks to linked contact search");
+												} else {
+													$errorforactions++;
+													$langs->load("errors");
+													$this->error = $langs->trans('ErrorFailedToLoadThirdParty', $idtouseforthirdparty, $emailtouseforthirdparty, $nametouseforthirdparty, $namealiastouseforthirdparty);
+													$this->errors[] = $this->error;
+												}
+											} else {
+												$errorforactions++;
+												$langs->load("errors");
+												$this->error = $langs->trans('ErrorFailedToLoadThirdParty', $idtouseforthirdparty, $emailtouseforthirdparty, $nametouseforthirdparty, $namealiastouseforthirdparty);
+												$this->errors[] = $this->error;
+											}
 										} elseif ($operation['type'] == 'loadandcreatethirdparty') {
 											dol_syslog("Third party with id=".$idtouseforthirdparty." email=".$emailtouseforthirdparty." name=".$nametouseforthirdparty." name_alias=".$namealiastouseforthirdparty." was not found. We try to create it.");
 

+ 4 - 3
htdocs/public/ticket/create_ticket.php

@@ -111,7 +111,7 @@ if ($reshook < 0) {
 // Add file in email form
 if (empty($reshook)) {
 	if ($cancel) {
-		$backtopage = DOL_URL_ROOT.'/public/ticket/index.php';
+		$backtopage = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', DOL_URL_ROOT.'/public/ticket/');
 
 		header("Location: ".$backtopage);
 		exit;
@@ -392,7 +392,7 @@ if (empty($reshook)) {
 						$message  = (getDolGlobalString('TICKET_MESSAGE_MAIL_NEW') !== '' ? getDolGlobalString('TICKET_MESSAGE_MAIL_NEW') : $langs->transnoentities('TicketNewEmailBody')).'<br><br>';
 						$message .= $langs->transnoentities('TicketNewEmailBodyInfosTicket').'<br>';
 
-						$url_public_ticket = (getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE') !== '' ? getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE') . '/view.php' : dol_buildpath('/public/ticket/view.php', 2)).'?track_id='.$object->track_id;
+						$url_public_ticket = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', dol_buildpath('/public/ticket/', 2)).'view.php?track_id='.$object->track_id;
 						$infos_new_ticket = $langs->transnoentities('TicketNewEmailBodyInfosTrackId', '<a href="'.$url_public_ticket.'" rel="nofollow noopener">'.$object->track_id.'</a>').'<br>';
 						$infos_new_ticket .= $langs->transnoentities('TicketNewEmailBodyInfosTrackUrl').'<br><br>';
 
@@ -505,7 +505,8 @@ if (!getDolGlobalInt('TICKET_ENABLE_PUBLIC_INTERFACE')) {
 }
 
 $arrayofjs = array();
-$arrayofcss = array('/opensurvey/css/style.css', '/ticket/css/styles.css.php');
+
+$arrayofcss = array('/opensurvey/css/style.css', getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', '/ticket/').'css/styles.css.php');
 
 llxHeaderTicket($langs->trans("CreateTicket"), "", 0, 0, $arrayofjs, $arrayofcss);
 

+ 5 - 3
htdocs/public/ticket/index.php

@@ -80,8 +80,8 @@ if (!getDolGlobalString('TICKET_ENABLE_PUBLIC_INTERFACE')) {
 	exit;
 }
 
-$arrayofjs  = array();
-$arrayofcss = array('/ticket/css/styles.css.php');
+$arrayofjs = array();
+$arrayofcss = array(getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', '/ticket/').'css/styles.css.php');
 
 llxHeaderTicket($langs->trans('Tickets'), "", 0, 0, $arrayofjs, $arrayofcss);
 
@@ -90,8 +90,10 @@ print '<div class="ticketpublicarea ticketlargemargin centpercent">';
 print '<p style="text-align: center">'.(getDolGlobalString("TICKET_PUBLIC_TEXT_HOME", '<span class="opacitymedium">'.$langs->trans("TicketPublicDesc")).'</span></p>').'</p>';
 print '<br>';
 
+$baseurl = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', DOL_URL_ROOT.'/public/ticket/');
+
 print '<div class="ticketform">';
-print '<a href="'.DOL_URL_ROOT.'/public/ticket/create_ticket.php?action=create'.(!empty($entity) && isModEnabled('multicompany') ? '&entity='.$entity : '').'&token='.newToken().'" rel="nofollow noopener" class="butAction marginbottomonly"><div class="index_create bigrounded"><span class="fa fa-15 fa-plus-circle valignmiddle btnTitle-icon"></span><br>'.dol_escape_htmltag($langs->trans("CreateTicket")).'</div></a>';
+print '<a href="'.$baseurl . 'create_ticket.php?action=create'.(!empty($entity) && isModEnabled('multicompany')?'&entity='.$entity:'').'&token='.newToken().'" rel="nofollow noopener" class="butAction marginbottomonly"><div class="index_create bigrounded"><span class="fa fa-15 fa-plus-circle valignmiddle btnTitle-icon"></span><br>'.dol_escape_htmltag($langs->trans("CreateTicket")).'</div></a>';
 print '<a href="list.php'.(!empty($entity) && isModEnabled('multicompany') ? '?entity='.$entity : '').'" rel="nofollow noopener" class="butAction marginbottomonly"><div class="index_display bigrounded"><span class="fa fa-15 fa-list-alt valignmiddle btnTitle-icon"></span><br>'.dol_escape_htmltag($langs->trans("ViewMyTicketList")).'</div></a>';
 print '<a href="view.php'.(!empty($entity) && isModEnabled('multicompany') ? '?entity='.$entity : '').'" rel="nofollow noopener" class="butAction marginbottomonly"><div class="index_display bigrounded">'.img_picto('', 'ticket', 'class="fa-15"').'<br>'.dol_escape_htmltag($langs->trans("ShowTicketWithTrackId")).'</div></a>';
 print '<div class="clearboth"></div>';

+ 9 - 7
htdocs/public/ticket/list.php

@@ -92,7 +92,7 @@ if (!isModEnabled('ticket')) {
  */
 
 if ($cancel) {
-	$backtopage = DOL_URL_ROOT.'/public/ticket/index.php';
+	$backtopage = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', DOL_URL_ROOT.'/public/ticket/');
 
 	header("Location: ".$backtopage);
 	exit;
@@ -181,14 +181,14 @@ $user_assign = new User($db);
 $user_create = new User($db);
 $formTicket = new FormTicket($db);
 
-if (!$conf->global->TICKET_ENABLE_PUBLIC_INTERFACE) {
+if (!getDolGlobalString('TICKET_ENABLE_PUBLIC_INTERFACE')) {
 	print '<div class="error">'.$langs->trans('TicketPublicInterfaceForbidden').'</div>';
 	$db->close();
 	exit();
 }
 
 $arrayofjs = array();
-$arrayofcss = array('/ticket/css/styles.css.php');
+$arrayofcss = array(getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', '/ticket/').'css/styles.css.php');
 
 llxHeaderTicket($langs->trans("Tickets"), "", 0, 0, $arrayofjs, $arrayofcss);
 
@@ -481,7 +481,7 @@ if ($action == "view_ticketlist") {
 					print '</td>';
 				}
 
-				if ((getDolGlobalString('TICKET_SHOW_PROGRESSION')) && !empty($arrayfields['t.progress']['checked'])) {
+				if (getDolGlobalString('TICKET_SHOW_PROGRESSION') && !empty($arrayfields['t.progress']['checked'])) {
 					print '<td class="liste_titre"></td>';
 				}
 
@@ -546,7 +546,7 @@ if ($action == "view_ticketlist") {
 				if (!empty($arrayfields['severity.code']['checked'])) {
 					print_liste_field_titre($arrayfields['severity.code']['label'], $url_page_current, 'severity.code', '', $param, '', $sortfield, $sortorder);
 				}
-				if ((getDolGlobalString('TICKET_SHOW_PROGRESSION')) && !empty($arrayfields['t.progress']['checked'])) {
+				if (getDolGlobalString('TICKET_SHOW_PROGRESSION') && !empty($arrayfields['t.progress']['checked'])) {
 					print_liste_field_titre($arrayfields['t.progress']['label'], $url_page_current, 't.progress', '', $param, '', $sortfield, $sortorder);
 				}
 				if (!empty($arrayfields['t.fk_user_create']['checked'])) {
@@ -638,7 +638,7 @@ if ($action == "view_ticketlist") {
 					}
 
 					// Progression
-					if ((getDolGlobalString('TICKET_SHOW_PROGRESSION')) && !empty($arrayfields['t.progress']['checked'])) {
+					if (getDolGlobalString('TICKET_SHOW_PROGRESSION') && !empty($arrayfields['t.progress']['checked'])) {
 						print '<td>';
 						print $obj->progress;
 						print '</td>';
@@ -712,7 +712,9 @@ if ($action == "view_ticketlist") {
 
 				print '</form>';
 
-				print '<form method="post" id="form_view_ticket" name="form_view_ticket" action="'.dol_buildpath('/public/ticket/view.php', 1).(!empty($entity) && isModEnabled('multicompany') ? '?entity='.$entity : '').'" style="display:none;">';
+				$url_public_ticket = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', dol_buildpath('/public/ticket/', 1));
+
+				print '<form method="post" id="form_view_ticket" name="form_view_ticket" action="'.$url_public_ticket.'view.php'.(!empty($entity) && isModEnabled('multicompany')?'?entity='.$entity:'').'" style="display:none;">';
 				print '<input type="hidden" name="token" value="'.newToken().'">';
 				print '<input type="hidden" name="action" value="view_ticket">';
 				print '<input type="hidden" name="btn_view_ticket_list" value="1">';

+ 9 - 5
htdocs/public/ticket/view.php

@@ -85,7 +85,7 @@ if (!isModEnabled('ticket')) {
  */
 
 if ($cancel) {
-	$backtopage = DOL_URL_ROOT.'/public/ticket/index.php';
+	$backtopage = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', DOL_URL_ROOT.'/public/ticket/');
 
 	if (!empty($backtopage)) {
 		header("Location: ".$backtopage);
@@ -229,14 +229,14 @@ $formticket = new FormTicket($db);
 // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
 $hookmanager->initHooks(array('ticketpublicview', 'globalcard'));
 
-if (!$conf->global->TICKET_ENABLE_PUBLIC_INTERFACE) {
+if (!getDolGlobalString('TICKET_ENABLE_PUBLIC_INTERFACE')) {
 	print '<div class="error">'.$langs->trans('TicketPublicInterfaceForbidden').'</div>';
 	$db->close();
 	exit();
 }
 
 $arrayofjs = array();
-$arrayofcss = array('/ticket/css/styles.css.php');
+$arrayofcss = array(getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', '/ticket/').'css/styles.css.php');
 
 llxHeaderTicket($langs->trans("Tickets"), "", 0, 0, $arrayofjs, $arrayofcss);
 
@@ -391,8 +391,10 @@ if ($action == "view_ticket" || $action == "presend" || $action == "close" || $a
 			$formticket->track_id = $object->dao->track_id;
 			$formticket->trackid = 'tic'.$object->dao->id;
 
+			$baseurl = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', DOL_URL_ROOT.'/public/ticket/');
+
 			$formticket->param = array('track_id' => $object->dao->track_id, 'fk_user_create' => '-1',
-									   'returnurl' => DOL_URL_ROOT.'/public/ticket/view.php'.(!empty($entity) && isModEnabled('multicompany') ? '?entity='.$entity : ''));
+									   'returnurl' => $baseurl.'view.php'.(!empty($entity) && isModEnabled('multicompany')?'?entity='.$entity:''));
 
 			$formticket->withfile = 2;
 			$formticket->withcancel = 1;
@@ -401,7 +403,9 @@ if ($action == "view_ticket" || $action == "presend" || $action == "close" || $a
 		}
 
 		if ($action != 'presend') {
-			print '<form method="post" id="form_view_ticket_list" name="form_view_ticket_list" action="'.DOL_URL_ROOT.'/public/ticket/list.php'.(!empty($entity) && isModEnabled('multicompany') ? '?entity='.$entity : '').'">';
+			$baseurl = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', DOL_URL_ROOT.'/public/ticket/');
+
+			print '<form method="post" id="form_view_ticket_list" name="form_view_ticket_list" action="'.$baseurl.'list.php'.(!empty($entity) && isModEnabled('multicompany')?'?entity='.$entity:'').'">';
 			print '<input type="hidden" name="token" value="'.newToken().'">';
 			print '<input type="hidden" name="action" value="view_ticketlist">';
 			print '<input type="hidden" name="track_id" value="'.$object->dao->track_id.'">';

+ 1 - 1
htdocs/ticket/agenda.php

@@ -149,7 +149,7 @@ $userstat = new User($db);
 $formticket = new FormTicket($db);
 
 $title = $langs->trans("Ticket").' - '.$object->ref.' '.$object->name;
-if (getDolGlobalString('MAIN_HTML_TITLE') && preg_match('/ticketnameonly/', $conf->global->MAIN_HTML_TITLE) && $object->name) {
+if (getDolGlobalString('MAIN_HTML_TITLE') && preg_match('/ticketnameonly/', getDolGlobalString('MAIN_HTML_TITLE')) && $object->name) {
 	$title = $object->ref.' '.$object->name.' - '.$langs->trans("Info");
 }
 $help_url = 'EN:Module_Agenda_En|FR:Module_Agenda|DE:Modul_Terminplanung';

+ 5 - 5
htdocs/ticket/card.php

@@ -744,7 +744,7 @@ if ($action == 'create' || $action == 'presend') {
 	$formticket->withfromsocid = $socid ? $socid : $user->socid;
 	$formticket->withfromcontactid = $contactid ? $contactid : '';
 	$formticket->withtitletopic = 1;
-	$formticket->withnotifytiersatcreate = ($notifyTiers ? 1 : (!getDolGlobalString('TICKET_CHECK_NOTIFY_THIRDPARTY_AT_CREATION') ? 0 : 1));
+	$formticket->withnotifytiersatcreate = ($notifyTiers ? 1 : (getDolGlobalString('TICKET_CHECK_NOTIFY_THIRDPARTY_AT_CREATION') ? 1 : 0));
 	$formticket->withusercreate = 0;
 	$formticket->withref = 1;
 	$formticket->fk_user_create = $user->id;
@@ -826,7 +826,7 @@ if ($action == 'create' || $action == 'presend') {
 			}
 
 			// Default select all or no contact
-			$default = (getDolGlobalString('TICKET_NOTIFY_AT_CLOSING')) ? -2 : -3;
+			$default = (getDolGlobalString('TICKET_NOTIFY_AT_CLOSING') ? -2 : -3);
 			$formquestion = array(
 				array(
 					'name' => 'contactid',
@@ -1171,7 +1171,7 @@ if ($action == 'create' || $action == 'presend') {
 			print '<tr><td>';
 			print $form->textwithpicto($langs->trans("TicketDurationAuto"), $langs->trans("TicketDurationAutoInfos"), 1);
 			print '</td><td>';
-			print $foundinter ? convertSecondToTime($timing, 'all', $conf->global->MAIN_DURATION_OF_WORKDAY) : '';
+			print $foundinter ? convertSecondToTime($timing, 'all', getDolGlobalString('MAIN_DURATION_OF_WORKDAY')) : '';
 			print '</td></tr>';
 		}
 
@@ -1363,7 +1363,7 @@ if ($action == 'create' || $action == 'presend') {
 						echo $companystatic->getNomUrl(-1);
 					}
 					if ($tab[$i]['socid'] < 0) {
-						echo $conf->global->MAIN_INFO_SOCIETE_NOM;
+						echo getDolGlobalString('MAIN_INFO_SOCIETE_NOM');
 					}
 					if (!$tab[$i]['socid']) {
 						echo '&nbsp;';
@@ -1618,7 +1618,7 @@ if ($action == 'create' || $action == 'presend') {
 			print showDirectPublicLink($object).'<br>';
 			print '</div>';
 
-			if (!getDolGlobalString('TICKET_SHOW_MESSAGES_ON_CARD')) {
+			if (getDolGlobalString('TICKET_SHOW_MESSAGES_ON_CARD')) {
 				print '<div class="fichehalfright">';
 
 				$MAXEVENT = 10;

+ 1 - 1
htdocs/ticket/class/actions_ticket.class.php

@@ -215,7 +215,7 @@ class ActionsTicket extends CommonHookActions
 			$msg = GETPOSTISSET('message_initial') ? GETPOST('message_initial', 'restricthtml') : $object->message;
 			include_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
 			$uselocalbrowser = true;
-			$ckeditorenabledforticket = $conf->global->FCKEDITOR_ENABLE_TICKET;
+			$ckeditorenabledforticket = getDolGlobalString('FCKEDITOR_ENABLE_TICKET');
 			$doleditor = new DolEditor('message_initial', $msg, '100%', 250, 'dolibarr_details', 'In', true, $uselocalbrowser, $ckeditorenabledforticket, ROWS_9, '95%');
 			$doleditor->Create();
 		} else {

+ 1 - 1
htdocs/ticket/class/cticketcategory.class.php

@@ -73,7 +73,7 @@ class CTicketCategory extends CommonObject
 	 *         Note: Filter can be a string like "(t.ref:like:'SO-%') or (t.date_creation:<:'20160101') or (t.nature:is:NULL)"
 	 *  'label' the translation key.
 	 *  'picto' is code of a picto to show before value in forms
-	 *  'enabled' is a condition when the field must be managed (Example: 1 or '$conf->global->MY_SETUP_PARAM)
+	 *  'enabled' is a condition when the field must be managed (Example: 1 or 'getDolGlobalString('MY_SETUP_PARAM'))
 	 *  'position' is the sort order of field.
 	 *  'notnull' is set to 1 if not null in database. Set to -1 if we must set data to null if empty ('' or 0).
 	 *  'visible' says if field is visible in list (Examples: 0=Not visible, 1=Visible on list and create/update/view forms, 2=Visible on list only, 3=Visible on create/update/view form only (not list), 4=Visible on list and update/view form only (not create). 5=Visible on list and view only (not create/not update). Using a negative value means field is not shown by default on list but can be selected for viewing)

+ 16 - 15
htdocs/ticket/class/ticket.class.php

@@ -296,7 +296,7 @@ class Ticket extends CommonObject
 	 *         Note: Filter can be a string like "(t.ref:like:'SO-%') or (t.date_creation:<:'20160101') or (t.nature:is:NULL)"
 	 *  'label' the translation key.
 	 *  'picto' is code of a picto to show before value in forms
-	 *  'enabled' is a condition when the field must be managed (Example: 1 or '$conf->global->MY_SETUP_PARAM)
+	 *  'enabled' is a condition when the field must be managed (Example: 1 or 'getDolGlobalString('MY_SETUP_PARAM'))
 	 *  'position' is the sort order of field.
 	 *  'notnull' is set to 1 if not null in database. Set to -1 if we must set data to null if empty ('' or 0).
 	 *  'visible' says if field is visible in list (Examples: 0=Not visible, 1=Visible on list and create/update/view forms, 2=Visible on list only, 3=Visible on create/update/view form only (not list), 4=Visible on list and update/view form only (not create). 5=Visible on list and view only (not create/not update). Using a negative value means field is not shown by default on list but can be selected for viewing)
@@ -2343,7 +2343,7 @@ class Ticket extends CommonObject
 		global $conf;
 
 		$defaultref = '';
-		$modele = !getDolGlobalString('TICKET_ADDON') ? 'mod_ticket_simple' : $conf->global->TICKET_ADDON;
+		$modele = getDolGlobalString('TICKET_ADDON', 'mod_ticket_simple');
 
 		// Search template files
 		$file = '';
@@ -2642,17 +2642,17 @@ class Ticket extends CommonObject
 
 						if (empty($sendto)) {
 							if (getDolGlobalString('TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_DEFAULT_EMAIL')) {
-								$sendto[getDolGlobalString('TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_DEFAULT_EMAIL')] = $conf->global->TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_DEFAULT_EMAIL;
+								$sendto[getDolGlobalString('TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_DEFAULT_EMAIL')] = getDolGlobalString('TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_DEFAULT_EMAIL');
 							} elseif (getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO')) {
-								$sendto[getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO')] = $conf->global->TICKET_NOTIFICATION_EMAIL_TO;
+								$sendto[getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO')] = getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO');
 							}
 						}
 
 						// Add global email address recipient
 						if (getDolGlobalString('TICKET_NOTIFICATION_ALSO_MAIN_ADDRESS') &&
-							getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO') && !array_key_exists($conf->global->TICKET_NOTIFICATION_EMAIL_TO, $sendto)
+							getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO') && !array_key_exists(getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO'), $sendto)
 						) {
-							$sendto[getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO')] = $conf->global->TICKET_NOTIFICATION_EMAIL_TO;
+							$sendto[getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO')] = getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO');
 						}
 
 						if (!empty($sendto)) {
@@ -2753,8 +2753,8 @@ class Ticket extends CommonObject
 							$message .= '<br>'.$langs->trans('TicketNotificationEmailBodyInfosTrackUrlinternal').' : <a href="'.$url_internal_ticket.'">'.$object->track_id.'</a><br>';
 
 							// Add global email address recipient
-							if (getDolGlobalString('TICKET_NOTIFICATION_ALSO_MAIN_ADDRESS') !== '' && !array_key_exists(getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO'), $sendto)) {
-								if (getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO') !== '') {
+							if (getDolGlobalString('TICKET_NOTIFICATION_ALSO_MAIN_ADDRESS') && !array_key_exists(getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO'), $sendto)) {
+								if (getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO')) {
 									$sendto[getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO')] = getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO');
 								}
 							}
@@ -2827,6 +2827,7 @@ class Ticket extends CommonObject
 								// If public interface is not enable, use link to internal page into mail
 								$url_public_ticket = (getDolGlobalInt('TICKET_ENABLE_PUBLIC_INTERFACE') ?
 										(getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE') !== '' ? getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE') . '/view.php' : dol_buildpath('/public/ticket/view.php', 2)) : dol_buildpath('/ticket/card.php', 2)).'?track_id='.$object->track_id;
+
 								$message .= '<br>'.$langs->trans('TicketNewEmailBodyInfosTrackUrlCustomer').' : <a href="'.$url_public_ticket.'">'.$object->track_id.'</a><br>';
 
 								// Build final message
@@ -2848,8 +2849,8 @@ class Ticket extends CommonObject
 								}
 
 								// Add global email address recipient
-								if (getDolGlobalString('TICKET_NOTIFICATION_ALSO_MAIN_ADDRESS') !== '' && !array_key_exists(getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO'), $sendto)) {
-									if (getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO') !== '') {
+								if (getDolGlobalString('TICKET_NOTIFICATION_ALSO_MAIN_ADDRESS') && !array_key_exists(getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO'), $sendto)) {
+									if (getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO')) {
 										$sendto[getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO')] = getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO');
 									}
 								}
@@ -2893,7 +2894,7 @@ class Ticket extends CommonObject
 	 *
 	 * @param string $subject          	  Email subject
 	 * @param string $message          	  Email message
-	 * @param int    $send_internal_cc 	  Receive a copy on internal email ($conf->global->TICKET_NOTIFICATION_EMAIL_FROM)
+	 * @param int    $send_internal_cc 	  Receive a copy on internal email (getDolGlobalString('TICKET_NOTIFICATION_EMAIL_FROM')
 	 * @param array  $array_receiver   	  Array of receiver. exemple array('name' => 'John Doe', 'email' => 'john@doe.com', etc...)
 	 * @param array	 $filename_list       List of files to attach (full path of filename on file system)
 	 * @param array	 $mimetype_list       List of MIME type of attached files
@@ -2904,7 +2905,7 @@ class Ticket extends CommonObject
 	{
 		global $conf, $langs, $user;
 
-		if (getDolGlobalInt('TICKET_DISABLE_ALL_MAILS')) {
+		if (getDolGlobalString('TICKET_DISABLE_ALL_MAILS')) {
 			dol_syslog(get_class($this).'::sendTicketMessageByEmail: Emails are disable into ticket setup by option TICKET_DISABLE_ALL_MAILS', LOG_WARNING);
 			return false;
 		}
@@ -2920,6 +2921,7 @@ class Ticket extends CommonObject
 			$array_receiver = array_merge($array_receiver, $this->getInfosTicketExternalContact(1));
 		}
 
+		$sendtocc = "";
 		if ($send_internal_cc) {
 			$sendtocc = getDolGlobalString('TICKET_NOTIFICATION_EMAIL_FROM');
 		} else {
@@ -2938,8 +2940,7 @@ class Ticket extends CommonObject
 				// Send email
 
 				$old_MAIN_MAIL_AUTOCOPY_TO = getDolGlobalString('MAIN_MAIL_AUTOCOPY_TO');
-
-				if (getDolGlobalString('TICKET_DISABLE_MAIL_AUTOCOPY_TO') !== '') {
+				if (getDolGlobalString('TICKET_DISABLE_MAIL_AUTOCOPY_TO')) {
 					$conf->global->MAIN_MAIL_AUTOCOPY_TO = '';
 				}
 
@@ -2974,7 +2975,7 @@ class Ticket extends CommonObject
 					}
 				}
 
-				if (getDolGlobalString('TICKET_DISABLE_MAIL_AUTOCOPY_TO') !== '') {
+				if (getDolGlobalString('TICKET_DISABLE_MAIL_AUTOCOPY_TO')) {
 					$conf->global->MAIN_MAIL_AUTOCOPY_TO = $old_MAIN_MAIL_AUTOCOPY_TO;
 				}
 			}

+ 9 - 9
htdocs/ticket/list.php

@@ -454,9 +454,9 @@ if ($search_dateclose_end) {
 	$sql .= " AND t.date_close <= '".$db->idate($search_dateclose_end)."'";
 }
 
-if (!$user->socid && ($mode == "mine" || (!$user->admin && getDolGlobalInt('TICKET_LIMIT_VIEW_ASSIGNED_ONLY')))) {
+if (!$user->socid && ($mode == "mine" || (!$user->admin && getDolGlobalString('TICKET_LIMIT_VIEW_ASSIGNED_ONLY')))) {
 	$sql .= " AND (t.fk_user_assign = ".((int) $user->id);
-	if (!getDolGlobalInt('TICKET_LIMIT_VIEW_ASSIGNED_ONLY')) {
+	if (!getDolGlobalString('TICKET_LIMIT_VIEW_ASSIGNED_ONLY')) {
 		$sql .= " OR t.fk_user_create = ".((int) $user->id);
 	}
 	$sql .= ")";
@@ -505,7 +505,7 @@ if (!$resql) {
 $num = $db->num_rows($resql);
 
 // Direct jump if only one record found
-if ($num == 1 && getDolGlobalInt('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all && !$page) {
+if ($num == 1 && getDolGlobalString('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all && !$page) {
 	$obj = $db->fetch_object($resql);
 	$id = $obj->rowid;
 	header("Location: ".DOL_URL_ROOT.'/ticket/card.php?id='.$id);
@@ -792,7 +792,7 @@ if ($massaction == 'presendonclose') {
 		"name" => "massaction",
 		"value" => "close"
 	]);
-	$selectedchoice = getDolGlobalInt('TICKET_NOTIFY_AT_CLOSING') ? "yes" : "no";
+	$selectedchoice = getDolGlobalString('TICKET_NOTIFY_AT_CLOSING') ? "yes" : "no";
 	print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassTicketClosingSendEmail"), $langs->trans("ConfirmMassTicketClosingSendEmailQuestion"), 'confirm_send_close', $hidden_form, $selectedchoice, 0, 200, 500, 1);
 }
 
@@ -1152,14 +1152,14 @@ while ($i < $imaxinloop) {
 						$date_last_msg_sent = (int) $object->date_last_msg_sent;
 						$hour_diff = ($now - $date_last_msg_sent) / 3600 ;
 
-						if (!empty($conf->global->TICKET_DELAY_BEFORE_FIRST_RESPONSE && $date_last_msg_sent == 0)) {
+						if (getDolGlobalString('TICKET_DELAY_BEFORE_FIRST_RESPONSE') && $date_last_msg_sent == 0) {
 							$creation_date =  $object->datec;
 							$hour_diff_creation = ($now - $creation_date) / 3600 ;
-							if ($hour_diff_creation > $conf->global->TICKET_DELAY_BEFORE_FIRST_RESPONSE) {
-								print " " . img_picto($langs->trans('Late') . ' : ' . $langs->trans('TicketsDelayForFirstResponseTooLong', $conf->global->TICKET_DELAY_BEFORE_FIRST_RESPONSE), 'warning', 'style="color: red;"', false, 0, 0, '', '');
+							if ($hour_diff_creation > getDolGlobalString('TICKET_DELAY_BEFORE_FIRST_RESPONSE')) {
+								print " " . img_picto($langs->trans('Late') . ' : ' . $langs->trans('TicketsDelayForFirstResponseTooLong', getDolGlobalString('TICKET_DELAY_BEFORE_FIRST_RESPONSE')), 'warning', 'style="color: red;"', false, 0, 0, '', '');
 							}
-						} elseif (getDolGlobalString('TICKET_DELAY_SINCE_LAST_RESPONSE') && $hour_diff > $conf->global->TICKET_DELAY_SINCE_LAST_RESPONSE) {
-							print " " . img_picto($langs->trans('Late') . ' : ' . $langs->trans('TicketsDelayFromLastResponseTooLong', $conf->global->TICKET_DELAY_SINCE_LAST_RESPONSE), 'warning');
+						} elseif (getDolGlobalString('TICKET_DELAY_SINCE_LAST_RESPONSE') && $hour_diff > getDolGlobalInt('TICKET_DELAY_SINCE_LAST_RESPONSE')) {
+							print " " . img_picto($langs->trans('Late') . ' : ' . $langs->trans('TicketsDelayFromLastResponseTooLong', getDolGlobalString('TICKET_DELAY_SINCE_LAST_RESPONSE')), 'warning');
 						}
 					}
 				} else {	// Example: key=fk_soc, obj->key=123 val=array('type'=>'integer', ...

+ 1 - 1
htdocs/ticket/messaging.php

@@ -146,7 +146,7 @@ $userstat = new User($db);
 $formticket = new FormTicket($db);
 
 $title = $langs->trans("Ticket").' - '.$object->ref.' '.$object->name;
-if (getDolGlobalString('MAIN_HTML_TITLE') && preg_match('/ticketnameonly/', $conf->global->MAIN_HTML_TITLE) && $object->name) {
+if (getDolGlobalString('MAIN_HTML_TITLE') && preg_match('/ticketnameonly/', getDolGlobalString('MAIN_HTML_TITLE')) && $object->name) {
 	$title = $object->ref.' '.$object->name.' - '.$langs->trans("Info");
 }
 $help_url = 'FR:DocumentationModuleTicket';

+ 1 - 1
htdocs/ticket/stats/index.php

@@ -47,7 +47,7 @@ if ($user->socid > 0) {
 
 $nowyear = dol_print_date(dol_now('gmt'), "%Y", 'gmt');
 $year = GETPOST('year') > 0 ? GETPOST('year', 'int') : $nowyear;
-$startyear = $year - (!getDolGlobalString('MAIN_STATS_GRAPHS_SHOW_N_YEARS') ? 2 : max(1, min(10, getDolGlobalString('MAIN_STATS_GRAPHS_SHOW_N_YEARS'))));
+$startyear = $year - (!getDolGlobalString('MAIN_STATS_GRAPHS_SHOW_N_YEARS') ? 2 : max(1, min(10, getDolGlobalInt('MAIN_STATS_GRAPHS_SHOW_N_YEARS'))));
 $endyear = $year;
 
 // Load translation files required by the page

+ 1 - 1
htdocs/ticket/tpl/linkedobjectblock.tpl.php

@@ -46,7 +46,7 @@ foreach ($linkedObjectBlock as $key => $objectlink) {
 	} ?>
 	<tr class="<?php echo $trclass; ?>" >
 		<td class="linkedcol-element tdoverflowmax100"><?php echo $langs->trans("Ticket"); ?>
-		<?php if (!empty($showImportButton) && $conf->global->MAIN_ENABLE_IMPORT_LINKED_OBJECT_LINES) {
+		<?php if (!empty($showImportButton) && getDolGlobalString('MAIN_ENABLE_IMPORT_LINKED_OBJECT_LINES')) {
 			print '<a class="objectlinked_importbtn" href="'.$objectlink->getNomUrl(0, '', 0, 1).'&amp;action=selectlines"  data-element="'.$objectlink->element.'"  data-id="'.$objectlink->id.'"  > <i class="fa fa-indent"></i> </a';
 		} ?>
 		</td>