Merge remote-tracking branch 'upstream/develop' into 15a14
This commit is contained in:
commit
573d45fec8
@ -57,7 +57,7 @@ jobs:
|
||||
php: nightly
|
||||
env: DB=mysql
|
||||
- stage: PHP Dev
|
||||
if: type = push AND branch = 14.0
|
||||
if: type = push AND branch = 15.0
|
||||
php: nightly
|
||||
env: DB=mysql
|
||||
|
||||
@ -411,6 +411,12 @@ script:
|
||||
php upgrade.php 13.0.0 14.0.0 ignoredbversion > $TRAVIS_BUILD_DIR/upgrade13001400.log
|
||||
php upgrade2.php 13.0.0 14.0.0 > $TRAVIS_BUILD_DIR/upgrade13001400-2.log
|
||||
php step5.php 13.0.0 14.0.0 > $TRAVIS_BUILD_DIR/upgrade13001400-3.log
|
||||
php upgrade.php 14.0.0 15.0.0 ignoredbversion > $TRAVIS_BUILD_DIR/upgrade14001500.log
|
||||
php upgrade2.php 14.0.0 15.0.0 > $TRAVIS_BUILD_DIR/upgrade14001500-2.log
|
||||
php step5.php 14.0.0 15.0.0 > $TRAVIS_BUILD_DIR/upgrade14001500-3.log
|
||||
php upgrade.php 15.0.0 16.0.0 ignoredbversion > $TRAVIS_BUILD_DIR/upgrade15001600.log
|
||||
php upgrade2.php 15.0.0 16.0.0 > $TRAVIS_BUILD_DIR/upgrade15001600-2.log
|
||||
php step5.php 15.0.0 16.0.0 > $TRAVIS_BUILD_DIR/upgrade15001600-3.log
|
||||
ls -alrt $TRAVIS_BUILD_DIR/
|
||||
|
||||
- |
|
||||
|
||||
@ -138,6 +138,8 @@ NEW: Hidden option API_DISABLE_COMPRESSION is now visible in API setup page.
|
||||
NEW: Add hook printUnderHeaderPDFline on invoice PDF templates (can be used for example to add a barcode or more information on header of invoices).
|
||||
|
||||
Following changes may create regressions for some external modules, but were necessary to make Dolibarr better:
|
||||
* ALL EXTERNAL MODULES THAT WERE NOT CORRECTLY DEVELOPPED WILL NOT WORK ON V15 (All modules that forgot to manage the security token field
|
||||
into forms will be broken. The security token field is expected since Dolibarr v9 but a lot of external modules did not implement it).
|
||||
* Update hook 'printOriginObjectLine', removed check on product type and special code. Need now reshook.
|
||||
* Old deprecated module "SimplePOS" has been completely removed. Use module "TakePOS" is you need a Point Of Sale.
|
||||
* The method static ActionComm::getActions($db, ...) is no more static. Use $actioncomm->getActions(...) instead (without $db param).
|
||||
|
||||
@ -67,7 +67,7 @@ Scope is the web application (back office) and the APIs.
|
||||
* Remote code execution (RCE)
|
||||
* Local files access and manipulation (LFI, RFI, XXE, SSRF, XSPA)
|
||||
* Code injections (HTML, JS, SQL, PHP, ...)
|
||||
* Cross-Site Scripting (XSS), except from setup page of module "External web site" (allowing any content here, editable by admin user only, is accepted on purpose or into module "Web site" when permission to edit website content is allowed).
|
||||
* Cross-Site Scripting (XSS), except from setup page of module "External web site" (allowing any content here, editable by admin user only, is accepted on purpose) and except into module "Web site" when permission to edit website content is allowed (injecting any data in this case is allowed too).
|
||||
* Cross-Site Requests Forgery (CSRF) with real security impact (when using GET URLs, CSRF are qualified only for creating, updating or deleting data from pages restricted to admin users)
|
||||
* Open redirect
|
||||
* Broken authentication & session management
|
||||
|
||||
@ -275,7 +275,7 @@ dol_htmloutput_errors($mesg);
|
||||
|
||||
print '<br>';
|
||||
|
||||
print img_picto('', 'puce').' '.$langs->trans("DocForAllMembersCards", (!empty($conf->global->ADHERENT_CARD_TYPE) ? $conf->global->ADHERENT_CARD_TYPE : $langs->transnoentitiesnoconv("None"))).' ';
|
||||
print img_picto('', 'card').' '.$langs->trans("DocForAllMembersCards", (!empty($conf->global->ADHERENT_CARD_TYPE) ? $conf->global->ADHERENT_CARD_TYPE : $langs->transnoentitiesnoconv("None"))).' ';
|
||||
print '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">';
|
||||
print '<input type="hidden" name="token" value="'.newToken().'">';
|
||||
print '<input type="hidden" name="foruserid" value="all">';
|
||||
@ -289,12 +289,12 @@ foreach (array_keys($_Avery_Labels) as $codecards) {
|
||||
}
|
||||
asort($arrayoflabels);
|
||||
print $form->selectarray('modelcard', $arrayoflabels, (GETPOST('modelcard') ? GETPOST('modelcard') : (empty($conf->global->ADHERENT_CARD_TYPE) ? '' : $conf->global->ADHERENT_CARD_TYPE)), 1, 0, 0, '', 0, 0, 0, '', '', 1);
|
||||
print '<br><input type="submit" class="button" value="'.$langs->trans("BuildDoc").'">';
|
||||
print '<br><input type="submit" class="button small" value="'.$langs->trans("BuildDoc").'">';
|
||||
print '</form>';
|
||||
|
||||
print '<br><br>';
|
||||
|
||||
print img_picto('', 'puce').' '.$langs->trans("DocForOneMemberCards", (!empty($conf->global->ADHERENT_CARD_TYPE) ? $conf->global->ADHERENT_CARD_TYPE : $langs->transnoentitiesnoconv("None"))).' ';
|
||||
print img_picto('', 'card').' '.$langs->trans("DocForOneMemberCards", (!empty($conf->global->ADHERENT_CARD_TYPE) ? $conf->global->ADHERENT_CARD_TYPE : $langs->transnoentitiesnoconv("None"))).' ';
|
||||
print '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">';
|
||||
print '<input type="hidden" name="token" value="'.newToken().'">';
|
||||
print '<input type="hidden" name="mode" value="cardlogin">';
|
||||
@ -308,12 +308,12 @@ foreach (array_keys($_Avery_Labels) as $codecards) {
|
||||
asort($arrayoflabels);
|
||||
print $form->selectarray('model', $arrayoflabels, (GETPOST('model') ?GETPOST('model') : (empty($conf->global->ADHERENT_CARD_TYPE) ? '' : $conf->global->ADHERENT_CARD_TYPE)), 1, 0, 0, '', 0, 0, 0, '', '', 1);
|
||||
print '<br>'.$langs->trans("Login").': <input size="10" type="text" name="foruserlogin" value="'.GETPOST('foruserlogin').'">';
|
||||
print '<br><input type="submit" class="button" value="'.$langs->trans("BuildDoc").'">';
|
||||
print '<br><input type="submit" class="button small" value="'.$langs->trans("BuildDoc").'">';
|
||||
print '</form>';
|
||||
|
||||
print '<br><br>';
|
||||
|
||||
print img_picto('', 'puce').' '.$langs->trans("DocForLabels", (empty($conf->global->ADHERENT_ETIQUETTE_TYPE) ? '' : $conf->global->ADHERENT_ETIQUETTE_TYPE)).' ';
|
||||
print img_picto('', 'card').' '.$langs->trans("DocForLabels", (empty($conf->global->ADHERENT_ETIQUETTE_TYPE) ? '' : $conf->global->ADHERENT_ETIQUETTE_TYPE)).' ';
|
||||
print '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">';
|
||||
print '<input type="hidden" name="token" value="'.newToken().'">';
|
||||
print '<input type="hidden" name="mode" value="label">';
|
||||
@ -326,7 +326,7 @@ foreach (array_keys($_Avery_Labels) as $codecards) {
|
||||
}
|
||||
asort($arrayoflabels);
|
||||
print $form->selectarray('modellabel', $arrayoflabels, (GETPOST('modellabel') ? GETPOST('modellabel') : (empty($conf->global->ADHERENT_ETIQUETTE_TYPE) ? '' : $conf->global->ADHERENT_ETIQUETTE_TYPE)), 1, 0, 0, '', 0, 0, 0, '', '', 1);
|
||||
print '<br><input type="submit" class="button" value="'.$langs->trans("BuildDoc").'">';
|
||||
print '<br><input type="submit" class="button small" value="'.$langs->trans("BuildDoc").'">';
|
||||
print '</form>';
|
||||
|
||||
// End of page
|
||||
|
||||
@ -22,27 +22,6 @@
|
||||
* \brief Page to create/edit/view partnership
|
||||
*/
|
||||
|
||||
//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db
|
||||
//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user
|
||||
//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc
|
||||
//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs
|
||||
//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters
|
||||
//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters
|
||||
//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); // Do not check CSRF attack (test on referer + on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on).
|
||||
//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on)
|
||||
//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data
|
||||
//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // If there is no need to load and show top and left menu
|
||||
//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // If we don't need to load the html.form.class.php
|
||||
//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library
|
||||
//if (! defined("NOLOGIN")) define("NOLOGIN", '1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too.
|
||||
//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
|
||||
//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value
|
||||
//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler
|
||||
//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message
|
||||
//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies
|
||||
//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET
|
||||
//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification
|
||||
|
||||
// Load Dolibarr environment
|
||||
require '../main.inc.php';
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
|
||||
|
||||
@ -192,6 +192,7 @@ if (!empty($triggers)) {
|
||||
}
|
||||
|
||||
if ($search_event === '' || preg_match('/'.preg_quote($search_event, '/').'/i', $trigger['code'])) {
|
||||
print '<!-- '.$trigger['position'].' -->';
|
||||
print '<tr class="oddeven">';
|
||||
print '<td>'.$trigger['code'].'</td>';
|
||||
print '<td>'.$trigger['label'].'</td>';
|
||||
|
||||
@ -104,6 +104,8 @@ if ($action == 'set') {
|
||||
$resultCreat = $defaultValues->create($user);
|
||||
if ($resultCreat < 0) {
|
||||
setEventMessages($defaultValues->error, $defaultValues->errors, 'errors');
|
||||
} else {
|
||||
setEventMessages($langs->trans("RecordSaved"), null, 'mesgs');
|
||||
}
|
||||
} elseif ($action == 'specimen') { // For orders
|
||||
$modele = GETPOST('module', 'alpha');
|
||||
@ -316,6 +318,16 @@ print '<td class="center"> </td>'."\n";
|
||||
print '<td class="right">'.$langs->trans("Value").'</td>'."\n";
|
||||
print '</tr>'."\n";
|
||||
|
||||
// AGENDA_DEFAULT_VIEW
|
||||
print '<tr class="oddeven">'."\n";
|
||||
$htmltext = $langs->trans("ThisValueCanOverwrittenOnUserLevel", $langs->transnoentitiesnoconv("UserGUISetup"));
|
||||
print '<td>'.$form->textwithpicto($langs->trans("AGENDA_DEFAULT_VIEW"), $htmltext).'</td>'."\n";
|
||||
print '<td class="center"> </td>'."\n";
|
||||
print '<td class="right">'."\n";
|
||||
$tmplist = array(''=>' ', 'show_list'=>$langs->trans("ViewList"), 'show_month'=>$langs->trans("ViewCal"), 'show_week'=>$langs->trans("ViewWeek"), 'show_day'=>$langs->trans("ViewDay"), 'show_peruser'=>$langs->trans("ViewPerUser"));
|
||||
print $form->selectarray('AGENDA_DEFAULT_VIEW', $tmplist, $conf->global->AGENDA_DEFAULT_VIEW);
|
||||
print '</td></tr>'."\n";
|
||||
|
||||
// Manual or automatic
|
||||
|
||||
print '<tr class="oddeven">'."\n";
|
||||
@ -340,16 +352,6 @@ if (!empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
|
||||
print '</td></tr>'."\n";
|
||||
}
|
||||
|
||||
// AGENDA_DEFAULT_VIEW
|
||||
print '<tr class="oddeven">'."\n";
|
||||
$htmltext = $langs->trans("ThisValueCanOverwrittenOnUserLevel", $langs->transnoentitiesnoconv("UserGUISetup"));
|
||||
print '<td>'.$form->textwithpicto($langs->trans("AGENDA_DEFAULT_VIEW"), $htmltext).'</td>'."\n";
|
||||
print '<td class="center"> </td>'."\n";
|
||||
print '<td class="right">'."\n";
|
||||
$tmplist = array(''=>' ', 'show_list'=>$langs->trans("ViewList"), 'show_month'=>$langs->trans("ViewCal"), 'show_week'=>$langs->trans("ViewWeek"), 'show_day'=>$langs->trans("ViewDay"), 'show_peruser'=>$langs->trans("ViewPerUser"));
|
||||
print $form->selectarray('AGENDA_DEFAULT_VIEW', $tmplist, $conf->global->AGENDA_DEFAULT_VIEW);
|
||||
print '</td></tr>'."\n";
|
||||
|
||||
// AGENDA_EVENT_DEFAULT_STATUS
|
||||
print '<tr class="oddeven">'."\n";
|
||||
print '<td>'.$langs->trans("AGENDA_EVENT_DEFAULT_STATUS").'</td>'."\n";
|
||||
|
||||
@ -37,8 +37,6 @@ if (!$user->admin) {
|
||||
$rowid = GETPOST('rowid', 'int');
|
||||
$entity = GETPOST('entity', 'int');
|
||||
$action = GETPOST('action', 'aZ09');
|
||||
$update = GETPOST('update', 'alpha');
|
||||
$delete = GETPOST('delete', 'none'); // Do not use alpha here
|
||||
$debug = GETPOST('debug', 'int');
|
||||
$consts = GETPOST('const', 'array');
|
||||
$constname = GETPOST('constname', 'alphanohtml');
|
||||
|
||||
@ -64,7 +64,7 @@ if (!$sortorder) {
|
||||
|
||||
$defaulturl = GETPOST('defaulturl', 'alphanohtml');
|
||||
$defaultkey = GETPOST('defaultkey', 'alphanohtml');
|
||||
$defaultvalue = GETPOST('defaultvalue', 'none');
|
||||
$defaultvalue = GETPOST('defaultvalue', 'restricthtml');
|
||||
|
||||
$defaulturl = preg_replace('/^\//', '', $defaulturl);
|
||||
|
||||
|
||||
@ -27,6 +27,7 @@ require '../main.inc.php';
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/lib/oauth.lib.php';
|
||||
|
||||
// $supportedoauth2array is defined into oauth.lib.php
|
||||
|
||||
// Define $urlwithroot
|
||||
$urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
|
||||
@ -96,10 +97,12 @@ print '<table class="noborder centpercent">';
|
||||
|
||||
$i = 0;
|
||||
|
||||
// $list is defined into oauth.lib.php
|
||||
// $list is defined into oauth.lib.php to the list of supporter OAuth providers.
|
||||
foreach ($list as $key) {
|
||||
$supported = 0;
|
||||
if (in_array($key[0], array_keys($supportedoauth2array))) {
|
||||
$keyforsupportedoauth2array = $key[0];
|
||||
|
||||
if (in_array($keyforsupportedoauth2array, array_keys($supportedoauth2array))) {
|
||||
$supported = 1;
|
||||
}
|
||||
if (!$supported) {
|
||||
@ -110,20 +113,23 @@ foreach ($list as $key) {
|
||||
|
||||
print '<tr class="liste_titre'.($i > 1 ? ' liste_titre_add' : '').'">';
|
||||
// Api Name
|
||||
$label = $langs->trans($key[0]);
|
||||
print '<td>'.$label.'</td>';
|
||||
$label = $langs->trans($keyforsupportedoauth2array);
|
||||
print '<td>';
|
||||
if (!empty($key[3])) {
|
||||
print $langs->trans($key[3]);
|
||||
print img_picto('', $supportedoauth2array[$keyforsupportedoauth2array]['picto'], 'class="pictofixedwidth"');
|
||||
print $label;
|
||||
print '</td>';
|
||||
print '<td>';
|
||||
if (!empty($supportedoauth2array[$keyforsupportedoauth2array]['urlforapp'])) {
|
||||
print $langs->trans($supportedoauth2array[$keyforsupportedoauth2array]['urlforapp']);
|
||||
}
|
||||
print '</td>';
|
||||
print '</tr>';
|
||||
|
||||
if ($supported) {
|
||||
$redirect_uri = $urlwithroot.'/core/modules/oauth/'.$supportedoauth2array[$key[0]].'_oauthcallback.php';
|
||||
$redirect_uri = $urlwithroot.'/core/modules/oauth/'.$supportedoauth2array[$keyforsupportedoauth2array]['callbackfile'].'_oauthcallback.php';
|
||||
print '<tr class="oddeven value">';
|
||||
print '<td>'.$langs->trans("UseTheFollowingUrlAsRedirectURI").'</td>';
|
||||
print '<td><input style="width: 80%" type"text" name="uri'.$key[0].'" value="'.$redirect_uri.'">';
|
||||
print '<td><input style="width: 80%" type"text" name="uri'.$keyforsupportedoauth2array.'" value="'.$redirect_uri.'">';
|
||||
print '</td></tr>';
|
||||
} else {
|
||||
print '<tr class="oddeven value">';
|
||||
|
||||
@ -25,17 +25,13 @@
|
||||
|
||||
require '../main.inc.php';
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/lib/oauth.lib.php'; // This define $list
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/lib/oauth.lib.php'; // This define $list and $supportedoauth2array
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
|
||||
use OAuth\Common\Storage\DoliStorage;
|
||||
|
||||
// Load translation files required by the page
|
||||
$langs->loadLangs(array('admin', 'printing', 'oauth'));
|
||||
|
||||
if (!$user->admin) {
|
||||
accessforbidden();
|
||||
}
|
||||
|
||||
$action = GETPOST('action', 'aZ09');
|
||||
$mode = GETPOST('mode', 'alpha');
|
||||
$value = GETPOST('value', 'alpha');
|
||||
@ -50,6 +46,10 @@ if (!$mode) {
|
||||
$mode = 'setup';
|
||||
}
|
||||
|
||||
if (!$user->admin) {
|
||||
accessforbidden();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Action
|
||||
@ -122,7 +122,7 @@ $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domai
|
||||
|
||||
$form = new Form($db);
|
||||
|
||||
llxHeader('', $langs->trans("PrintingSetup"));
|
||||
llxHeader('', $langs->trans("TokenManager"));
|
||||
|
||||
$linkback = '<a href="'.DOL_URL_ROOT.'/admin/modules.php?restore_lastsearch_values=1">'.$langs->trans("BackToModuleList").'</a>';
|
||||
print load_fiche_titre($langs->trans('ConfigOAuth'), $linkback, 'title_setup');
|
||||
@ -140,7 +140,9 @@ if ($mode == 'setup' && $user->admin) {
|
||||
|
||||
foreach ($list as $key) {
|
||||
$supported = 0;
|
||||
if (in_array($key[0], array_keys($supportedoauth2array))) {
|
||||
$keyforsupportedoauth2array = $key[0];
|
||||
|
||||
if (in_array($keyforsupportedoauth2array, array_keys($supportedoauth2array))) {
|
||||
$supported = 1;
|
||||
}
|
||||
if (!$supported) {
|
||||
@ -148,34 +150,44 @@ if ($mode == 'setup' && $user->admin) {
|
||||
}
|
||||
|
||||
|
||||
$OAUTH_SERVICENAME = 'Unknown';
|
||||
if ($key[0] == 'OAUTH_GITHUB_NAME') {
|
||||
$OAUTH_SERVICENAME = 'GitHub';
|
||||
$OAUTH_SERVICENAME = empty($supportedoauth2array[$keyforsupportedoauth2array]['name']) ? 'Unknown' : $supportedoauth2array[$keyforsupportedoauth2array]['name'];
|
||||
|
||||
// Define $shortscope, $urltorenew, $urltodelete, $urltocheckperms
|
||||
// TODO Use array $supportedoauth2array
|
||||
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.
|
||||
$shortscope = 'user,public_repo';
|
||||
$urltorenew = $urlwithroot.'/core/modules/oauth/github_oauthcallback.php?shortscope='.$shortscope.'&state='.$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 ($key[0] == 'OAUTH_GOOGLE_NAME') {
|
||||
$OAUTH_SERVICENAME = 'Google';
|
||||
} elseif ($keyforsupportedoauth2array == 'OAUTH_GOOGLE_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.
|
||||
$shortscope = 'userinfo_email,userinfo_profile,cloud_print';
|
||||
if (!empty($conf->global->OAUTH_GSUITE)) {
|
||||
// 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.
|
||||
$shortscope = 'userinfo_email,userinfo_profile';
|
||||
$shortscope .= ',openid,email,profile'; // For openid connect
|
||||
if (!empty($conf->printing->enabled)) {
|
||||
$shortscope .= ',cloud_print';
|
||||
}
|
||||
if (!empty($conf->global->OAUTH_GOOGLE_GSUITE)) {
|
||||
$shortscope .= ',admin_directory_user';
|
||||
}
|
||||
//$scope.=',gmail_full';
|
||||
$urltorenew = $urlwithroot.'/core/modules/oauth/google_oauthcallback.php?shortscope='.$shortscope.'&state='.$shortscope.'&backtourl='.urlencode(DOL_URL_ROOT.'/admin/oauthlogintokens.php');
|
||||
if (!empty($conf->global->OAUTH_GOOGLE_GMAIL)) {
|
||||
$shortscope.=',gmail_full';
|
||||
}
|
||||
|
||||
$oauthstateanticsrf = bin2hex(random_bytes(128/8));
|
||||
$_SESSION['oauthstateanticsrf'] = $shortscope.'-'.$oauthstateanticsrf;
|
||||
|
||||
$urltorenew = $urlwithroot.'/core/modules/oauth/google_oauthcallback.php?shortscope='.$shortscope.'&state='.$shortscope.'-'.$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 ($key[0] == 'OAUTH_STRIPE_TEST_NAME') {
|
||||
$OAUTH_SERVICENAME = 'StripeTest';
|
||||
} elseif ($keyforsupportedoauth2array == 'OAUTH_STRIPE_TEST_NAME') {
|
||||
$urltorenew = $urlwithroot.'/core/modules/oauth/stripetest_oauthcallback.php?backtourl='.urlencode(DOL_URL_ROOT.'/admin/oauthlogintokens.php');
|
||||
$urltodelete = '';
|
||||
$urltocheckperms = '';
|
||||
} elseif ($key[0] == 'OAUTH_STRIPE_LIVE_NAME') {
|
||||
$OAUTH_SERVICENAME = 'StripeLive';
|
||||
} elseif ($keyforsupportedoauth2array == 'OAUTH_STRIPE_LIVE_NAME') {
|
||||
$urltorenew = $urlwithroot.'/core/modules/oauth/stripelive_oauthcallback.php?backtourl='.urlencode(DOL_URL_ROOT.'/admin/oauthlogintokens.php');
|
||||
$urltodelete = '';
|
||||
$urltocheckperms = '';
|
||||
@ -230,11 +242,14 @@ if ($mode == 'setup' && $user->admin) {
|
||||
print '<input type="hidden" name="token" value="'.newToken().'">';
|
||||
print '<input type="hidden" name="action" value="setconst">';
|
||||
|
||||
print '<div class="div-table-responsive">';
|
||||
print '<div class="div-table-responsive-no-min">';
|
||||
print '<table class="noborder centpercent">'."\n";
|
||||
|
||||
print '<tr class="liste_titre">';
|
||||
print '<th class="titlefieldcreate">'.$langs->trans($key[0]).'</th>';
|
||||
print '<th class="titlefieldcreate">';
|
||||
print img_picto('', $supportedoauth2array[$keyforsupportedoauth2array]['picto'], 'class="pictofixedwidth"');
|
||||
print $langs->trans($keyforsupportedoauth2array);
|
||||
print '</th>';
|
||||
print '<th></th>';
|
||||
print '<th></th>';
|
||||
print "</tr>\n";
|
||||
@ -244,7 +259,7 @@ if ($mode == 'setup' && $user->admin) {
|
||||
//var_dump($key);
|
||||
print $langs->trans("OAuthIDSecret").'</td>';
|
||||
print '<td>';
|
||||
print $langs->trans("SeePreviousTab");
|
||||
print '<span class="opacitymedium">'.$langs->trans("SeePreviousTab").'</span>';
|
||||
print '</td>';
|
||||
print '<td>';
|
||||
print '</td>';
|
||||
@ -259,7 +274,7 @@ if ($mode == 'setup' && $user->admin) {
|
||||
if (is_object($tokenobj)) {
|
||||
print $langs->trans("HasAccessToken");
|
||||
} else {
|
||||
print $langs->trans("NoAccessToken");
|
||||
print '<span class="opacitymedium">'.$langs->trans("NoAccessToken").'</span>';
|
||||
}
|
||||
print '</td>';
|
||||
print '<td width="50%">';
|
||||
@ -346,7 +361,7 @@ if ($mode == 'setup' && $user->admin) {
|
||||
if ($mode == 'test' && $user->admin) {
|
||||
print $langs->trans('PrintTestDesc'.$driver)."<br><br>\n";
|
||||
|
||||
print '<div class="div-table-responsive">';
|
||||
print '<div class="div-table-responsive-no-min">';
|
||||
print '<table class="noborder centpercent">';
|
||||
if (!empty($driver)) {
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/modules/printing/'.$driver.'.modules.php';
|
||||
|
||||
@ -937,7 +937,7 @@ if ($action == 'create') {
|
||||
$("#selectcomplete").change(function() {
|
||||
if ($("#selectcomplete").val() == 100)
|
||||
{
|
||||
if ($("#doneby").val() <= 0) $("#doneby").val(\''.$user->id.'\');
|
||||
if ($("#doneby").val() <= 0) $("#doneby").val(\''.((int) $user->id).'\');
|
||||
}
|
||||
if ($("#selectcomplete").val() == 0)
|
||||
{
|
||||
@ -992,7 +992,8 @@ if ($action == 'create') {
|
||||
if (!empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
|
||||
print '<tr><td class="titlefieldcreate"><span class="fieldrequired">'.$langs->trans("Type").'</span></b></td><td>';
|
||||
$default = (empty($conf->global->AGENDA_USE_EVENT_TYPE_DEFAULT) ? 'AC_RDV' : $conf->global->AGENDA_USE_EVENT_TYPE_DEFAULT);
|
||||
$formactions->select_type_actions(GETPOSTISSET("actioncode") ? GETPOST("actioncode", 'aZ09') : ($object->type_code ? $object->type_code : $default), "actioncode", "systemauto", 0, -1);
|
||||
print img_picto($langs->trans("ActionType"), 'square', 'class="fawidth30 inline-block" style="color: #ddd;"');
|
||||
print $formactions->select_type_actions(GETPOSTISSET("actioncode") ? GETPOST("actioncode", 'aZ09') : ($object->type_code ? $object->type_code : $default), "actioncode", "systemauto", 0, -1, 0, 1); // TODO Replace 0 with -2 in onlyautoornot
|
||||
print '</td></tr>';
|
||||
}
|
||||
|
||||
@ -1000,7 +1001,7 @@ if ($action == 'create') {
|
||||
print '<tr><td'.(empty($conf->global->AGENDA_USE_EVENT_TYPE) ? ' class="fieldrequired titlefieldcreate"' : '').'>'.$langs->trans("Label").'</td><td><input type="text" id="label" name="label" class="soixantepercent" value="'.GETPOST('label').'"></td></tr>';
|
||||
|
||||
// Full day
|
||||
print '<tr><td>'.$langs->trans("EventOnFullDay").'</td><td><input type="checkbox" id="fullday" name="fullday" '.(GETPOST('fullday') ? ' checked' : '').'></td></tr>';
|
||||
print '<tr><td><label for="fullday">'.$langs->trans("EventOnFullDay").'</label></td><td><input type="checkbox" id="fullday" name="fullday" '.(GETPOST('fullday') ? ' checked' : '').'></td></tr>';
|
||||
|
||||
$datep = ($datep ? $datep : (is_null($object->datep) ? '' : $object->datep));
|
||||
if (GETPOST('datep', 'int', 1)) {
|
||||
@ -1311,7 +1312,7 @@ if ($action == 'create') {
|
||||
print '</table>';
|
||||
|
||||
|
||||
if ($conf->global->AGENDA_REMINDER_EMAIL || $conf->global->AGENDA_REMINDER_BROWSER) {
|
||||
if (getDolGlobalString('AGENDA_REMINDER_EMAIL') || getDolGlobalString('AGENDA_REMINDER_BROWSER')) {
|
||||
//checkbox create reminder
|
||||
print '<hr>';
|
||||
print '<br>';
|
||||
@ -1336,10 +1337,11 @@ if ($action == 'create') {
|
||||
print '</td></tr>';
|
||||
|
||||
//Mail Model
|
||||
print '<tr><td class="titlefieldcreate nowrap">'.$langs->trans("EMailTemplates").'</td><td colspan="3">';
|
||||
print $form->selectModelMail('actioncommsend', 'actioncomm_send', 1, 1);
|
||||
print '</td></tr>';
|
||||
|
||||
if (getDolGlobalString('AGENDA_REMINDER_EMAIL')) {
|
||||
print '<tr><td class="titlefieldcreate nowrap">'.$langs->trans("EMailTemplates").'</td><td colspan="3">';
|
||||
print $form->selectModelMail('actioncommsend', 'actioncomm_send', 1, 1);
|
||||
print '</td></tr>';
|
||||
}
|
||||
|
||||
print '</table>';
|
||||
print '</div>';
|
||||
|
||||
@ -123,16 +123,17 @@ class ActionComm extends CommonObject
|
||||
*/
|
||||
public $label;
|
||||
|
||||
/**
|
||||
* @var string Agenda event label
|
||||
* @deprecated Use $label
|
||||
*/
|
||||
public $libelle;
|
||||
|
||||
/**
|
||||
* @var integer Date creation record (datec)
|
||||
*/
|
||||
public $datec;
|
||||
|
||||
/**
|
||||
* @var integer Date end record (datef)
|
||||
*/
|
||||
public $datef;
|
||||
|
||||
/**
|
||||
* @var integer Duration (duree)
|
||||
*/
|
||||
@ -172,6 +173,21 @@ class ActionComm extends CommonObject
|
||||
*/
|
||||
public $datep;
|
||||
|
||||
/**
|
||||
* @var integer Date action end (datef)
|
||||
*/
|
||||
public $datef;
|
||||
|
||||
/**
|
||||
* @var integer This is date start action (datep) but modified to not be outside calendar view.
|
||||
*/
|
||||
public $date_start_in_calendar;
|
||||
|
||||
/**
|
||||
* @var integer This is date end action (datef) but modified to not be outside calendar view.
|
||||
*/
|
||||
public $date_end_in_calendar;
|
||||
|
||||
/**
|
||||
* @var integer Date action end (datep2)
|
||||
*/
|
||||
@ -188,6 +204,11 @@ class ActionComm extends CommonObject
|
||||
*/
|
||||
public $fulldayevent = 0;
|
||||
|
||||
/**
|
||||
* @var int 1=???
|
||||
*/
|
||||
public $ponctuel;
|
||||
|
||||
/**
|
||||
* @var integer Percentage
|
||||
*/
|
||||
@ -219,8 +240,7 @@ class ActionComm extends CommonObject
|
||||
public $userownerid;
|
||||
|
||||
/**
|
||||
* @var int Id of user done (deprecated)
|
||||
* @deprecated
|
||||
* @var int Id of user that has done the event. Used only if AGENDA_ENABLE_DONEBY is set.
|
||||
*/
|
||||
public $userdoneid;
|
||||
|
||||
@ -239,20 +259,6 @@ class ActionComm extends CommonObject
|
||||
*/
|
||||
public $reminders = array();
|
||||
|
||||
/**
|
||||
* @var User Object user of owner
|
||||
* @deprecated
|
||||
* @see $userownerid
|
||||
*/
|
||||
public $usertodo;
|
||||
|
||||
/**
|
||||
* @var User Object user that did action
|
||||
* @deprecated
|
||||
* @see $userdoneid
|
||||
*/
|
||||
public $userdone;
|
||||
|
||||
/**
|
||||
* @var int thirdparty id linked to action
|
||||
*/
|
||||
@ -827,18 +833,17 @@ class ActionComm extends CommonObject
|
||||
$this->usermodid = $obj->fk_user_mod;
|
||||
|
||||
if (!is_object($this->author)) {
|
||||
$this->author = new stdClass(); // To avoid warning
|
||||
$this->author = new User($this->db); // To avoid warning
|
||||
}
|
||||
$this->author->id = $obj->fk_user_author; // deprecated
|
||||
$this->author->firstname = $obj->firstname; // deprecated
|
||||
$this->author->lastname = $obj->lastname; // deprecated
|
||||
if (!is_object($this->usermod)) {
|
||||
$this->usermod = new stdClass(); // To avoid warning
|
||||
$this->usermod = new User($this->db); // To avoid warning
|
||||
}
|
||||
$this->usermod->id = $obj->fk_user_mod; // deprecated
|
||||
|
||||
$this->userownerid = $obj->fk_user_action;
|
||||
$this->userdoneid = $obj->fk_user_done;
|
||||
$this->priority = $obj->priority;
|
||||
$this->fulldayevent = $obj->fulldayevent;
|
||||
$this->location = $obj->location;
|
||||
@ -1130,18 +1135,18 @@ class ActionComm extends CommonObject
|
||||
$sql .= ", datep2 = ".(strval($this->datef) != '' ? "'".$this->db->idate($this->datef)."'" : 'null');
|
||||
$sql .= ", durationp = ".(isset($this->durationp) && $this->durationp >= 0 && $this->durationp != '' ? "'".$this->db->escape($this->durationp)."'" : "null"); // deprecated
|
||||
$sql .= ", note = '".$this->db->escape($this->note_private)."'";
|
||||
$sql .= ", fk_project =".($this->fk_project > 0 ? $this->fk_project : "null");
|
||||
$sql .= ", fk_soc =".($socid > 0 ? $socid : "null");
|
||||
$sql .= ", fk_contact =".($contactid > 0 ? $contactid : "null");
|
||||
$sql .= ", fk_project =".($this->fk_project > 0 ? ((int) $this->fk_project) : "null");
|
||||
$sql .= ", fk_soc =".($socid > 0 ? ((int) $socid) : "null");
|
||||
$sql .= ", fk_contact =".($contactid > 0 ? ((int) $contactid) : "null");
|
||||
$sql .= ", priority = '".$this->db->escape($this->priority)."'";
|
||||
$sql .= ", fulldayevent = '".$this->db->escape($this->fulldayevent)."'";
|
||||
$sql .= ", location = ".($this->location ? "'".$this->db->escape($this->location)."'" : "null");
|
||||
$sql .= ", transparency = '".$this->db->escape($this->transparency)."'";
|
||||
$sql .= ", fk_user_mod = ".$user->id;
|
||||
$sql .= ", fk_user_action = ".($userownerid > 0 ? "'".$this->db->escape($userownerid)."'" : "null");
|
||||
$sql .= ", fk_user_done = ".($userdoneid > 0 ? "'".$this->db->escape($userdoneid)."'" : "null");
|
||||
$sql .= ", fk_user_mod = ".((int) $user->id);
|
||||
$sql .= ", fk_user_action = ".($userownerid > 0 ? ((int) $userownerid) : "null");
|
||||
$sql .= ", fk_user_done = ".($userdoneid > 0 ? ((int) $userdoneid) : "null");
|
||||
if (!empty($this->fk_element)) {
|
||||
$sql .= ", fk_element=".($this->fk_element ? $this->db->escape($this->fk_element) : "null");
|
||||
$sql .= ", fk_element=".($this->fk_element ? ((int) $this->fk_element) : "null");
|
||||
}
|
||||
if (!empty($this->elementtype)) {
|
||||
$sql .= ", elementtype=".($this->elementtype ? "'".$this->db->escape($this->elementtype)."'" : "null");
|
||||
@ -1439,9 +1444,9 @@ class ActionComm extends CommonObject
|
||||
|
||||
|
||||
/**
|
||||
* Return label of status
|
||||
* Return the label of the status
|
||||
*
|
||||
* @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto
|
||||
* @param int $mode 0=Long label, 1=Short label, 2=Picto+Short label, 3=Picto, 4=Picto+Short label, 5=Short label+Picto, 6=Picto+Long label, 7=Very short label+Picto
|
||||
* @param int $hidenastatus 1=Show nothing if status is "Not applicable"
|
||||
* @return string String with status
|
||||
*/
|
||||
@ -1628,36 +1633,34 @@ class ActionComm extends CommonObject
|
||||
}
|
||||
|
||||
if ($withpicto == 2) {
|
||||
$libelle = $label;
|
||||
if (!empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
|
||||
$libelle = $labeltype;
|
||||
$label = $labeltype;
|
||||
}
|
||||
$libelleshort = '';
|
||||
$labelshort = '';
|
||||
} else {
|
||||
$libelle = (empty($this->libelle) ? $label : $this->libelle.(($label && $label != $this->libelle) ? ' '.$label : ''));
|
||||
if (!empty($conf->global->AGENDA_USE_EVENT_TYPE) && empty($libelle)) {
|
||||
$libelle = $labeltype;
|
||||
if (!empty($conf->global->AGENDA_USE_EVENT_TYPE) && empty($label)) {
|
||||
$label = $labeltype;
|
||||
}
|
||||
if ($maxlength < 0) {
|
||||
$libelleshort = $this->ref;
|
||||
$labelshort = $this->ref;
|
||||
} else {
|
||||
$libelleshort = dol_trunc($libelle, $maxlength);
|
||||
$labelshort = dol_trunc($label, $maxlength);
|
||||
}
|
||||
}
|
||||
|
||||
if ($withpicto) {
|
||||
if (!empty($conf->global->AGENDA_USE_EVENT_TYPE)) { // Add code into ()
|
||||
if ($labeltype) {
|
||||
$libelle .= (preg_match('/'.preg_quote($labeltype, '/').'/', $libelle) ? '' : ' ('.$langs->transnoentities("Action".$this->type_code).')');
|
||||
$label .= (preg_match('/'.preg_quote($labeltype, '/').'/', $label) ? '' : ' ('.$langs->transnoentities("Action".$this->type_code).')');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$result .= $linkstart;
|
||||
if ($withpicto) {
|
||||
$result .= img_object(($notooltip ? '' : $langs->trans("ShowAction").': '.$libelle), ($overwritepicto ? $overwritepicto : 'action'), (($this->type_color && $overwritepicto) ? 'style="color: #'.$this->type_color.' !important;" ' : '').($notooltip ? 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'"' : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
|
||||
$result .= img_object(($notooltip ? '' : $langs->trans("ShowAction").': '.$label), ($overwritepicto ? $overwritepicto : 'action'), (($this->type_color && $overwritepicto) ? 'style="color: #'.$this->type_color.' !important;" ' : '').($notooltip ? 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'"' : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
|
||||
}
|
||||
$result .= $libelleshort;
|
||||
$result .= $labelshort;
|
||||
$result .= $linkend;
|
||||
|
||||
global $action;
|
||||
|
||||
@ -205,9 +205,9 @@ class ActionCommReminder extends CommonObject
|
||||
}
|
||||
|
||||
/**
|
||||
* Retourne le libelle du status d'un user (actif, inactif)
|
||||
* Return label of the status of a reminder
|
||||
*
|
||||
* @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto
|
||||
* @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto
|
||||
* @return string Label of status
|
||||
*/
|
||||
public function getLibStatut($mode = 0)
|
||||
|
||||
@ -145,7 +145,7 @@ class CActionComm
|
||||
* @param string|int $active 1 or 0 to filter on event state active or not ('' by default = no filter)
|
||||
* @param string $idorcode 'id' or 'code' or 'all'
|
||||
* @param string $excludetype Type to exclude ('system' or 'systemauto')
|
||||
* @param int $onlyautoornot 1=Group all type AC_XXX into 1 line AC_MANUAL. 0=Keep details of type, -1=Keep details and add a combined line per calendar (Default, Auto, BoothConf, ...)
|
||||
* @param int $onlyautoornot 1=Group all type AC_XXX into 1 line AC_MANUAL. 0=Keep details of type, -1 or -2=Keep details and add a combined line per calendar (Default, Auto, BoothConf, ...)
|
||||
* @param string $morefilter Add more SQL filter
|
||||
* @param int $shortlabel 1=Get short label instead of long label
|
||||
* @return mixed Array of all event types if OK, <0 if KO. Key of array is id or code depending on parameter $idorcode.
|
||||
@ -241,7 +241,7 @@ class CActionComm
|
||||
$transcode = $langs->trans($keyfortrans);
|
||||
}
|
||||
$label = (($transcode != $keyfortrans) ? $transcode : $langs->trans($obj->label));
|
||||
if ($onlyautoornot == -1 && !empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
|
||||
if (($onlyautoornot == -1 || $onlyautoornot == -2) && !empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
|
||||
if ($typecalendar == 'system') {
|
||||
$label = ' '.$label;
|
||||
$repid[-99] = $langs->trans("ActionAC_MANUAL");
|
||||
|
||||
@ -107,10 +107,10 @@ $year = GETPOST("year", "int") ?GETPOST("year", "int") : date("Y");
|
||||
$month = GETPOST("month", "int") ?GETPOST("month", "int") : date("m");
|
||||
$week = GETPOST("week", "int") ?GETPOST("week", "int") : date("W");
|
||||
$day = GETPOST("day", "int") ?GETPOST("day", "int") : date("d");
|
||||
$pid = GETPOST("search_projectid", "int", 3) ?GETPOST("search_projectid", "int", 3) : GETPOST("projectid", "int", 3);
|
||||
$status = GETPOST("search_status", 'aZ09') ?GETPOST("search_status", 'aZ09') : GETPOST("status", 'aZ09'); // status may be 0, 50, 100, 'todo'
|
||||
$type = GETPOST("search_type", 'aZ09') ?GETPOST("search_type", 'aZ09') : GETPOST("type", 'aZ09');
|
||||
$maxprint = (isset($_GET["maxprint"]) ?GETPOST("maxprint") : $conf->global->AGENDA_MAX_EVENTS_DAY_VIEW);
|
||||
$pid = GETPOST("search_projectid", "int", 3) ? GETPOST("search_projectid", "int", 3) : GETPOST("projectid", "int", 3);
|
||||
$status = GETPOSTISSET("search_status") ? GETPOST("search_status", 'aZ09') : GETPOST("status", 'aZ09'); // status may be 0, 50, 100, 'todo'
|
||||
$type = GETPOSTISSET("search_type", 'aZ09') ? GETPOST("search_type", 'aZ09') : GETPOST("type", 'aZ09');
|
||||
$maxprint = GETPOSTISSET("maxprint") ? GETPOST("maxprint", 'int') : $conf->global->AGENDA_MAX_EVENTS_DAY_VIEW;
|
||||
$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
|
||||
|
||||
$dateselect = dol_mktime(0, 0, 0, GETPOST('dateselectmonth', 'int'), GETPOST('dateselectday', 'int'), GETPOST('dateselectyear', 'int'));
|
||||
@ -570,7 +570,7 @@ if (!empty($conf->use_javascript_ajax)) { // If javascript on
|
||||
$s .= 'console.log("found parent div.dayevent with id = "+newval);'."\n";
|
||||
$s .= 'var frm=jQuery("#searchFormList");'."\n";
|
||||
$s .= 'var newurl = ui.item.find("a.cal_event").attr("href");'."\n";
|
||||
$s .= 'console.log(newurl);'."\n";
|
||||
$s .= 'console.log("Found url on href of a.cal_event"+newurl+", we submit form with actionmove=mupdate");'."\n";
|
||||
$s .= 'frm.attr("action", newurl).children("#newdate").val(newval);frm.submit();}'."\n";
|
||||
$s .= '});'."\n";
|
||||
}
|
||||
@ -837,7 +837,7 @@ if ($resql) {
|
||||
|
||||
$event->fk_project = $obj->fk_project;
|
||||
|
||||
$event->thirdparty_id = $obj->fk_soc;
|
||||
$event->socid = $obj->fk_soc;
|
||||
$event->contact_id = $obj->fk_contact;
|
||||
|
||||
// Defined date_start_in_calendar and date_end_in_calendar property
|
||||
@ -848,10 +848,6 @@ if ($resql) {
|
||||
} else {
|
||||
$event->date_end_in_calendar = $event->datep;
|
||||
}
|
||||
// Define ponctual property
|
||||
if ($event->date_start_in_calendar == $event->date_end_in_calendar) {
|
||||
$event->ponctuel = 1;
|
||||
}
|
||||
|
||||
// Check values
|
||||
if ($event->date_end_in_calendar < $firstdaytoshow || $event->date_start_in_calendar >= $lastdaytoshow) {
|
||||
@ -945,7 +941,6 @@ if ($showbirthday) {
|
||||
|
||||
$event->date_start_in_calendar = $db->jdate($event->datep);
|
||||
$event->date_end_in_calendar = $db->jdate($event->datef);
|
||||
$event->ponctuel = 0;
|
||||
|
||||
// Add an entry in eventarray for each day
|
||||
$daycursor = $event->datep;
|
||||
@ -1288,12 +1283,6 @@ if (count($listofextcals)) {
|
||||
$event->date_end_in_calendar = $event->datep;
|
||||
}
|
||||
|
||||
// Define ponctual property
|
||||
if ($event->date_start_in_calendar == $event->date_end_in_calendar) {
|
||||
$event->ponctuel = 1;
|
||||
//print 'x'.$datestart.'-'.$dateend;exit;
|
||||
}
|
||||
|
||||
// Add event into $eventarray if date range are ok.
|
||||
if ($event->date_end_in_calendar < $firstdaytoshow || $event->date_start_in_calendar >= $lastdaytoshow) {
|
||||
//print 'x'.$datestart.'-'.$dateend;exit;
|
||||
@ -1393,7 +1382,7 @@ if (empty($mode) || $mode == 'show_month') { // View by month
|
||||
print '</div>';
|
||||
|
||||
print '<div class="div-table-responsive-no-min sectioncalendarbymonth maxscreenheightless300">';
|
||||
print '<table width="100%" class="noborder nocellnopadd cal_pannel cal_month">';
|
||||
print '<table class="centpercent noborder nocellnopadd cal_pannel cal_month">';
|
||||
print ' <tr class="liste_titre">';
|
||||
// Column title of weeks numbers
|
||||
echo ' <td class="center">#</td>';
|
||||
@ -1482,7 +1471,7 @@ if (empty($mode) || $mode == 'show_month') { // View by month
|
||||
print '</div>';
|
||||
|
||||
print '<input type="hidden" name="actionmove" value="mupdate">';
|
||||
print '<input type="hidden" name="backtopage" value="'.dol_escape_htmltag($_SERVER['PHP_SELF']).'?'.dol_escape_htmltag($_SERVER['QUERY_STRING']).'">';
|
||||
print '<input type="hidden" name="backtopage" value="'.dol_escape_htmltag($_SERVER['PHP_SELF']).'?mode=show_month&'.dol_escape_htmltag($_SERVER['QUERY_STRING']).'">';
|
||||
print '<input type="hidden" name="newdate" id="newdate">';
|
||||
} elseif ($mode == 'show_week') {
|
||||
// View by week
|
||||
@ -1502,7 +1491,7 @@ if (empty($mode) || $mode == 'show_month') { // View by month
|
||||
print '</div></div>';
|
||||
|
||||
print '<div class="div-table-responsive-no-min sectioncalendarbyweek maxscreenheightless300">';
|
||||
print '<table width="100%" class="noborder nocellnopadd cal_pannel cal_month">';
|
||||
print '<table class="centpercent noborder nocellnopadd cal_pannel cal_month">';
|
||||
print ' <tr class="liste_titre">';
|
||||
$i = 0;
|
||||
while ($i < 7) {
|
||||
@ -1544,10 +1533,9 @@ if (empty($mode) || $mode == 'show_month') { // View by month
|
||||
print '</div>';
|
||||
|
||||
echo '<input type="hidden" name="actionmove" value="mupdate">';
|
||||
echo '<input type="hidden" name="backtopage" value="'.dol_escape_htmltag($_SERVER['PHP_SELF']).'?'.dol_escape_htmltag($_SERVER['QUERY_STRING']).'">';
|
||||
echo '<input type="hidden" name="backtopage" value="'.dol_escape_htmltag($_SERVER['PHP_SELF']).'?mode=show_week&'.dol_escape_htmltag($_SERVER['QUERY_STRING']).'">';
|
||||
echo '<input type="hidden" name="newdate" id="newdate">';
|
||||
} else // View by day
|
||||
{
|
||||
} else { // View by day
|
||||
$newparam = $param; // newparam is for birthday links
|
||||
$newparam = preg_replace('/mode=show_month&?/i', '', $newparam);
|
||||
$newparam = preg_replace('/mode=show_week&?/i', '', $newparam);
|
||||
@ -1965,7 +1953,7 @@ function show_day_events($db, $day, $month, $year, $monthshown, $style, &$eventa
|
||||
if ($event->type_code != 'ICALEVENT') {
|
||||
$savlabel = $event->label ? $event->label : $event->libelle;
|
||||
$event->label = $titletoshow;
|
||||
$event->libelle = $titletoshow;
|
||||
$event->libelle = $titletoshow; // deprecatd
|
||||
// Note: List of users are inside $event->userassigned. Link may be clickable depending on permissions of user.
|
||||
$titletoshow = (($event->type_picto || $event->type_code) ? $event->getTypePicto() : '');
|
||||
$titletoshow .= $event->getNomUrl(0, $maxnbofchar, 'cal_event cal_event_title', '', 0, 0);
|
||||
@ -1997,7 +1985,7 @@ function show_day_events($db, $day, $month, $year, $monthshown, $style, &$eventa
|
||||
print '<br>('.dol_trunc($event->icalname, $maxnbofchar).')';
|
||||
}
|
||||
|
||||
$thirdparty_id = ($event->thirdparty_id > 0 ? $event->thirdparty_id : ((is_object($event->societe) && $event->societe->id > 0) ? $event->societe->id : 0));
|
||||
$thirdparty_id = ($event->socid > 0 ? $event->socid : ((is_object($event->societe) && $event->societe->id > 0) ? $event->societe->id : 0));
|
||||
$contact_id = ($event->contact_id > 0 ? $event->contact_id : ((is_object($event->contact) && $event->contact->id > 0) ? $event->contact->id : 0));
|
||||
|
||||
// If action related to company / contact
|
||||
|
||||
@ -683,10 +683,6 @@ if ($resql) {
|
||||
$event->date_end_in_calendar = $datep;
|
||||
}
|
||||
}
|
||||
// Define ponctual property
|
||||
if ($event->date_start_in_calendar == $event->date_end_in_calendar) {
|
||||
$event->ponctuel = 1;
|
||||
}
|
||||
|
||||
// Check values
|
||||
if ($event->date_end_in_calendar < $firstdaytoshow ||
|
||||
@ -1236,9 +1232,9 @@ function show_day_events_pertype($username, $day, $month, $year, $monthshown, $s
|
||||
$color2 = '222222';
|
||||
}
|
||||
print '<table class="nobordernopadding" width="100%">';
|
||||
print '<tr><td '.($color1 ? 'style="background: #'.$color1.';"' : '').'class="'.($style1 ? $style1.' ' : '').'onclickopenref'.($title1 ? ' cursorpointer' : '').'" ref="ref_'.$username->id.'_'.sprintf("%04d", $year).'_'.sprintf("%02d", $month).'_'.sprintf("%02d", $day).'_'.sprintf("%02d", $h).'_00_'.($ids1 ? $ids1 : 'none').'"'.($title1 ? ' title="'.$title1.'"' : '').'>';
|
||||
print '<tr><td '.($color1 ? 'style="background: #'.$color1.';"' : '').'class="'.($style1 ? $style1.' ' : '').'onclickopenref center'.($title1 ? ' cursorpointer' : '').'" ref="ref_'.$username->id.'_'.sprintf("%04d", $year).'_'.sprintf("%02d", $month).'_'.sprintf("%02d", $day).'_'.sprintf("%02d", $h).'_00_'.($ids1 ? $ids1 : 'none').'"'.($title1 ? ' title="'.$title1.'"' : '').'>';
|
||||
print $string1;
|
||||
print '</td><td '.($color2 ? 'style="background: #'.$color2.';"' : '').'class="'.($style2 ? $style2.' ' : '').'onclickopenref'.($title1 ? ' cursorpointer' : '').'" ref="ref_'.$username->id.'_'.sprintf("%04d", $year).'_'.sprintf("%02d", $month).'_'.sprintf("%02d", $day).'_'.sprintf("%02d", $h).'_30_'.($ids2 ? $ids2 : 'none').'"'.($title2 ? ' title="'.$title2.'"' : '').'>';
|
||||
print '</td><td '.($color2 ? 'style="background: #'.$color2.';"' : '').'class="'.($style2 ? $style2.' ' : '').'onclickopenref center'.($title1 ? ' cursorpointer' : '').'" ref="ref_'.$username->id.'_'.sprintf("%04d", $year).'_'.sprintf("%02d", $month).'_'.sprintf("%02d", $day).'_'.sprintf("%02d", $h).'_30_'.($ids2 ? $ids2 : 'none').'"'.($title2 ? ' title="'.$title2.'"' : '').'>';
|
||||
print $string2;
|
||||
print '</td></tr>';
|
||||
print '</table>';
|
||||
|
||||
@ -711,10 +711,6 @@ if ($resql) {
|
||||
$event->date_end_in_calendar = $datep;
|
||||
}
|
||||
}
|
||||
// Define ponctual property
|
||||
if ($event->date_start_in_calendar == $event->date_end_in_calendar) {
|
||||
$event->ponctuel = 1;
|
||||
}
|
||||
|
||||
// Check values
|
||||
if ($event->date_end_in_calendar < $firstdaytoshow ||
|
||||
@ -1441,7 +1437,7 @@ function show_day_events2($username, $day, $month, $year, $monthshown, $style, &
|
||||
}
|
||||
print 'class="';
|
||||
print ($style1 ? $style1.' ' : '');
|
||||
print 'onclickopenref'.($title2 ? ' classfortooltip' : '').($title1 ? ' cursorpointer' : '').'" ref="ref_'.$username->id.'_'.sprintf("%04d", $year).'_'.sprintf("%02d", $month).'_'.sprintf("%02d", $day).'_'.sprintf("%02d", $h).'_00_'.($ids1 ? $ids1 : 'none').'"'.($title1 ? ' title="'.$title1.'"' : '').'>';
|
||||
print 'onclickopenref center'.($title2 ? ' classfortooltip' : '').($title1 ? ' cursorpointer' : '').'" ref="ref_'.$username->id.'_'.sprintf("%04d", $year).'_'.sprintf("%02d", $month).'_'.sprintf("%02d", $day).'_'.sprintf("%02d", $h).'_00_'.($ids1 ? $ids1 : 'none').'"'.($title1 ? ' title="'.$title1.'"' : '').'>';
|
||||
print $string1;
|
||||
print '</td><td ';
|
||||
if ($style2 == 'peruser_notbusy') {
|
||||
@ -1451,7 +1447,7 @@ function show_day_events2($username, $day, $month, $year, $monthshown, $style, &
|
||||
}
|
||||
print 'class="';
|
||||
print ($style2 ? $style2.' ' : '');
|
||||
print 'onclickopenref'.($title2 ? ' classfortooltip' : '').($title1 ? ' cursorpointer' : '').'" ref="ref_'.$username->id.'_'.sprintf("%04d", $year).'_'.sprintf("%02d", $month).'_'.sprintf("%02d", $day).'_'.sprintf("%02d", $h).'_30_'.($ids2 ? $ids2 : 'none').'"'.($title2 ? ' title="'.$title2.'"' : '').'>';
|
||||
print 'onclickopenref center'.($title2 ? ' classfortooltip' : '').($title1 ? ' cursorpointer' : '').'" ref="ref_'.$username->id.'_'.sprintf("%04d", $year).'_'.sprintf("%02d", $month).'_'.sprintf("%02d", $day).'_'.sprintf("%02d", $h).'_30_'.($ids2 ? $ids2 : 'none').'"'.($title2 ? ' title="'.$title2.'"' : '').'>';
|
||||
print $string2;
|
||||
print '</td></tr>';
|
||||
print '</table>';
|
||||
|
||||
@ -163,7 +163,7 @@ if ($resql) {
|
||||
|
||||
// Button to build doc
|
||||
print '<td class="center">';
|
||||
print '<a class="reposition" href="'.$_SERVER["PHP_SELF"].'?action=builddoc&page='.((int) $page).'&month='.((int) $obj->month).'&year='.((int) $obj->year).'">'.img_picto($langs->trans('BuildDoc'), 'filenew').'</a>';
|
||||
print '<a class="reposition" href="'.$_SERVER["PHP_SELF"].'?action=builddoc&token='.newToken().'&page='.((int) $page).'&month='.((int) $obj->month).'&year='.((int) $obj->year).'">'.img_picto($langs->trans('BuildDoc'), 'filenew').'</a>';
|
||||
print '</td>';
|
||||
|
||||
$name = "actions-".$obj->month."-".$obj->year.".pdf";
|
||||
|
||||
@ -157,10 +157,10 @@ if ($resql) {
|
||||
print '<tr class="oddeven">';
|
||||
print '<td><a href="'.DOL_URL_ROOT.'/contact/card.php?id='.$obj->cidp.'&socid='.$obj->rowid.'">'.img_object($langs->trans("ShowContact"), "contact");
|
||||
print '</a> <a href="'.DOL_URL_ROOT.'/contact/card.php?id='.$obj->cidp.'&socid='.$obj->rowid.'">'.$obj->name.'</a></td>';
|
||||
print "<td>$obj->firstname</TD>";
|
||||
print '<td>'.dol_escape_htmltag($obj->firstname).'</td>';
|
||||
|
||||
print '<td><a href="'.$_SERVER["PHP_SELF"].'?type='.$type.'&socid='.$obj->rowid.'">'.img_object($langs->trans("ShowCompany"), "company").'</a> ';
|
||||
print "<a href=\"".$urlfiche."?socid=".$obj->rowid."\">$obj->name</a></td>\n";
|
||||
print '<a href="'.$urlfiche."?socid=".$obj->rowid.'">'.$obj->name."</a></td>\n";
|
||||
|
||||
print '<td>'.dol_print_phone($obj->email, $obj->cidp, $obj->rowid, 'AC_EMAIL').'</td>';
|
||||
|
||||
|
||||
@ -493,9 +493,9 @@ if (empty($reshook)) {
|
||||
if ($action == 'add') {
|
||||
$mesgs = array();
|
||||
|
||||
$object->email_from = (string) GETPOST("from", "none"); // Must allow 'name <email>'
|
||||
$object->email_replyto = (string) GETPOST("replyto", "none"); // Must allow 'name <email>'
|
||||
$object->email_errorsto = (string) GETPOST("errorsto", "none"); // Must allow 'name <email>'
|
||||
$object->email_from = (string) GETPOST("from", 'alphawithlgt'); // Must allow 'name <email>'
|
||||
$object->email_replyto = (string) GETPOST("replyto", 'alphawithlgt'); // Must allow 'name <email>'
|
||||
$object->email_errorsto = (string) GETPOST("errorsto", 'alphawithlgt'); // Must allow 'name <email>'
|
||||
$object->title = (string) GETPOST("title");
|
||||
$object->sujet = (string) GETPOST("sujet");
|
||||
$object->body = (string) GETPOST("bodyemail", 'restricthtml');
|
||||
@ -531,11 +531,11 @@ if (empty($reshook)) {
|
||||
if ($action == 'settitle') {
|
||||
$object->title = trim(GETPOST('title', 'alpha'));
|
||||
} elseif ($action == 'setemail_from') {
|
||||
$object->email_from = trim(GETPOST('email_from', 'none')); // Must allow 'name <email>'
|
||||
$object->email_from = trim(GETPOST('email_from', 'alphawithlgt')); // Must allow 'name <email>'
|
||||
} elseif ($action == 'setemail_replyto') {
|
||||
$object->email_replyto = trim(GETPOST('email_replyto', 'none')); // Must allow 'name <email>'
|
||||
$object->email_replyto = trim(GETPOST('email_replyto', 'alphawithlgt')); // Must allow 'name <email>'
|
||||
} elseif ($action == 'setemail_errorsto') {
|
||||
$object->email_errorsto = trim(GETPOST('email_errorsto', 'none')); // Must allow 'name <email>'
|
||||
$object->email_errorsto = trim(GETPOST('email_errorsto', 'alphawithlgt')); // Must allow 'name <email>'
|
||||
} elseif ($action == 'settitle' && empty($object->title)) {
|
||||
$mesg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailTitle"));
|
||||
} elseif ($action == 'setfrom' && empty($object->email_from)) {
|
||||
|
||||
@ -230,7 +230,7 @@ class FormAdvTargetEmailing extends Form
|
||||
$InfoFieldList = explode(":", $param_list [0]);
|
||||
|
||||
// 0 1 : tableName
|
||||
// 1 2 : label field name Nom du champ contenant le libelle
|
||||
// 1 2 : label field name Name of field that contains the label
|
||||
// 2 3 : key fields name (if differ of rowid)
|
||||
// 3 4 : where clause filter on column or table extrafield, syntax field='value' or extra.field=value
|
||||
|
||||
@ -304,7 +304,7 @@ class FormAdvTargetEmailing extends Form
|
||||
if ($num) {
|
||||
while ($i < $num) {
|
||||
$obj = $this->db->fetch_object($resql);
|
||||
// Si traduction existe, on l'utilise, sinon on prend le libelle par defaut
|
||||
// If a translation exists, we use it, else we use the default label
|
||||
$label = ($langs->trans("Civility".$obj->code) != "Civility".$obj->code ? $langs->trans("Civility".$obj->code) : ($obj->civilite != '-' ? $obj->civilite : ''));
|
||||
|
||||
$options_array[$obj->code] = $label;
|
||||
|
||||
@ -754,7 +754,7 @@ class Mailing extends CommonObject
|
||||
/**
|
||||
* Return label of status of emailing (draft, validated, ...)
|
||||
*
|
||||
* @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long
|
||||
* @param int $mode 0=Long label, 1=Short label, 2=Picto+Short label, 3=Picto, 4=Picto+Short label, 5=Short label+Picto, 6=Picto+Long label, 7=Very short label+Picto
|
||||
* @return string Label
|
||||
*/
|
||||
public function getLibStatut($mode = 0)
|
||||
@ -764,10 +764,10 @@ class Mailing extends CommonObject
|
||||
|
||||
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
|
||||
/**
|
||||
* Renvoi le libelle d'un statut donne
|
||||
* Return the label of a given status
|
||||
*
|
||||
* @param int $status Id status
|
||||
* @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto
|
||||
* @param int $mode 0=Long label, 1=Short label, 2=Picto+Short label, 3=Picto, 4=Picto+Short label, 5=Short label+Picto, 6=Picto+Long label, 7=Very short label+Picto
|
||||
* @return string Label
|
||||
*/
|
||||
public function LibStatut($status, $mode = 0)
|
||||
@ -792,11 +792,11 @@ class Mailing extends CommonObject
|
||||
|
||||
|
||||
/**
|
||||
* Renvoi le libelle d'un statut donne
|
||||
* Return the label of a given status of a recipient
|
||||
* TODO Add class mailin_target.class.php
|
||||
*
|
||||
* @param int $status Id status
|
||||
* @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto
|
||||
* @param int $mode 0=Long label, 1=Short label, 2=Picto+Short label, 3=Picto, 4=Picto+Short label, 5=Short label+Picto, 6=Picto+Long label, 7=Very short label+Picto
|
||||
* @param string $desc Desc error
|
||||
* @return string Label
|
||||
*/
|
||||
|
||||
@ -77,7 +77,7 @@ if (!empty($conf->propal->enabled)) {
|
||||
*
|
||||
*/
|
||||
|
||||
$sql = "SELECT count(*) as cc, st.libelle, st.picto, st.id";
|
||||
$sql = "SELECT count(*) as cc, st.libelle as stcomm, st.picto, st.id";
|
||||
$sql .= " FROM ".MAIN_DB_PREFIX."societe as s";
|
||||
$sql .= ", ".MAIN_DB_PREFIX."c_stcomm as st ";
|
||||
if (empty($user->rights->societe->client->voir) && !$socid) {
|
||||
|
||||
@ -210,6 +210,8 @@ if (empty($reshook)) {
|
||||
// Remove a product line
|
||||
$result = $object->deleteline($user, $lineid);
|
||||
if ($result > 0) {
|
||||
// reorder lines
|
||||
$object->line_order(true);
|
||||
// Define output language
|
||||
$outputlangs = $langs;
|
||||
$newlang = '';
|
||||
|
||||
@ -265,6 +265,8 @@ if (empty($reshook)) {
|
||||
|
||||
$result = $object->deleteline(GETPOST('lineid', 'int'));
|
||||
if ($result > 0) {
|
||||
// reorder lines
|
||||
$object->line_order(true);
|
||||
// Define output language
|
||||
$outputlangs = $langs;
|
||||
$newlang = '';
|
||||
|
||||
@ -527,9 +527,9 @@ class Facture extends CommonInvoice
|
||||
|
||||
// Fields coming from GUI (priority on template). TODO Value of template should be used as default value on GUI so we can use here always value from GUI
|
||||
$this->fk_project = GETPOST('projectid', 'int') > 0 ? ((int) GETPOST('projectid', 'int')) : $_facrec->fk_project;
|
||||
$this->note_public = GETPOST('note_public', 'none') ? GETPOST('note_public', 'restricthtml') : $_facrec->note_public;
|
||||
$this->note_private = GETPOST('note_private', 'none') ? GETPOST('note_private', 'restricthtml') : $_facrec->note_private;
|
||||
$this->model_pdf = GETPOST('model', 'alpha') ? GETPOST('model', 'alpha') : $_facrec->model_pdf;
|
||||
$this->note_public = GETPOSTISSET('note_public') ? GETPOST('note_public', 'restricthtml') : $_facrec->note_public;
|
||||
$this->note_private = GETPOSTISSET('note_private') ? GETPOST('note_private', 'restricthtml') : $_facrec->note_private;
|
||||
$this->model_pdf = GETPOSTISSET('model') ? GETPOST('model', 'alpha') : $_facrec->model_pdf;
|
||||
$this->cond_reglement_id = GETPOST('cond_reglement_id', 'int') > 0 ? ((int) GETPOST('cond_reglement_id', 'int')) : $_facrec->cond_reglement_id;
|
||||
$this->mode_reglement_id = GETPOST('mode_reglement_id', 'int') > 0 ? ((int) GETPOST('mode_reglement_id', 'int')) : $_facrec->mode_reglement_id;
|
||||
$this->fk_account = GETPOST('fk_account') > 0 ? ((int) GETPOST('fk_account')) : $_facrec->fk_account;
|
||||
|
||||
@ -196,7 +196,8 @@ if ($action == 'add' && !$cancel) {
|
||||
}
|
||||
$object->amount = $amount;
|
||||
$object->label = GETPOST("label", 'alpha');
|
||||
$object->note = GETPOST("note", 'none');
|
||||
$object->note = GETPOST("note", 'restricthtml');
|
||||
$object->note_private = GETPOST("note", 'restricthtml');
|
||||
|
||||
if (empty($object->datep)) {
|
||||
setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DatePayment")), null, 'errors');
|
||||
@ -236,7 +237,7 @@ if ($action == 'add' && !$cancel) {
|
||||
$paiement->amounts = array($object->id=>$amount); // Tableau de montant
|
||||
$paiement->paiementtype = GETPOST("type_payment", 'alphanohtml');
|
||||
$paiement->num_payment = GETPOST("num_payment", 'alphanohtml');
|
||||
$paiement->note = GETPOST("note", 'none');
|
||||
$paiement->note = GETPOST("note", 'restricthtml');
|
||||
|
||||
if (!$error) {
|
||||
$paymentid = $paiement->create($user, (int) GETPOST('closepaidtva'));
|
||||
|
||||
@ -1395,14 +1395,14 @@ class Contact extends CommonObject
|
||||
* @param string $moreparam Add more param into URL
|
||||
* @param int $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking
|
||||
* @param int $notooltip 1=Disable tooltip
|
||||
* @param string $morecss Add more css on link
|
||||
* @return string String with URL
|
||||
*/
|
||||
public function getNomUrl($withpicto = 0, $option = '', $maxlen = 0, $moreparam = '', $save_lastsearch_value = -1, $notooltip = 0)
|
||||
public function getNomUrl($withpicto = 0, $option = '', $maxlen = 0, $moreparam = '', $save_lastsearch_value = -1, $notooltip = 0, $morecss = '')
|
||||
{
|
||||
global $conf, $langs, $hookmanager;
|
||||
|
||||
$result = ''; $label = '';
|
||||
|
||||
if (!empty($this->photo) && class_exists('Form')) {
|
||||
$label .= '<div class="photointooltip floatright">';
|
||||
$label .= Form::showphoto('contact', $this, 0, 40, 0, 'photoref', 'mini', 0); // Important, we must force height so image will have height tags and if image is inside a tooltip, the tooltip manager can calculate height and position correctly the tooltip.
|
||||
@ -1454,7 +1454,7 @@ class Contact extends CommonObject
|
||||
$linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
|
||||
}
|
||||
$linkclose .= ' title="'.dol_escape_htmltag($label, 1).'"';
|
||||
$linkclose .= ' class="classfortooltip"';
|
||||
$linkclose .= ' class="classfortooltip'.($morecss ? ' '.$morecss : '').'"';
|
||||
|
||||
/*
|
||||
$hookmanager->initHooks(array('contactdao'));
|
||||
@ -1476,7 +1476,7 @@ class Contact extends CommonObject
|
||||
$result .= $linkstart;
|
||||
if ($withpicto) {
|
||||
if ($withpicto == -2) {
|
||||
$result .= '<!-- picto photo user --><span class="nopadding userimg'.($moreparam ? ' '.$moreparam : '').'">'.Form::showphoto('contact', $this, 0, 0, 0, 'userphoto'.($withpicto == -3 ? 'small' : ''), 'mini', 0, 1).'</span>';
|
||||
$result .= '<!-- picto photo user --><span class="nopadding userimg'.($morecss ? ' '.$morecss : '').'">'.Form::showphoto('contact', $this, 0, 0, 0, 'userphoto'.($withpicto == -3 ? 'small' : ''), 'mini', 0, 1).'</span>';
|
||||
} else {
|
||||
$result .= img_object(($notooltip ? '' : $label), ( $this->picto ? $this->picto : 'generic'), ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
|
||||
}
|
||||
|
||||
@ -170,8 +170,10 @@ if (empty($_SESSION['auto_check_events_not_before']) || $time >= $_SESSION['auto
|
||||
$event['code'] = $obj->code;
|
||||
$event['label'] = $obj->label;
|
||||
$event['location'] = $obj->location;
|
||||
$event['reminder_date_formated'] = dol_print_date($db->jdate($obj->dateremind), 'standard');
|
||||
$event['event_date_start_formated'] = dol_print_date($db->jdate($obj->datep), 'standard');
|
||||
$event['reminder_date_formated_tzserver'] = dol_print_date($db->jdate($obj->dateremind), 'standard', 'tzserver');
|
||||
$event['event_date_start_formated_tzserver'] = dol_print_date($db->jdate($obj->datep), 'standard', 'tzserver');
|
||||
$event['reminder_date_formated'] = dol_print_date($db->jdate($obj->dateremind), 'standard', 'tzuser');
|
||||
$event['event_date_start_formated'] = dol_print_date($db->jdate($obj->datep), 'standard', 'tzuser');
|
||||
|
||||
$eventfound[$obj->id_agenda] = $event;
|
||||
}
|
||||
|
||||
@ -94,12 +94,12 @@ class box_produits_alerte_stock extends ModeleBoxes
|
||||
$sql .= " FROM ".MAIN_DB_PREFIX."product as p";
|
||||
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product_stock as s on p.rowid = s.fk_product";
|
||||
$sql .= ' WHERE p.entity IN ('.getEntity($productstatic->element).')';
|
||||
$sql .= " AND p.tosell = 1 AND p.seuil_stock_alerte > 0";
|
||||
$sql .= " AND p.seuil_stock_alerte > 0";
|
||||
if (empty($user->rights->produit->lire)) {
|
||||
$sql .= ' AND p.fk_product_type != 0';
|
||||
$sql .= ' AND p.fk_product_type <> 0';
|
||||
}
|
||||
if (empty($user->rights->service->lire)) {
|
||||
$sql .= ' AND p.fk_product_type != 1';
|
||||
$sql .= ' AND p.fk_product_type <> 1';
|
||||
}
|
||||
// Add where from hooks
|
||||
if (is_object($hookmanager)) {
|
||||
|
||||
@ -29,8 +29,9 @@
|
||||
|
||||
/**
|
||||
* Class to send SMS
|
||||
* Usage: $smsfile = new CSMSFile($subject,$sendto,$replyto,$message,$filepath,$mimetype,$filename,$cc,$ccc,$deliveryreceipt,$msgishtml,$errors_to);
|
||||
* $smsfile->sendfile();
|
||||
* Usage: $smsfile = new CSMSFile($subject,$sendto,$replyto,$message,$filepath,$mimetype,$filename,$cc,$ccc,$deliveryreceipt,$msgishtml,$errors_to);
|
||||
* $smsfile->socid=...; $smsfile->contact_id=...; $smsfile->member_id=...; $smsfile->fk_project=...;
|
||||
* $smsfile->sendfile();
|
||||
*/
|
||||
class CSMSFile
|
||||
{
|
||||
@ -48,7 +49,8 @@ class CSMSFile
|
||||
public $nostop;
|
||||
|
||||
public $socid;
|
||||
public $contactid;
|
||||
public $contact_id;
|
||||
public $member_id;
|
||||
|
||||
public $fk_project;
|
||||
|
||||
@ -135,6 +137,7 @@ class CSMSFile
|
||||
|
||||
$sms->socid = $this->socid;
|
||||
$sms->contact_id = $this->contact_id;
|
||||
$sms->member_id = $this->member_id;
|
||||
$sms->project = $this->fk_project;
|
||||
|
||||
$res = $sms->SmsSend();
|
||||
@ -167,6 +170,7 @@ class CSMSFile
|
||||
|
||||
$sms->socid = $this->socid;
|
||||
$sms->contact_id = $this->contact_id;
|
||||
$sms->member_id = $this->member_id;
|
||||
$sms->fk_project = $this->fk_project;
|
||||
|
||||
$res = $sms->SmsSend();
|
||||
|
||||
@ -1947,8 +1947,8 @@ class ExtraFields
|
||||
if (!empty($onlykey) && $onlykey != '@GETPOSTISSET' && $key != $onlykey) {
|
||||
continue;
|
||||
}
|
||||
if (!empty($onlykey) && $onlykey == '@GETPOSTISSET' && !GETPOSTISSET('options_'.$key) && $this->attributes[$object->table_element]['type'][$key] != 'boolean') {
|
||||
//when unticking boolean field, it's not set in POST
|
||||
|
||||
if (!empty($onlykey) && $onlykey == '@GETPOSTISSET' && !GETPOSTISSET('options_'.$key) && (! in_array($this->attributes[$object->table_element]['type'][$key], array('boolean', 'chkbxlst')))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@ -111,7 +111,7 @@ class HookManager
|
||||
|
||||
if (in_array($context, $arrayhooks) || in_array('all', $arrayhooks)) { // We instantiate action class only if initialized hook is handled by module
|
||||
// Include actions class overwriting hooks
|
||||
if (empty($this->hooks[$context][$module]) || !is_object($this->hooks[$context][$module])) { // If set to an object value, class was already loaded
|
||||
if (empty($this->hooks[$context][$module]) || !is_object($this->hooks[$context][$module])) { // If set to an object value, class was already loaded so we do nothing.
|
||||
$path = '/'.$module.'/class/';
|
||||
$actionfile = 'actions_'.$module.'.class.php';
|
||||
|
||||
|
||||
@ -352,7 +352,7 @@ class FormActions
|
||||
* @param array|string $selected Type pre-selected (can be 'manual', 'auto' or 'AC_xxx'). Can be an array too.
|
||||
* @param string $htmlname Name of select field
|
||||
* @param string $excludetype A type to exclude ('systemauto', 'system', '')
|
||||
* @param integer $onlyautoornot 1=Group all type AC_XXX into 1 line AC_MANUAL. 0=Keep details of type, -1=Keep details and add a combined line "All manual"
|
||||
* @param integer $onlyautoornot 1=Group all type AC_XXX into 1 line AC_MANUAL. 0=Keep details of type, -1=Keep details and add a combined line "All manual", -2=Combined line is disabled (not implemented yet)
|
||||
* @param int $hideinfohelp 1=Do not show info help, 0=Show, -1=Show+Add info to tell how to set default value
|
||||
* @param int $multiselect 1=Allow multiselect of action type
|
||||
* @param int $nooutput 1=No output
|
||||
@ -373,7 +373,7 @@ class FormActions
|
||||
$caction = new CActionComm($this->db);
|
||||
|
||||
// Suggest a list with manual events or all auto events
|
||||
$arraylist = $caction->liste_array(1, 'code', $excludetype, $onlyautoornot);
|
||||
$arraylist = $caction->liste_array(1, 'code', $excludetype, $onlyautoornot, '', 0); // If we use param 'all' instead of 'code', there is no group by include in answer but the key 'type' of answer array contains the key for the group by.
|
||||
if (empty($multiselect)) {
|
||||
// Add empty line at start only if no multiselect
|
||||
array_unshift($arraylist, ' ');
|
||||
|
||||
@ -73,15 +73,19 @@ class FormAdmin
|
||||
|
||||
$langs_available = $langs->get_available_languages(DOL_DOCUMENT_ROOT, 12, 0, $mainlangonly);
|
||||
|
||||
// If the language to select is not inside the list of available language and empty value is not available, we must find
|
||||
// an alternative as the language code to pre-select (to avoid to have first element in list pre-selected).
|
||||
if ($selected && !array_key_exists($selected, $langs_available) && empty($showempty)) {
|
||||
$tmparray = explode('_', $selected);
|
||||
if (!empty($tmparray[1])) {
|
||||
$selected = getLanguageCodeFromCountryCode($tmparray[1]);
|
||||
}
|
||||
if (empty($selected)) {
|
||||
$selected = $langs->defaultlang;
|
||||
// If empty value is not allowed and the language to select is not inside the list of available language and we must find
|
||||
// an alternative of the language code to pre-select (to avoid to have first element in list pre-selected).
|
||||
if ($selected && empty($showempty)) {
|
||||
if (!is_array($selected) && !array_key_exists($selected, $langs_available)) {
|
||||
$tmparray = explode('_', $selected);
|
||||
if (!empty($tmparray[1])) {
|
||||
$selected = getLanguageCodeFromCountryCode($tmparray[1]);
|
||||
}
|
||||
if (empty($selected)) {
|
||||
$selected = $langs->defaultlang;
|
||||
}
|
||||
} else {
|
||||
// If the preselected value is an array, we do not try to find alternative to preselect
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -249,7 +249,7 @@ class Link extends CommonObject
|
||||
$resql = $this->db->query($sql);
|
||||
if ($resql) {
|
||||
$num = $this->db->num_rows($resql);
|
||||
dol_syslog(get_class($this)."::fetchAll ".$num."records", LOG_DEBUG);
|
||||
dol_syslog(get_class($this)."::fetchAll num=".((int) $num), LOG_DEBUG);
|
||||
if ($num > 0) {
|
||||
while ($obj = $this->db->fetch_object($resql)) {
|
||||
$link = new Link($this->db);
|
||||
|
||||
@ -56,7 +56,7 @@ if (!defined('USE_CUSTOM_REPORT_AS_INCLUDE')) {
|
||||
}
|
||||
|
||||
$search_yaxis = GETPOST('search_yaxis', 'array');
|
||||
$search_graph = GETPOST('search_graph', 'none');
|
||||
$search_graph = GETPOST('search_graph', 'restricthtml');
|
||||
|
||||
// Load variable for pagination
|
||||
$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
|
||||
|
||||
@ -62,11 +62,26 @@ abstract class DoliDB implements Database
|
||||
/** @var string Last error number. For example: 'DB_ERROR_RECORD_ALREADY_EXISTS', '12345', ... */
|
||||
public $lasterrno;
|
||||
|
||||
/** @var string If we need to set a prefix specific to the database so it can be reused (when defined instead of MAIN_DB_PREFIX) to forge requests */
|
||||
public $prefix_db;
|
||||
|
||||
/** @var bool Status */
|
||||
public $ok;
|
||||
/** @var string */
|
||||
public $error;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Return the DB prefix
|
||||
*
|
||||
* @return string The DB prefix
|
||||
*/
|
||||
public function prefix()
|
||||
{
|
||||
return (empty($this->prefix_db) ? MAIN_DB_PREFIX : $this->prefix_db);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format a SQL IF
|
||||
*
|
||||
|
||||
@ -121,12 +121,13 @@ print '
|
||||
display: none;
|
||||
}
|
||||
|
||||
a.alilevel0 {
|
||||
a.alilevel0, span.spanlilevel0 {
|
||||
background-image: url(\''.DOL_URL_ROOT.'/theme/'.urlencode($conf->theme).'/img/next.png\') !important;
|
||||
background-repeat: no-repeat !important;
|
||||
background-position-x: 10px;
|
||||
background-position-y: 16px;
|
||||
padding: 1em 15px 1em 40px;
|
||||
display: block;
|
||||
}
|
||||
li.lilevel0 font.vsmenudisabled {
|
||||
background-repeat: no-repeat !important;
|
||||
|
||||
@ -64,7 +64,7 @@ print "jQuery(document).ready(function () {\n";
|
||||
//print " console.log('referrer=".dol_escape_js($_SERVER['HTTP_REFERER'])."');\n";
|
||||
|
||||
print ' var nowtime = Date.now();';
|
||||
print ' var time_auto_update = '.$conf->global->MAIN_BROWSER_NOTIFICATION_FREQUENCY.';'."\n"; // Always defined
|
||||
print ' var time_auto_update = '.max(1, getDolGlobalInt('MAIN_BROWSER_NOTIFICATION_FREQUENCY')).';'."\n"; // Always defined
|
||||
print ' var time_js_next_test;'."\n";
|
||||
?>
|
||||
|
||||
|
||||
@ -240,6 +240,7 @@ function run_sql($sqlfile, $silent = 1, $entity = '', $usesavepoint = 1, $handle
|
||||
if (empty($nocommentremoval)) {
|
||||
$buf = preg_replace('/([,;ERLT\)])\s*--.*$/i', '\1', $buf); //remove comment from a line that not start with -- before add it to the buffer
|
||||
}
|
||||
if ($buffer) $buffer .= ' ';
|
||||
$buffer .= trim($buf);
|
||||
}
|
||||
|
||||
@ -639,7 +640,7 @@ function modules_prepare_head($nbofactivatedmodules, $nboftotalmodules)
|
||||
if ($nbofactivatedmodules <= (empty($conf->global->MAIN_MIN_NB_ENABLED_MODULE_FOR_WARNING) ? 1 : $conf->global->MAIN_MIN_NB_ENABLED_MODULE_FOR_WARNING)) { // If only minimal initial modules enabled)
|
||||
//$head[$h][1] = $form->textwithpicto($langs->trans("AvailableModules"), $desc);
|
||||
$head[$h][1] = $langs->trans("AvailableModules");
|
||||
$head[$h][1] .= $form->textwithpicto('', $langs->trans("YouMustEnableOneModule").'.<br><br><span class="opacitymedium">'.$desc.'</span>', 1, warning);
|
||||
$head[$h][1] .= $form->textwithpicto('', $langs->trans("YouMustEnableOneModule").'.<br><br><span class="opacitymedium">'.$desc.'</span>', 1, 'warning');
|
||||
} else {
|
||||
//$head[$h][1] = $langs->trans("AvailableModules").$form->textwithpicto('<span class="badge marginleftonly">'.$nbofactivatedmodules.' / '.$nboftotalmodules.'</span>', $desc, 1, 'help', '', 1, 3);
|
||||
$head[$h][1] = $langs->trans("AvailableModules").'<span class="badge marginleftonly">'.$nbofactivatedmodules.' / '.$nboftotalmodules.'</span>';
|
||||
|
||||
@ -641,7 +641,7 @@ function GETPOST($paramname, $check = 'alphanohtml', $method = 0, $filter = null
|
||||
}
|
||||
|
||||
// Check rule
|
||||
if (preg_match('/^array/', $check)) { // If 'array' or 'array:restricthtml' or 'array:aZ09'
|
||||
if (preg_match('/^array/', $check)) { // If 'array' or 'array:restricthtml' or 'array:aZ09' or 'array:intcomma'
|
||||
if (!is_array($out) || empty($out)) {
|
||||
$out = array();
|
||||
} else {
|
||||
@ -828,7 +828,10 @@ function checkVal($out = '', $check = 'alphanohtml', $filter = null, $options =
|
||||
// We replace chars from a/A to z/Z encoded with numeric HTML entities with the real char so we won't loose the chars at the next step (preg_replace).
|
||||
// No need to use a loop here, this step is not to sanitize (this is done at next step, this is to try to save chars, even if they are
|
||||
// using a non coventionnel way to be encoded, to not have them sanitized just after)
|
||||
$out = preg_replace_callback('/&#(x?[0-9][0-9a-f]+;?)/i', 'realCharForNumericEntities', $out);
|
||||
//$out = preg_replace_callback('/&#(x?[0-9][0-9a-f]+;?)/i', 'realCharForNumericEntities', $out);
|
||||
$out = preg_replace_callback('/&#(x?[0-9][0-9a-f]+;?)/i', function ($m) {
|
||||
return realCharForNumericEntities($m); }, $out);
|
||||
|
||||
|
||||
// Now we remove all remaining HTML entities starting with a number. We don't want such entities.
|
||||
$out = preg_replace('/&#x?[0-9]+/i', '', $out); // For example if we have javascript with an entities without the ; to hide the 'a' of 'javascript'.
|
||||
@ -1894,7 +1897,7 @@ function dol_banner_tab($object, $paramid, $morehtml = '', $shownav = 1, $fieldi
|
||||
|
||||
if ($object->element == 'product') {
|
||||
$width = 80;
|
||||
$cssclass = 'photoref';
|
||||
$cssclass = 'photowithmargin photoref';
|
||||
$showimage = $object->is_photo_available($conf->product->multidir_output[$entity]);
|
||||
$maxvisiblephotos = (isset($conf->global->PRODUCT_MAX_VISIBLE_PHOTO) ? $conf->global->PRODUCT_MAX_VISIBLE_PHOTO : 5);
|
||||
if ($conf->browser->layout == 'phone') {
|
||||
@ -1996,7 +1999,7 @@ function dol_banner_tab($object, $paramid, $morehtml = '', $shownav = 1, $fieldi
|
||||
}
|
||||
}
|
||||
} elseif (!$phototoshow) { // example if modulepart = 'societe' or 'photo'
|
||||
$phototoshow .= $form->showphoto($modulepart, $object, 0, 0, 0, 'photoref', 'small', 1, 0, $maxvisiblephotos);
|
||||
$phototoshow .= $form->showphoto($modulepart, $object, 0, 0, 0, 'photowithmargin photoref', 'small', 1, 0, $maxvisiblephotos);
|
||||
}
|
||||
|
||||
if ($phototoshow) {
|
||||
@ -3640,7 +3643,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $
|
||||
'1downarrow', '1uparrow', '1leftarrow', '1rightarrow', '1uparrow_selected', '1downarrow_selected', '1leftarrow_selected', '1rightarrow_selected',
|
||||
'accountancy', 'accounting_account', 'account', 'accountline', 'action', 'add', 'address', 'angle-double-down', 'angle-double-up', 'asset',
|
||||
'bank_account', 'barcode', 'bank', 'bell', 'bill', 'billa', 'billr', 'billd', 'bookmark', 'bom', 'bug', 'building',
|
||||
'calendar', 'calendarmonth', 'calendarweek', 'calendarday', 'calendarperuser', 'calendarpertype',
|
||||
'card', 'calendar', 'calendarmonth', 'calendarweek', 'calendarday', 'calendarperuser', 'calendarpertype',
|
||||
'cash-register', 'category', 'chart', 'check', 'clock', 'close_title', 'cog', 'collab', 'company', 'contact', 'country', 'contract', 'conversation', 'cron', 'cubes',
|
||||
'multicurrency',
|
||||
'delete', 'dolly', 'dollyrevert', 'donation', 'download', 'dynamicprice',
|
||||
@ -3652,9 +3655,10 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $
|
||||
'label', 'language', 'link', 'list', 'list-alt', 'listlight', 'loan', 'lot', 'long-arrow-alt-right',
|
||||
'margin', 'map-marker-alt', 'member', 'meeting', 'money-bill-alt', 'movement', 'mrp', 'note', 'next',
|
||||
'off', 'on', 'order',
|
||||
'paiment', 'paragraph', 'play', 'pdf', 'phone', 'phoning', 'phoning_mobile', 'phoning_fax', 'playdisabled', 'previous', 'poll', 'pos', 'printer', 'product', 'propal', 'stock', 'resize', 'service', 'stats', 'trip',
|
||||
'paiment', 'paragraph', 'play', 'pdf', 'phone', 'phoning', 'phoning_mobile', 'phoning_fax', 'playdisabled', 'previous', 'poll', 'pos', 'printer', 'product', 'propal', 'puce',
|
||||
'stock', 'resize', 'service', 'stats', 'trip',
|
||||
'security', 'setup', 'share-alt', 'sign-out', 'split', 'stripe', 'stripe-s', 'switch_off', 'switch_on', 'switch_on_red', 'tools', 'unlink', 'uparrow', 'user', 'vcard', 'wrench',
|
||||
'github', 'jabber', 'skype', 'twitter', 'facebook', 'linkedin', 'instagram', 'snapchat', 'youtube', 'google-plus-g', 'whatsapp',
|
||||
'github', 'google', 'jabber', 'skype', 'twitter', 'facebook', 'linkedin', 'instagram', 'snapchat', 'youtube', 'google-plus-g', 'whatsapp',
|
||||
'chevron-left', 'chevron-right', 'chevron-down', 'chevron-top', 'commercial', 'companies',
|
||||
'generic', 'home', 'hrm', 'members', 'products', 'invoicing',
|
||||
'partnership', 'payment', 'payment_vat', 'pencil-ruler', 'preview', 'project', 'projectpub', 'projecttask', 'question', 'refresh', 'region',
|
||||
@ -3671,10 +3675,10 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $
|
||||
$facolor = '';
|
||||
$fasize = '';
|
||||
$fa = 'fas';
|
||||
if (in_array($pictowithouttext, array('bell', 'clock', 'establishment', 'generic', 'minus-square', 'object_generic', 'pdf', 'plus-square', 'timespent', 'note', 'off', 'on', 'object_bookmark', 'bookmark', 'vcard'))) {
|
||||
if (in_array($pictowithouttext, array('card', 'bell', 'clock', 'establishment', 'generic', 'minus-square', 'object_generic', 'pdf', 'plus-square', 'timespent', 'note', 'off', 'on', 'object_bookmark', 'bookmark', 'vcard'))) {
|
||||
$fa = 'far';
|
||||
}
|
||||
if (in_array($pictowithouttext, array('black-tie', 'github', 'skype', 'twitter', 'facebook', 'linkedin', 'instagram', 'snapchat', 'stripe', 'stripe-s', 'youtube', 'google-plus-g', 'whatsapp'))) {
|
||||
if (in_array($pictowithouttext, array('black-tie', 'github', 'google', 'skype', 'twitter', 'facebook', 'linkedin', 'instagram', 'snapchat', 'stripe', 'stripe-s', 'youtube', 'google-plus-g', 'whatsapp'))) {
|
||||
$fa = 'fab';
|
||||
}
|
||||
|
||||
@ -3684,7 +3688,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $
|
||||
'bill'=>'file-invoice-dollar', 'billa'=>'file-excel', 'billr'=>'file-invoice-dollar', 'billd'=>'file-medical',
|
||||
'supplier_invoice'=>'file-invoice-dollar', 'supplier_invoicea'=>'file-excel', 'supplier_invoicer'=>'file-invoice-dollar', 'supplier_invoiced'=>'file-medical',
|
||||
'bom'=>'shapes',
|
||||
'chart'=>'chart-line', 'company'=>'building', 'contact'=>'address-book', 'contract'=>'suitcase', 'collab'=>'people-arrows', 'conversation'=>'comments', 'country'=>'globe-americas', 'cron'=>'business-time',
|
||||
'card'=>'address-card', 'chart'=>'chart-line', 'company'=>'building', 'contact'=>'address-book', 'contract'=>'suitcase', 'collab'=>'people-arrows', 'conversation'=>'comments', 'country'=>'globe-americas', 'cron'=>'business-time',
|
||||
'donation'=>'file-alt', 'dynamicprice'=>'hand-holding-usd',
|
||||
'setup'=>'cog', 'companies'=>'building', 'products'=>'cube', 'commercial'=>'suitcase', 'invoicing'=>'coins',
|
||||
'accounting'=>'search-dollar', 'category'=>'tag', 'dollyrevert'=>'dolly',
|
||||
@ -3704,10 +3708,11 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $
|
||||
'error'=>'exclamation-triangle', 'warning'=>'exclamation-triangle',
|
||||
'other'=>'square',
|
||||
'playdisabled'=>'play', 'pdf'=>'file-pdf', 'poll'=>'check-double', 'pos'=>'cash-register', 'preview'=>'binoculars', 'project'=>'project-diagram', 'projectpub'=>'project-diagram', 'projecttask'=>'tasks', 'propal'=>'file-signature',
|
||||
'partnership'=>'handshake', 'payment'=>'money-check-alt', 'payment_vat'=>'money-check-alt', 'phoning'=>'phone', 'phoning_mobile'=>'mobile-alt', 'phoning_fax'=>'fax', 'previous'=>'arrow-alt-circle-left', 'printer'=>'print', 'product'=>'cube', 'service'=>'concierge-bell',
|
||||
'partnership'=>'handshake', 'payment'=>'money-check-alt', 'payment_vat'=>'money-check-alt', 'phoning'=>'phone', 'phoning_mobile'=>'mobile-alt', 'phoning_fax'=>'fax', 'previous'=>'arrow-alt-circle-left', 'printer'=>'print', 'product'=>'cube', 'puce'=>'angle-right',
|
||||
'recent' => 'question', 'reception'=>'dolly', 'recruitmentjobposition'=>'id-card-alt', 'recruitmentcandidature'=>'id-badge',
|
||||
'resize'=>'crop', 'supplier_order'=>'dol-order_supplier', 'supplier_proposal'=>'file-signature',
|
||||
'refresh'=>'redo', 'region'=>'map-marked', 'resource'=>'laptop-house', 'recurring'=>'history',
|
||||
'service'=>'concierge-bell',
|
||||
'state'=>'map-marked-alt', 'security'=>'key', 'salary'=>'wallet', 'shipment'=>'dolly', 'stock'=>'box-open', 'stats' => 'chart-bar', 'split'=>'code-branch', 'stripe'=>'stripe-s',
|
||||
'supplier'=>'building', 'technic'=>'cogs',
|
||||
'timespent'=>'clock', 'title_setup'=>'tools', 'title_accountancy'=>'money-check-alt', 'title_bank'=>'university', 'title_hrm'=>'umbrella-beach',
|
||||
|
||||
@ -214,11 +214,14 @@ function getURLContent($url, $postorget = 'GET', $param = '', $followlocation =
|
||||
}
|
||||
}
|
||||
|
||||
// Common check (local and external)
|
||||
if (in_array($iptocheck, array('100.100.100.200'))) {
|
||||
$info['http_code'] = 400;
|
||||
$info['content'] = 'Error bad hostname IP (Used by Alibaba metadata). Must be an external URL.';
|
||||
break;
|
||||
// Common check on ip (local and external)
|
||||
$arrayofmetadataserver = array('100.100.100.200' => 'Alibaba', '192.0.0.192'=> 'Oracle', '192.80.8.124'=>'Packet');
|
||||
foreach ($arrayofmetadataserver as $ipofmetadataserver => $nameofmetadataserver) {
|
||||
if ($iptocheck == $ipofmetadataserver) {
|
||||
$info['http_code'] = 400;
|
||||
$info['content'] = 'Error bad hostname IP (Used by '.$nameofmetadataserver.' metadata server). This IP is forbidden.';
|
||||
break 2; // exit the foreach and the do...
|
||||
}
|
||||
}
|
||||
|
||||
// Set CURLOPT_CONNECT_TO so curl will not try another resolution that may give a different result. Possible only on PHP v7+
|
||||
|
||||
@ -25,13 +25,13 @@
|
||||
|
||||
// Supported OAUTH (a provider is supported when a file xxx_oauthcallback.php is available into htdocs/core/modules/oauth)
|
||||
$supportedoauth2array = array(
|
||||
'OAUTH_GOOGLE_NAME'=>'google',
|
||||
'OAUTH_GOOGLE_NAME'=>array('callbackfile' => 'google', 'picto' => 'google', 'urlforapp' => 'OAUTH_GOOGLE_DESC', 'name'=>'Google'),
|
||||
);
|
||||
if ($conf->global->MAIN_FEATURES_LEVEL >= 2) {
|
||||
$supportedoauth2array['OAUTH_STRIPE_TEST_NAME'] = 'stripetest';
|
||||
$supportedoauth2array['OAUTH_STRIPE_LIVE_NAME'] = 'stripelive';
|
||||
if (!empty($conf->stripe->enabled)) {
|
||||
$supportedoauth2array['OAUTH_STRIPE_TEST_NAME'] = array('callbackfile' => 'stripetest', 'picto' => 'stripe', 'urlforapp' => '', 'name'=>'StripeTest');
|
||||
$supportedoauth2array['OAUTH_STRIPE_LIVE_NAME'] = array('callbackfile' => 'stripelive', 'picto' => 'stripe', 'urlforapp' => '', 'name'=>'StripeLive');
|
||||
}
|
||||
$supportedoauth2array['OAUTH_GITHUB_NAME'] = 'github';
|
||||
$supportedoauth2array['OAUTH_GITHUB_NAME'] = array('callbackfile' => 'github', 'picto' => 'github', 'urlforapp' => 'OAUTH_GITHUB_DESC', 'name'=>'GitHub');
|
||||
|
||||
|
||||
|
||||
|
||||
@ -679,22 +679,23 @@ function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$t
|
||||
|
||||
// Title of task
|
||||
if (count($arrayfields) > 0 && !empty($arrayfields['t.label']['checked'])) {
|
||||
print '<td>';
|
||||
$labeltoshow = '';
|
||||
if ($showlineingray) {
|
||||
print '<i>';
|
||||
$labeltoshow .= '<i>';
|
||||
}
|
||||
//else print '<a href="'.DOL_URL_ROOT.'/projet/tasks/task.php?id='.$lines[$i]->id.'&withproject=1">';
|
||||
for ($k = 0; $k < $level; $k++) {
|
||||
print '<div class="marginleftonly">';
|
||||
$labeltoshow .= '<div class="marginleftonly">';
|
||||
}
|
||||
print $lines[$i]->label;
|
||||
$labeltoshow .= dol_escape_htmltag($lines[$i]->label);
|
||||
for ($k = 0; $k < $level; $k++) {
|
||||
print '</div>';
|
||||
$labeltoshow .= '</div>';
|
||||
}
|
||||
if ($showlineingray) {
|
||||
print '</i>';
|
||||
$labeltoshow .= '</i>';
|
||||
}
|
||||
//else print '</a>';
|
||||
print '<td class="tdoverflowmax200" title="'.dol_escape_htmltag($labeltoshow).'">';
|
||||
print $labeltoshow;
|
||||
print "</td>\n";
|
||||
}
|
||||
|
||||
@ -822,29 +823,7 @@ function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$t
|
||||
}
|
||||
}
|
||||
|
||||
// Contacts of tasks. Disabled, because available by default just after
|
||||
/*
|
||||
if (!empty($conf->global->PROJECT_SHOW_CONTACTS_IN_LIST)) {
|
||||
print '<td>';
|
||||
foreach (array('internal', 'external') as $source) {
|
||||
$tab = $lines[$i]->liste_contact(-1, $source);
|
||||
$num = count($tab);
|
||||
if (!empty($num)) {
|
||||
foreach ($tab as $contacttask) {
|
||||
//var_dump($contacttask);
|
||||
if ($source == 'internal') {
|
||||
$c = new User($db);
|
||||
} else {
|
||||
$c = new Contact($db);
|
||||
}
|
||||
$c->fetch($contacttask['id']);
|
||||
print $c->getNomUrl(1).' ('.$contacttask['libelle'].')<br>';
|
||||
}
|
||||
}
|
||||
}
|
||||
print '</td>';
|
||||
}*/
|
||||
if (count($arrayfields) > 0 && !empty($arrayfields['c.assigned']['checked'])) {
|
||||
if (count($arrayfields) > 0 && !empty($arrayfields['c.budget_amount']['checked'])) {
|
||||
print '<td class="center">';
|
||||
print price($lines[$i]->budget_amount, 0, $langs, 1, 0, 0, $conf->currency);
|
||||
$total_budget_amount += $lines[$i]->budget_amount;
|
||||
@ -854,10 +833,11 @@ function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$t
|
||||
// Contacts of task
|
||||
if (count($arrayfields) > 0 && !empty($arrayfields['c.assigned']['checked'])) {
|
||||
print '<td class="center">';
|
||||
$ifisrt = 1;
|
||||
foreach (array('internal', 'external') as $source) {
|
||||
$tab = $lines[$i]->liste_contact(-1, $source);
|
||||
$num = count($tab);
|
||||
if (!empty($num)) {
|
||||
$numcontact = count($tab);
|
||||
if (!empty($numcontact)) {
|
||||
foreach ($tab as $contacttask) {
|
||||
//var_dump($contacttask);
|
||||
if ($source == 'internal') {
|
||||
@ -867,14 +847,19 @@ function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$t
|
||||
}
|
||||
$c->fetch($contacttask['id']);
|
||||
if (!empty($c->photo)) {
|
||||
print $c->getNomUrl(-2).' ';
|
||||
if (get_class($c) == 'User') {
|
||||
print $c->getNomUrl(-2, '', 0, 0, 24, 1, '', ($ifisrt ? '' : 'notfirst'));
|
||||
} else {
|
||||
print $c->getNomUrl(-2, '', 0, '', -1, 0, ($ifisrt ? '' : 'notfirst'));
|
||||
}
|
||||
} else {
|
||||
if (get_class($c) == 'User') {
|
||||
print $c->getNomUrl(2, '', 0, 0, 24, 1);//.' ';
|
||||
print $c->getNomUrl(2, '', 0, 0, 24, 1, '', ($ifisrt ? '' : 'notfirst'));
|
||||
} else {
|
||||
print $c->getNomUrl(2);//.' ';
|
||||
print $c->getNomUrl(2, '', 0, '', -1, 0, ($ifisrt ? '' : 'notfirst'));
|
||||
}
|
||||
}
|
||||
$ifisrt = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
/* Copyright (C) 2007-2015 Laurent Destailleur <eldy@users.sourceforge.net>
|
||||
* Copyright (C) 2007-2015 Regis Houssin <regis.houssin@inodbox.com>
|
||||
* Copyright (C) 2010-2011 Juanjo Menent <jmenent@2byte.es>
|
||||
* Copyright (C) 2022 Harry Winner Kamdem <harry@sense.africa>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -104,7 +105,7 @@ function check_user_password_dolibarr($usertotest, $passwordtotest, $entitytotes
|
||||
}
|
||||
// Check crypted password according to crypt algorithm
|
||||
if ($cryptType == 'auto') {
|
||||
if (dol_verifyHash($passtyped, $passcrypted, '0')) {
|
||||
if ($passcrypted && dol_verifyHash($passtyped, $passcrypted, '0')) {
|
||||
$passok = true;
|
||||
dol_syslog("functions_dolibarr::check_user_password_dolibarr Authentification ok - hash ".$cryptType." of pass is ok");
|
||||
}
|
||||
|
||||
@ -1817,7 +1817,7 @@ function print_left_eldy_menu($db, $menu_array_before, $menu_array_after, &$tabM
|
||||
$newmenu->add("/hrm/evaluation_list.php?mainmenu=hrm&leftmenu=hrm_sm", $langs->trans("Evalutions"), 1, $user->rights->hrm->evaluation->read, '', $mainmenu, 'hrm_sm', 0, '', '', '', img_picto('', 'user', 'class="pictofixedwidth"'));
|
||||
//$newmenu->add("/hrm/evaluation_card.php?mainmenu=hrm&leftmenu=hrm_sm&action=create", $langs->trans("NewEval"), 1, $user->rights->hrm->evaluation->write);
|
||||
//$newmenu->add("/hrm/evaluation_list.php?mainmenu=hrm&leftmenu=hrm_sm", $langs->trans("List"), 1, $user->rights->hrm->evaluation->read);
|
||||
$newmenu->add("/hrm/compare.php?mainmenu=hrm&leftmenu=hrm_sm", $langs->trans("SkillComparison"), 1, $user->rights->hrm->evaluation->read || $user->rights->hrm->compare->read);
|
||||
$newmenu->add("/hrm/compare.php?mainmenu=hrm&leftmenu=hrm_sm", $langs->trans("SkillComparison"), 1, $user->rights->hrm->evaluation->read || $user->rights->hrm->compare_advance->read);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -317,7 +317,7 @@ class MenuManager
|
||||
print '</ul>';
|
||||
}
|
||||
if ($val['enabled'] == 2) {
|
||||
print '<span class="vsmenudisabled">';
|
||||
print '<span class="spanlilevel0 vsmenudisabled">';
|
||||
// Add font-awesome
|
||||
if ($val['level'] == 0 && !empty($val['prefix'])) {
|
||||
print $val['prefix'];
|
||||
|
||||
@ -210,6 +210,13 @@ class modCommande extends DolibarrModules
|
||||
$this->export_fields_array[$r]['c.multicurrency_total_tva'] = 'MulticurrencyAmountVAT';
|
||||
$this->export_fields_array[$r]['c.multicurrency_total_ttc'] = 'MulticurrencyAmountTTC';
|
||||
}
|
||||
// Add multicompany field
|
||||
if (!empty($conf->global->MULTICOMPANY_ENTITY_IN_EXPORT_IF_SHARED)) {
|
||||
$nbofallowedentities = count(explode(',', getEntity('commande')));
|
||||
if (!empty($conf->multicompany->enabled) && $nbofallowedentities > 1) {
|
||||
$this->export_fields_array[$r]['c.entity'] = 'Entity';
|
||||
}
|
||||
}
|
||||
//$this->export_TypeFields_array[$r]=array(
|
||||
// 's.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','co.label'=>'List:c_country:label:label',
|
||||
// 'co.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_client'=>"Text",
|
||||
@ -224,7 +231,8 @@ class modCommande extends DolibarrModules
|
||||
'c.date_commande'=>"Date", 'c.date_livraison'=>"Date", 'c.amount_ht'=>"Numeric", 'c.remise_percent'=>"Numeric", 'c.total_ht'=>"Numeric",
|
||||
'c.total_ttc'=>"Numeric", 'c.facture'=>"Boolean", 'c.fk_statut'=>'Status', 'c.note_public'=>"Text", 'c.date_livraison'=>'Date', 'pj.ref'=>'Text',
|
||||
'cd.description'=>"Text", 'cd.product_type'=>'Boolean', 'cd.tva_tx'=>"Numeric", 'cd.qty'=>"Numeric", 'cd.total_ht'=>"Numeric", 'cd.total_tva'=>"Numeric",
|
||||
'cd.total_ttc'=>"Numeric", 'p.rowid'=>'List:product:ref::product', 'p.ref'=>'Text', 'p.label'=>'Text', 'd.nom'=>'Text'
|
||||
'cd.total_ttc'=>"Numeric", 'p.rowid'=>'List:product:ref::product', 'p.ref'=>'Text', 'p.label'=>'Text', 'd.nom'=>'Text',
|
||||
'c.entity'=>'List:entity:label:rowid',
|
||||
);
|
||||
$this->export_entities_array[$r] = array(
|
||||
's.rowid'=>"company", 's.nom'=>'company', 'ps.nom'=>'company', 's.address'=>'company', 's.zip'=>'company', 's.town'=>'company', 'd.nom'=>'company', 'co.label'=>'company',
|
||||
|
||||
@ -270,6 +270,13 @@ class modFacture extends DolibarrModules
|
||||
$this->export_fields_array[$r]['f.module_source'] = 'Module';
|
||||
$this->export_fields_array[$r]['f.pos_source'] = 'POSTerminal';
|
||||
}
|
||||
// Add multicompany field
|
||||
if (!empty($conf->global->MULTICOMPANY_ENTITY_IN_EXPORT_IF_SHARED)) {
|
||||
$nbofallowedentities = count(explode(',', getEntity('invoice')));
|
||||
if (!empty($conf->multicompany->enabled) && $nbofallowedentities > 1) {
|
||||
$this->export_fields_array[$r]['f.entity'] = 'Entity';
|
||||
}
|
||||
}
|
||||
$this->export_TypeFields_array[$r] = array(
|
||||
's.rowid'=>'Numeric', 's.nom'=>'Text', 'ps.nom'=>'Text', 's.code_client'=>'Text', 's.address'=>'Text', 's.zip'=>'Text', 's.town'=>'Text', 'c.code'=>'Text', 'cd.nom'=>'Text', 's.phone'=>'Text', 's.siren'=>'Text',
|
||||
's.siret'=>'Text', 's.ape'=>'Text', 's.idprof4'=>'Text', 's.code_compta'=>'Text', 's.code_compta_fournisseur'=>'Text', 's.tva_intra'=>'Text',
|
||||
@ -280,7 +287,8 @@ class modFacture extends DolibarrModules
|
||||
'pj.ref'=>'Text', 'pj.title'=>'Text', 'fd.rowid'=>'Numeric', 'fd.label'=>'Text', 'fd.description'=>"Text", 'fd.subprice'=>"Numeric", 'fd.tva_tx'=>"Numeric",
|
||||
'fd.qty'=>"Numeric", 'fd.total_ht'=>"Numeric", 'fd.total_tva'=>"Numeric", 'fd.total_ttc'=>"Numeric", 'fd.date_start'=>"Date", 'fd.date_end'=>"Date",
|
||||
'fd.special_code'=>'Numeric', 'fd.product_type'=>"Numeric", 'fd.fk_product'=>'List:product:label', 'p.ref'=>'Text', 'p.label'=>'Text',
|
||||
$alias_product_perentity . '.accountancy_code_sell'=>'Text'
|
||||
$alias_product_perentity . '.accountancy_code_sell'=>'Text',
|
||||
'f.entity'=>'List:entity:label:rowid',
|
||||
);
|
||||
if (!empty($conf->cashdesk->enabled) || !empty($conf->takepos->enabled) || !empty($conf->global->INVOICE_SHOW_POS)) {
|
||||
$this->export_TypeFields_array[$r]['f.module_source'] = 'Text';
|
||||
|
||||
@ -199,7 +199,7 @@ class modHoliday extends DolibarrModules
|
||||
$this->rights[$r][0] = 20005; // Permission id (must not be already used)
|
||||
$this->rights[$r][1] = 'Create/modify leave requests for everybody'; // Permission label
|
||||
$this->rights[$r][3] = 0; // Permission by default for new user (0/1)
|
||||
$this->rights[$r][4] = 'writeall_advance'; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2)
|
||||
$this->rights[$r][4] = 'writeall'; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2)
|
||||
$this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2)
|
||||
$r++;
|
||||
|
||||
|
||||
@ -34,7 +34,6 @@ include_once DOL_DOCUMENT_ROOT.'/core/modules/DolibarrModules.class.php';
|
||||
*/
|
||||
class modPrinting extends DolibarrModules
|
||||
{
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
|
||||
@ -204,6 +204,13 @@ class modPropale extends DolibarrModules
|
||||
$this->export_fields_array[$r]['c.multicurrency_total_tva'] = 'MulticurrencyAmountVAT';
|
||||
$this->export_fields_array[$r]['c.multicurrency_total_ttc'] = 'MulticurrencyAmountTTC';
|
||||
}
|
||||
// Add multicompany field
|
||||
if (!empty($conf->global->MULTICOMPANY_ENTITY_IN_EXPORT_IF_SHARED)) {
|
||||
$nbofallowedentities = count(explode(',', getEntity('propal')));
|
||||
if (!empty($conf->multicompany->enabled) && $nbofallowedentities > 1) {
|
||||
$this->export_fields_array[$r]['c.entity'] = 'Entity';
|
||||
}
|
||||
}
|
||||
//$this->export_TypeFields_array[$r]=array(
|
||||
// 's.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','co.code'=>'Text','s.phone'=>'Text',
|
||||
// 's.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_client'=>"Text",'c.datec'=>"Date",'c.datep'=>"Date",
|
||||
@ -216,7 +223,8 @@ class modPropale extends DolibarrModules
|
||||
's.ape'=>'Text', 's.idprof4'=>'Text', 'c.ref'=>"Text", 'c.ref_client'=>"Text", 'c.datec'=>"Date", 'c.datep'=>"Date", 'c.fin_validite'=>"Date",
|
||||
'c.remise_percent'=>"Numeric", 'c.total_ht'=>"Numeric", 'c.total_ttc'=>"Numeric", 'c.fk_statut'=>'Status', 'c.note_public'=>"Text", 'c.date_livraison'=>'Date',
|
||||
'pj.ref'=>'Text', 'cd.description'=>"Text", 'cd.product_type'=>'Boolean', 'cd.tva_tx'=>"Numeric", 'cd.qty'=>"Numeric", 'cd.total_ht'=>"Numeric",
|
||||
'cd.total_tva'=>"Numeric", 'cd.total_ttc'=>"Numeric", 'p.ref'=>'Text', 'p.label'=>'Text'
|
||||
'cd.total_tva'=>"Numeric", 'cd.total_ttc'=>"Numeric", 'p.ref'=>'Text', 'p.label'=>'Text',
|
||||
'c.entity'=>'List:entity:label:rowid',
|
||||
);
|
||||
$this->export_entities_array[$r] = array(
|
||||
's.rowid'=>"company", 's.nom'=>'company', 'ps.nom'=>'company', 's.address'=>'company', 's.zip'=>'company', 's.town'=>'company', 'co.code'=>'company', 's.phone'=>'company',
|
||||
|
||||
@ -327,7 +327,7 @@ class modSociete extends DolibarrModules
|
||||
'payterm.libelle'=>'Text', 'paymode.libelle'=>'Text',
|
||||
's.outstanding_limit'=>'Numeric', 'pbacc.ref'=>'Text', 'incoterm.code'=>'Text',
|
||||
'u.login'=>'Text', 'u.firstname'=>'Text', 'u.lastname'=>'Text',
|
||||
's.entity'=>'Numeric', 's.price_level'=>'Numeric',
|
||||
's.entity'=>'List:entity:label:rowid', 's.price_level'=>'Numeric',
|
||||
's.accountancy_code_sell'=>'Text', 's.accountancy_code_buy'=>'Text'
|
||||
);
|
||||
|
||||
@ -376,6 +376,20 @@ class modSociete extends DolibarrModules
|
||||
's.address'=>'Address', 's.zip'=>"Zip", 's.town'=>"Town", 's.phone'=>'Phone', 's.email'=>"Email",
|
||||
't.libelle'=>"ThirdPartyType"
|
||||
);
|
||||
// Add multicompany field
|
||||
if (! empty($conf->global->MULTICOMPANY_ENTITY_IN_EXPORT_IF_SHARED)) {
|
||||
if (!empty($conf->multicompany->enabled)) {
|
||||
$nbofallowedentities = count(explode(',', getEntity('socpeople')));
|
||||
if ($nbofallowedentities > 1) {
|
||||
$this->export_fields_array[$r]['c.entity'] = 'Entity';
|
||||
}
|
||||
|
||||
$nbofallowedentities = count(explode(',', getEntity('societe')));
|
||||
if ($nbofallowedentities > 1) {
|
||||
$this->export_fields_array[$r]['s.entity'] = 'Entity';
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->export_examplevalues_array[$r] = array('s.client'=>'0 (no customer no prospect)/1 (customer)/2 (prospect)/3 (customer and prospect)', 's.fournisseur'=>'0 (not a supplier) or 1 (supplier)');
|
||||
$this->export_TypeFields_array[$r] = array(
|
||||
'c.civility'=>"List:c_civility:label:code", 'c.lastname'=>'Text', 'c.firstname'=>'Text', 'c.poste'=>'Text', 'c.datec'=>"Date", 'c.priv'=>"Boolean",
|
||||
@ -386,14 +400,17 @@ class modSociete extends DolibarrModules
|
||||
's.code_compta'=>"Text", 's.code_compta_fournisseur'=>"Text",
|
||||
's.client'=>"Text", 's.fournisseur'=>"Text",
|
||||
's.address'=>"Text", 's.zip'=>"Text", 's.town'=>"Text", 's.phone'=>"Text", 's.email'=>"Text",
|
||||
't.libelle'=>"Text"
|
||||
't.libelle'=>"Text",
|
||||
'c.entity'=>'List:entity:label:rowid',
|
||||
's.entity'=>'List:entity:label:rowid',
|
||||
);
|
||||
$this->export_entities_array[$r] = array(
|
||||
's.rowid'=>"company", 's.nom'=>"company", 's.status'=>'company', 's.code_client'=>"company", 's.code_fournisseur'=>"company",
|
||||
's.code_compta'=>"company", 's.code_compta_fournisseur'=>"company",
|
||||
's.client'=>"company", 's.fournisseur'=>"company",
|
||||
's.address'=>"company", 's.zip'=>"company", 's.town'=>"company", 's.phone'=>"company", 's.email'=>"company",
|
||||
't.libelle'=>"company"
|
||||
't.libelle'=>"company",
|
||||
's.entity'=>'company',
|
||||
); // We define here only fields that use another picto
|
||||
if (empty($conf->fournisseur->enabled) && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) || !empty($conf->supplier_order->enabled) || !empty($conf->supplier_invoice->enabled)) {
|
||||
unset($this->export_fields_array[$r]['s.code_fournisseur']);
|
||||
|
||||
@ -16,6 +16,9 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
// This page should make the process to login and get token as described here:
|
||||
// https://developers.google.com/identity/protocols/oauth2/openid-connect#server-flow
|
||||
|
||||
/**
|
||||
* \file htdocs/core/modules/oauth/google_oauthcallback.php
|
||||
* \ingroup oauth
|
||||
@ -70,9 +73,13 @@ $credentials = new Credentials(
|
||||
$currentUri->getAbsoluteUri()
|
||||
);
|
||||
|
||||
$state = GETPOST('state');
|
||||
|
||||
$requestedpermissionsarray = array();
|
||||
if (GETPOST('state')) {
|
||||
$requestedpermissionsarray = explode(',', GETPOST('state')); // Example: 'userinfo_email,userinfo_profile,cloud_print'. 'state' parameter is standard to store a hash value and can be used to retrieve some parameters back
|
||||
if ($state) {
|
||||
// 'state' parameter is standard to store a hash value and can be used to retrieve some parameters back
|
||||
$statewithscopeonly = preg_replace('/\-.*$/', '', $state);
|
||||
$requestedpermissionsarray = explode(',', $statewithscopeonly); // Example: 'userinfo_email,userinfo_profile,openid,email,profile,cloud_print'.
|
||||
}
|
||||
if ($action != 'delete' && empty($requestedpermissionsarray)) {
|
||||
print 'Error, parameter state is not defined';
|
||||
@ -80,6 +87,8 @@ if ($action != 'delete' && empty($requestedpermissionsarray)) {
|
||||
}
|
||||
//var_dump($requestedpermissionsarray);exit;
|
||||
|
||||
|
||||
|
||||
// Instantiate the Api service using the credentials, http client and storage mechanism for the token
|
||||
// $requestedpermissionsarray contains list of scopes.
|
||||
// Conversion into URL is done by Reflection on constant with name SCOPE_scope_in_uppercase
|
||||
@ -89,7 +98,6 @@ $apiService = $serviceFactory->createService('Google', $credentials, $storage, $
|
||||
// also note that a refresh token is sent only after a prompt
|
||||
$apiService->setAccessType('offline');
|
||||
|
||||
$apiService->setApprouvalPrompt('force');
|
||||
|
||||
$langs->load("oauth");
|
||||
|
||||
@ -108,48 +116,86 @@ if ($action == 'delete') {
|
||||
exit();
|
||||
}
|
||||
|
||||
if (!empty($_GET['code'])) { // We are coming from oauth provider page
|
||||
if (GETPOST('code')) { // We are coming from oauth provider page.
|
||||
dol_syslog("We are coming from the oauth provider page");
|
||||
//llxHeader('',$langs->trans("OAuthSetup"));
|
||||
|
||||
//$linkback='<a href="'.DOL_URL_ROOT.'/admin/modules.php?restore_lastsearch_values=1">'.$langs->trans("BackToModuleList").'</a>';
|
||||
//print load_fiche_titre($langs->trans("OAuthSetup"),$linkback,'title_setup');
|
||||
// We must validate that the $state is the same than the one into $_SESSION['oauthstateanticsrf'], return error if not.
|
||||
if (isset($_SESSION['oauthstateanticsrf']) && $state != $_SESSION['oauthstateanticsrf']) {
|
||||
print 'Value for state = '.dol_escape_htmltag($state).' differs from value in $_SESSION["oauthstateanticsrf"]. Code is refused.';
|
||||
unset($_SESSION['oauthstateanticsrf']);
|
||||
} else {
|
||||
// This was a callback request from service, get the token
|
||||
try {
|
||||
//var_dump($_GET['code']);
|
||||
//var_dump($state);
|
||||
//var_dump($apiService); // OAuth\OAuth2\Service\Google
|
||||
|
||||
//print dol_get_fiche_head();
|
||||
// retrieve the CSRF state parameter
|
||||
$state = isset($_GET['state']) ? $_GET['state'] : null;
|
||||
//print '<table>';
|
||||
// This request the token
|
||||
// Result is stored into object managed by class DoliStorage into includes/OAuth/Common/Storage/DoliStorage.php, so into table llx_oauth_token
|
||||
$token = $apiService->requestAccessToken(GETPOST('code'), $state);
|
||||
|
||||
// This was a callback request from service, get the token
|
||||
try {
|
||||
//var_dump($_GET['code']);
|
||||
//var_dump($state);
|
||||
//var_dump($apiService); // OAuth\OAuth2\Service\Google
|
||||
// Note: The extraparams has the 'id_token' than contains a lot of information about the user.
|
||||
$extraparams = $token->getExtraParams();
|
||||
$jwt = explode('.', $extraparams['id_token']);
|
||||
|
||||
$token = $apiService->requestAccessToken($_GET['code'], $state);
|
||||
// Extract the middle part, base64 decode, then json_decode it
|
||||
if (!empty($jwt[1])) {
|
||||
$userinfo = json_decode(base64_decode($jwt[1]), true);
|
||||
|
||||
setEventMessages($langs->trans('NewTokenStored'), null, 'mesgs'); // Stored into object managed by class DoliStorage so into table oauth_token
|
||||
// TODO
|
||||
// We should make the 5 steps of validation of id_token
|
||||
// Verify that the ID token is properly signed by the issuer. Google-issued tokens are signed using one of the certificates found at the URI specified in the jwks_uri metadata value of the Discovery document.
|
||||
// Verify that the value of the iss claim in the ID token is equal to https://accounts.google.com or accounts.google.com.
|
||||
// Verify that the value of the aud claim in the ID token is equal to your app's client ID.
|
||||
// Verify that the expiry time (exp claim) of the ID token has not passed.
|
||||
// If you specified a hd parameter value in the request, verify that the ID token has a hd claim that matches an accepted G Suite hosted domain.
|
||||
|
||||
$backtourl = $_SESSION["backtourlsavedbeforeoauthjump"];
|
||||
unset($_SESSION["backtourlsavedbeforeoauthjump"]);
|
||||
/*
|
||||
$useremailuniq = $userinfo['sub'];
|
||||
$useremail = $userinfo['email'];
|
||||
$useremailverified = $userinfo['email_verified'];
|
||||
$username = $userinfo['name'];
|
||||
$userfamilyname = $userinfo['family_name'];
|
||||
$usergivenname = $userinfo['given_name'];
|
||||
$hd = $userinfo['hd'];
|
||||
*/
|
||||
}
|
||||
|
||||
header('Location: '.$backtourl);
|
||||
exit();
|
||||
} catch (Exception $e) {
|
||||
print $e->getMessage();
|
||||
setEventMessages($langs->trans('NewTokenStored'), null, 'mesgs');
|
||||
|
||||
$backtourl = $_SESSION["backtourlsavedbeforeoauthjump"];
|
||||
unset($_SESSION["backtourlsavedbeforeoauthjump"]);
|
||||
|
||||
header('Location: '.$backtourl);
|
||||
exit();
|
||||
} catch (Exception $e) {
|
||||
print $e->getMessage();
|
||||
}
|
||||
}
|
||||
} else // If entry on page with no parameter, we arrive here
|
||||
{
|
||||
} else {
|
||||
// If we enter this page without 'code' parameter, we arrive here. this is the case when we want to get the redirect
|
||||
// to the OAuth provider login page
|
||||
$_SESSION["backtourlsavedbeforeoauthjump"] = $backtourl;
|
||||
|
||||
if (!preg_match('/^forlogin/', $state)) {
|
||||
$apiService->setApprouvalPrompt('force');
|
||||
}
|
||||
|
||||
// This may create record into oauth_state before the header redirect.
|
||||
// Creation of record with state in this tables depend on the Provider used (see its constructor).
|
||||
if (GETPOST('state')) {
|
||||
$url = $apiService->getAuthorizationUri(array('state'=>GETPOST('state')));
|
||||
if ($state) {
|
||||
$url = $apiService->getAuthorizationUri(array('state' => $state));
|
||||
} else {
|
||||
$url = $apiService->getAuthorizationUri(); // Parameter state will be randomly generated
|
||||
}
|
||||
|
||||
// Add more param
|
||||
$url .= '&nonce='.bin2hex(random_bytes(64/8));
|
||||
// TODO Add param hd and/or login_hint
|
||||
if (!preg_match('/^forlogin/', $state)) {
|
||||
//$url .= 'hd=xxx';
|
||||
}
|
||||
|
||||
// we go on oauth provider authorization page
|
||||
header('Location: '.$url);
|
||||
exit();
|
||||
@ -160,6 +206,6 @@ if (!empty($_GET['code'])) { // We are coming from oauth provider page
|
||||
* View
|
||||
*/
|
||||
|
||||
// No view at all, just actions
|
||||
// No view at all, just actions, so we never reach this line.
|
||||
|
||||
$db->close();
|
||||
|
||||
@ -179,6 +179,8 @@ class pdf_standard extends ModelePDFStock
|
||||
$this->localtax2 = array();
|
||||
$this->atleastoneratenotnull = 0;
|
||||
$this->atleastonediscount = 0;
|
||||
|
||||
$this->tabTitleHeight = 11;
|
||||
}
|
||||
|
||||
|
||||
@ -321,7 +323,6 @@ class pdf_standard extends ModelePDFStock
|
||||
$i = 0;
|
||||
$nblines = $num;
|
||||
|
||||
$this->tabTitleHeight = 10;
|
||||
$nexY = $tab_top + $this->tabTitleHeight;
|
||||
|
||||
for ($i = 0; $i < $nblines; $i++) {
|
||||
@ -733,7 +734,7 @@ class pdf_standard extends ModelePDFStock
|
||||
if (empty($hidetop)) {
|
||||
$pdf->SetDrawColor(200, 200, 200);
|
||||
$pdf->SetLineStyle(array('dash' => '0', 'color' => array(200, 200, 200)));
|
||||
$pdf->line($this->marge_gauche, $tab_top + 10, $this->page_largeur - $this->marge_droite, $tab_top + 10);
|
||||
$pdf->line($this->marge_gauche, $tab_top + $this->tabTitleHeight, $this->page_largeur - $this->marge_droite, $tab_top + $this->tabTitleHeight);
|
||||
$pdf->SetLineStyle(array('dash' => 0));
|
||||
}
|
||||
}
|
||||
@ -767,8 +768,8 @@ class pdf_standard extends ModelePDFStock
|
||||
pdf_pagehead($pdf, $outputlangs, $this->page_hauteur);
|
||||
|
||||
// Show Draft Watermark
|
||||
if ($object->statut == 0 && (!empty($conf->global->COMMANDE_DRAFT_WATERMARK))) {
|
||||
pdf_watermark($pdf, $outputlangs, $this->page_hauteur, $this->page_largeur, 'mm', $conf->global->COMMANDE_DRAFT_WATERMARK);
|
||||
if ($object->statut == 0 && (!empty($conf->global->STOCK_DRAFT_WATERMARK))) {
|
||||
pdf_watermark($pdf, $outputlangs, $this->page_hauteur, $this->page_largeur, 'mm', $conf->global->STOCK_DRAFT_WATERMARK);
|
||||
}
|
||||
|
||||
$pdf->SetTextColor(0, 0, 60);
|
||||
@ -780,6 +781,7 @@ class pdf_standard extends ModelePDFStock
|
||||
$pdf->SetXY($this->marge_gauche, $posy);
|
||||
|
||||
// Logo
|
||||
$height = 0;
|
||||
$logo = $conf->mycompany->dir_output.'/logos/'.$this->emetteur->logo;
|
||||
if ($this->emetteur->logo) {
|
||||
if (is_readable($logo)) {
|
||||
@ -796,29 +798,19 @@ class pdf_standard extends ModelePDFStock
|
||||
$pdf->MultiCell(100, 4, $outputlangs->convToOutputCharset($text), 0, 'L');
|
||||
}
|
||||
|
||||
$yafterleft = $pdf->GetY() + $height;
|
||||
|
||||
$pdf->SetFont('', 'B', $default_font_size + 3);
|
||||
$pdf->SetXY($posx, $posy);
|
||||
$pdf->SetTextColor(0, 0, 60);
|
||||
$title = $outputlangs->transnoentities("Warehouse");
|
||||
$pdf->MultiCell(100, 3, $title, '', 'R');
|
||||
|
||||
$pdf->SetFont('', 'B', $default_font_size);
|
||||
$pdf->MultiCell(100, 4, $outputlangs->transnoentities("Warehouse").' '.$outputlangs->convToOutputCharset($object->label), '', 'R');
|
||||
|
||||
$posy += 5;
|
||||
$pdf->SetXY($posx, $posy);
|
||||
$pdf->SetTextColor(0, 0, 60);
|
||||
|
||||
$pdf->MultiCell(100, 4, $outputlangs->transnoentities("Ref")." : ".$outputlangs->convToOutputCharset($object->label), '', 'R');
|
||||
|
||||
$posy += 5;
|
||||
$posy += 6;
|
||||
$pdf->SetFont('', '', $default_font_size - 1);
|
||||
$pdf->SetXY($posx, $posy);
|
||||
$pdf->SetTextColor(0, 0, 60);
|
||||
$pdf->MultiCell(100, 3, $outputlangs->transnoentities("LocationSummary").' :', '', 'R');
|
||||
|
||||
$posy += 4;
|
||||
$pdf->SetXY($posx - 50, $posy);
|
||||
$pdf->MultiCell(150, 3, $object->lieu, '', 'R');
|
||||
$pdf->MultiCell(100, 3, $outputlangs->transnoentities("Label").' : '.$object->lieu, '', 'R');
|
||||
|
||||
$posy += 4;
|
||||
$pdf->SetXY($posx, $posy);
|
||||
@ -836,8 +828,10 @@ class pdf_standard extends ModelePDFStock
|
||||
$pdf->MultiCell(150, 3, $e->label, '', 'R');
|
||||
}
|
||||
|
||||
$yafterright = $pdf->GetY();
|
||||
|
||||
// Description
|
||||
$nexY = $pdf->GetY();
|
||||
$nexY = max($yafterleft, $yafterright);
|
||||
$nexY += 5;
|
||||
$pdf->SetXY($posx, $posy);
|
||||
$pdf->writeHTMLCell(190, 2, $this->marge_gauche, $nexY, '<b>'.$outputlangs->transnoentities("Description").' : </b>'.nl2br($object->description), 0, 1);
|
||||
@ -859,6 +853,9 @@ class pdf_standard extends ModelePDFStock
|
||||
$pdf->writeHTMLCell(190, 2, $this->marge_gauche, $nexY, '<b>'.$outputlangs->transnoentities("EstimatedStockValueShort").' : </b>'.price((empty($calcproducts['value']) ? '0' : price2num($calcproducts['value'], 'MT')), 0, $langs, 0, -1, -1, $conf->currency), 0, 1);
|
||||
$nexY = $pdf->GetY();
|
||||
|
||||
// Value
|
||||
$pdf->writeHTMLCell(190, 2, $this->marge_gauche, $nexY, '<b>'.$outputlangs->transnoentities("Date").' : </b>'.dol_print_date(dol_now(), 'dayhour'), 0, 1);
|
||||
$nexY = $pdf->GetY();
|
||||
|
||||
// Last movement
|
||||
$sql = "SELECT max(m.datem) as datem";
|
||||
|
||||
@ -185,7 +185,7 @@ $listofexamplesforlink = 'Societe:societe/class/societe.class.php<br>Contact:con
|
||||
<?php } else { ?>
|
||||
<td><?php echo $form->textwithpicto($langs->trans("ComputedFormula"), $langs->trans("ComputedFormulaDesc")).$form->textwithpicto($langs->trans("Computedpersistent"), $langs->trans("ComputedpersistentDesc"), 1, 'warning'); ?></td>
|
||||
<?php } ?>
|
||||
<td class="valeur"><textarea name="computed_value" id="computed_value" class="quatrevingtpercent" rows="<?php echo ROWS_4 ?>"><?php echo (GETPOST('computed_value', 'none') ?GETPOST('computed_value', 'none') : ''); ?></textarea></td>
|
||||
<td class="valeur"><textarea name="computed_value" id="computed_value" class="quatrevingtpercent" rows="<?php echo ROWS_4 ?>"><?php echo (GETPOSTISSET('computed_value') ? GETPOST('computed_value', 'restricthtml') : ''); ?></textarea></td>
|
||||
</tr>
|
||||
<!-- Default Value (at sql setup level) -->
|
||||
<tr class="extra_default_value"><td><?php echo $langs->trans("DefaultValue").' ('.$langs->trans("Database").')'; ?></td><td class="valeur"><input id="default_value" type="text" name="default_value" size="5" value="<?php echo (GETPOST('default_value', 'alpha') ?GETPOST('default_value', 'alpha') : ''); ?>"></td></tr>
|
||||
|
||||
@ -33,6 +33,8 @@ if (empty($conf) || !is_object($conf)) {
|
||||
|
||||
require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
|
||||
|
||||
|
||||
|
||||
header('Cache-Control: Public, must-revalidate');
|
||||
header("Content-type: text/html; charset=".$conf->file->character_set_client);
|
||||
|
||||
@ -316,6 +318,32 @@ if (isset($conf->file->main_authentication) && preg_match('/openid/', $conf->fil
|
||||
echo '</div>';
|
||||
}
|
||||
|
||||
if (isset($conf->file->main_authentication) && preg_match('/google/', $conf->file->main_authentication)) {
|
||||
$langs->load("users");
|
||||
|
||||
global $dolibarr_main_url_root;
|
||||
|
||||
// Define $urlwithroot
|
||||
$urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
|
||||
$urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
|
||||
//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
|
||||
|
||||
echo '<br>';
|
||||
echo '<div class="center" style="margin-top: 4px;">';
|
||||
|
||||
//$shortscope = 'userinfo_email,userinfo_profile';
|
||||
$shortscope = 'openid,email,profile'; // For openid connect
|
||||
|
||||
$oauthstateanticsrf = bin2hex(random_bytes(128/8));
|
||||
$_SESSION['oauthstateanticsrf'] = $shortscope.'-'.$oauthstateanticsrf;
|
||||
$urltorenew = $urlwithroot.'/core/modules/oauth/google_oauthcallback.php?shortscope='.$shortscope.'&state=forlogin-'.$shortscope.'-'.$oauthstateanticsrf;
|
||||
|
||||
$url = $urltorenew;
|
||||
|
||||
print img_picto('', 'google', 'class="pictofixedwidth"').'<a class="alogin" href="'.$url.'">'.$langs->trans("LoginWith", "Google").'</a>';
|
||||
|
||||
echo '</div>';
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
|
||||
@ -66,7 +66,7 @@ class InterfaceActionsAuto extends DolibarrTriggers
|
||||
* $object->elementtype (->element of object to link action to)
|
||||
* $object->module (if defined, elementtype in llx_actioncomm will be elementtype@module)
|
||||
*
|
||||
* @param string $action Event action code ('CONTRACT_MODIFY', 'RECRUITMENTCANDIDATURE_MODIFIY', ...)
|
||||
* @param string $action Event action code ('CONTRACT_MODIFY', 'RECRUITMENTCANDIDATURE_MODIFIY', or example by external module: 'SENTBYSMS'...)
|
||||
* @param Object $object Object
|
||||
* @param User $user Object user
|
||||
* @param Translate $langs Object langs
|
||||
@ -88,6 +88,7 @@ class InterfaceActionsAuto extends DolibarrTriggers
|
||||
//var_dump($action.' - '.$conf->global->$key);exit;
|
||||
|
||||
// Do not log events not enabled for this action
|
||||
// GUI allow to set this option only if entry exists into table llx_c_action_trigger
|
||||
if (empty($conf->global->$key)) {
|
||||
return 0;
|
||||
}
|
||||
@ -887,8 +888,9 @@ class InterfaceActionsAuto extends DolibarrTriggers
|
||||
} else {
|
||||
// TODO Merge all previous cases into this generic one
|
||||
// $action = BILL_DELETE, TICKET_CREATE, TICKET_MODIFY, TICKET_DELETE, CONTACT_SENTBYMAIL, RECRUITMENTCANDIDATURE_MODIFY, ...
|
||||
// Can also be a value defined by an external module like SENTBYSMS, COMPANY_SENTBYSMS, MEMBER_SENTBYSMS, ...
|
||||
// Note: We are here only if $conf->global->MAIN_AGENDA_ACTIONAUTO_action is on (tested at begining of this function).
|
||||
// Note that these key can be set in agenda setup, only if defined into c_action_trigger
|
||||
// Note that these key can be set in agenda setup, only if defined into llx_c_action_trigger
|
||||
// Load translation files required by the page
|
||||
if (empty($object->actionmsg2)) {
|
||||
$langs->loadLangs(array("agenda", "other"));
|
||||
|
||||
@ -2365,7 +2365,7 @@ class EmailCollector extends CommonObject
|
||||
// this code action is hook..... for support this call
|
||||
global $hookmanager;
|
||||
|
||||
if (!is_object($hookmanager)) {
|
||||
if (is_object($hookmanager)) {
|
||||
$hookmanager->initHooks(array('emailcollectorcard'));
|
||||
}
|
||||
|
||||
|
||||
@ -39,7 +39,6 @@
|
||||
//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value
|
||||
//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler
|
||||
//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message
|
||||
//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies
|
||||
//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET
|
||||
//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification
|
||||
|
||||
|
||||
@ -1206,6 +1206,10 @@ if ($action == 'create') {
|
||||
print '<input name="idl'.$indiceAsked.'" type="hidden" value="'.$line->id.'">';
|
||||
print '<input name="qtyl'.$indiceAsked.'" id="qtyl'.$indiceAsked.'" class="qtyl center" type="text" size="4" value="'.$deliverableQty.'">';
|
||||
} else {
|
||||
if (! empty($conf->global->SHIPMENT_GETS_ALL_ORDER_PRODUCTS)) {
|
||||
print '<input name="qtyl'.$indiceAsked.'" id="qtyl'.$indiceAsked.'" type="hidden" value="0">';
|
||||
}
|
||||
|
||||
print $langs->trans("NA");
|
||||
}
|
||||
print '</td>';
|
||||
@ -1385,6 +1389,10 @@ if ($action == 'create') {
|
||||
print '<input '.$tooltip.' name="qtyl'.$indiceAsked.'_'.$subj.'" id="qtyl'.$indiceAsked.'" type="text" size="4" value="'.$deliverableQty.'">';
|
||||
print '<input name="ent1'.$indiceAsked.'_'.$subj.'" type="hidden" value="'.$warehouse_id.'">';
|
||||
} else {
|
||||
if (! empty($conf->global->SHIPMENT_GETS_ALL_ORDER_PRODUCTS)) {
|
||||
print '<input name="qtyl'.$indiceAsked.'_'.$subj.'" id="qtyl'.$indiceAsked.'" type="hidden" value="0">';
|
||||
}
|
||||
|
||||
print $langs->trans("NA");
|
||||
}
|
||||
print '</td>';
|
||||
|
||||
@ -134,6 +134,14 @@ if ($object->id > 0) {
|
||||
}
|
||||
}
|
||||
|
||||
$candelete = 0;
|
||||
if (!empty($user->rights->expensereport->supprimer)) {
|
||||
$candelete = 1;
|
||||
}
|
||||
if ($object->statut == ExpenseReport::STATUS_DRAFT && $user->rights->expensereport->write && in_array($object->fk_user_author, $childids)) {
|
||||
$candelete = 1;
|
||||
}
|
||||
|
||||
// Security check
|
||||
if ($user->socid) {
|
||||
$socid = $user->socid;
|
||||
@ -226,7 +234,7 @@ if (empty($reshook)) {
|
||||
}
|
||||
}
|
||||
|
||||
if ($action == 'confirm_delete' && GETPOST("confirm", 'alpha') == "yes" && $id > 0 && $user->rights->expensereport->supprimer) {
|
||||
if ($action == 'confirm_delete' && GETPOST("confirm", 'alpha') == "yes" && $id > 0 && $candelete) {
|
||||
$object = new ExpenseReport($db);
|
||||
$result = $object->fetch($id);
|
||||
$result = $object->delete($user);
|
||||
@ -2737,7 +2745,7 @@ if ($action != 'create' && $action != 'edit' && $action != 'editline') {
|
||||
if ($user->rights->expensereport->creer && $user->id == $object->fk_user_author && $object->status < ExpenseReport::STATUS_APPROVED) {
|
||||
// Delete
|
||||
print '<div class="inline-block divButAction"><a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?action=delete&token='.newToken().'&id='.$object->id.'">'.$langs->trans('Delete').'</a></div>';
|
||||
} elseif ($user->rights->expensereport->supprimer && $object->status != ExpenseReport::STATUS_CLOSED) {
|
||||
} elseif ($candelete && $object->status != ExpenseReport::STATUS_CLOSED) {
|
||||
// Delete
|
||||
print '<div class="inline-block divButAction"><a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?action=delete&token='.newToken().'&id='.$object->id.'">'.$langs->trans('Delete').'</a></div>';
|
||||
}
|
||||
|
||||
@ -57,7 +57,7 @@ if ($action == 'update') {
|
||||
$label = GETPOST('EXTERNALSITE_LABEL', 'alphanohtml');
|
||||
|
||||
// exturl can be an url or a HTML string
|
||||
$exturl = GETPOST('EXTERNALSITE_URL', 'none');
|
||||
$exturl = GETPOST('EXTERNALSITE_URL', 'restricthtml');
|
||||
$exturl = dol_string_onlythesehtmltags($exturl, 1, 1, 0, 1);
|
||||
$exturl = dol_string_onlythesehtmlattributes($exturl);
|
||||
|
||||
@ -110,7 +110,7 @@ print '<tr class="oddeven">';
|
||||
print '<td class="fieldrequired">'.$langs->trans("ExternalSiteURL")."</td>";
|
||||
print '<td><textarea class="flat minwidth500" name="EXTERNALSITE_URL">';
|
||||
|
||||
$exturl = GETPOST('EXTERNALSITE_URL', 'none');
|
||||
$exturl = GETPOST('EXTERNALSITE_URL', 'restricthtml');
|
||||
$exturl = dol_string_onlythesehtmltags($exturl, 1, 1, 0, 1);
|
||||
$exturl = dol_string_onlythesehtmlattributes($exturl);
|
||||
|
||||
|
||||
@ -34,7 +34,7 @@ if (!defined('DOL_APPLICATION_TITLE')) {
|
||||
define('DOL_APPLICATION_TITLE', 'Dolibarr');
|
||||
}
|
||||
if (!defined('DOL_VERSION')) {
|
||||
define('DOL_VERSION', '15.0.0'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c
|
||||
define('DOL_VERSION', '16.0.0-alpha'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c
|
||||
}
|
||||
|
||||
if (!defined('EURO')) {
|
||||
|
||||
@ -531,10 +531,11 @@ if ($object->id > 0) {
|
||||
|
||||
$num = $db->num_rows($query);
|
||||
|
||||
print '<div class="div-table-responsive-no-min">';
|
||||
print '<table class="noborder centpercent lastrecordtable">';
|
||||
print '<tr class="liste_titre'.(($num == 0) ? ' nobottom' : '').'">';
|
||||
print '<td colspan="3">'.$langs->trans("ProductsAndServices").'</td><td class="right">';
|
||||
print '<a class="notasortlink" href="'.DOL_URL_ROOT.'/fourn/product/list.php?fourn_id='.$object->id.'">'.$langs->trans("AllProductReferencesOfSupplier").'<span class="badge marginleftonlyshort">'.$object->nbOfProductRefs().'</span>';
|
||||
print '<a class="notasortlink" href="'.DOL_URL_ROOT.'/fourn/product/list.php?fourn_id='.$object->id.'"><span class="hideonsmartphone">'.$langs->trans("AllProductReferencesOfSupplier").'</span><span class="badge marginleftonlyshort">'.$object->nbOfProductRefs().'</span>';
|
||||
print '</a></td></tr>';
|
||||
|
||||
$return = array();
|
||||
@ -556,7 +557,7 @@ if ($object->id > 0) {
|
||||
print $productstatic->getNomUrl(1);
|
||||
print '</td>';
|
||||
print '<td>';
|
||||
print $objp->supplier_ref;
|
||||
print dol_escape_htmltag($objp->supplier_ref);
|
||||
print '</td>';
|
||||
print '<td class="maxwidthonsmartphone">';
|
||||
print dol_trunc(dol_htmlentities($objp->label), 30);
|
||||
@ -565,7 +566,7 @@ if ($object->id > 0) {
|
||||
print '<td class="right">';
|
||||
//print (isset($objp->unitprice) ? price($objp->unitprice) : '');
|
||||
if (isset($objp->price)) {
|
||||
print price($objp->price);
|
||||
print '<span class="amount">'.price($objp->price).'</span>';
|
||||
if ($objp->quantity > 1) {
|
||||
print ' / ';
|
||||
print $objp->quantity;
|
||||
@ -577,6 +578,7 @@ if ($object->id > 0) {
|
||||
}
|
||||
|
||||
print '</table>';
|
||||
print '</div>';
|
||||
}
|
||||
|
||||
|
||||
@ -601,12 +603,13 @@ if ($object->id > 0) {
|
||||
$num = $db->num_rows($resql);
|
||||
|
||||
if ($num > 0) {
|
||||
print '<div class="div-table-responsive-no-min">';
|
||||
print '<table class="noborder centpercent lastrecordtable">';
|
||||
|
||||
print '<tr class="liste_titre">';
|
||||
print '<td colspan="3">';
|
||||
print '<table class="nobordernopadding centpercent"><tr><td>'.$langs->trans("LastSupplierProposals", ($num < $MAXLIST ? "" : $MAXLIST)).'</td>';
|
||||
print '<td class="right"><a class="notasortlink" href="'.DOL_URL_ROOT.'/supplier_proposal/list.php?socid='.$object->id.'">'.$langs->trans("AllPriceRequests").'<span class="badge marginleftonlyshort">'.$num.'</span></td>';
|
||||
print '<td class="right"><a class="notasortlink" href="'.DOL_URL_ROOT.'/supplier_proposal/list.php?socid='.$object->id.'"><span class="hideonsmartphone">'.$langs->trans("AllPriceRequests").'</span><span class="badge marginleftonlyshort">'.$num.'</span></td>';
|
||||
print '<td width="20px" class="right"><a href="'.DOL_URL_ROOT.'/supplier_proposal/stats/index.php?mode=supplier&socid='.$object->id.'">'.img_picto($langs->trans("Statistics"), 'stats').'</a></td>';
|
||||
print '</tr></table>';
|
||||
print '</td></tr>';
|
||||
@ -638,7 +641,7 @@ if ($object->id > 0) {
|
||||
$db->free($resql);
|
||||
|
||||
if ($num > 0) {
|
||||
print "</table>";
|
||||
print "</table></div>";
|
||||
}
|
||||
} else {
|
||||
dol_print_error($db);
|
||||
@ -690,7 +693,7 @@ if ($object->id > 0) {
|
||||
$num = $object_count->total;
|
||||
}
|
||||
|
||||
$sql = "SELECT p.rowid,p.ref, p.date_commande as dc, p.fk_statut, p.total_ht, p.total_tva, p.total_ttc";
|
||||
$sql = "SELECT p.rowid,p.ref, p.date_commande as date, p.fk_statut, p.total_ht, p.total_tva, p.total_ttc";
|
||||
$sql .= " FROM ".MAIN_DB_PREFIX."commande_fournisseur as p";
|
||||
$sql .= " WHERE p.fk_soc = ".((int) $object->id);
|
||||
$sql .= " AND p.entity IN (".getEntity('commande_fournisseur').")";
|
||||
@ -702,12 +705,13 @@ if ($object->id > 0) {
|
||||
$i = 0;
|
||||
|
||||
if ($num > 0) {
|
||||
print '<div class="div-table-responsive-no-min">';
|
||||
print '<table class="noborder centpercent lastrecordtable">';
|
||||
|
||||
print '<tr class="liste_titre">';
|
||||
print '<td colspan="3">';
|
||||
print '<td colspan="4">';
|
||||
print '<table class="nobordernopadding" width="100%"><tr><td>'.$langs->trans("LastSupplierOrders", ($num < $MAXLIST ? "" : $MAXLIST)).'</td>';
|
||||
print '<td class="right"><a class="notasortlink" href="'.DOL_URL_ROOT.'/fourn/commande/list.php?socid='.$object->id.'">'.$langs->trans("AllOrders").'<span class="badge marginleftonlyshort">'.$num.'</span></td>';
|
||||
print '<td class="right"><a class="notasortlink" href="'.DOL_URL_ROOT.'/fourn/commande/list.php?socid='.$object->id.'"><span class="hideonsmartphone">'.$langs->trans("AllOrders").'</span><span class="badge marginleftonlyshort">'.$num.'</span></td>';
|
||||
print '<td width="20px" class="right"><a href="'.DOL_URL_ROOT.'/commande/stats/index.php?mode=supplier&socid='.$object->id.'">'.img_picto($langs->trans("Statistics"), 'stats').'</a></td>';
|
||||
print '</tr></table>';
|
||||
print '</td></tr>';
|
||||
@ -716,22 +720,23 @@ if ($object->id > 0) {
|
||||
while ($i < $num && $i < $MAXLIST) {
|
||||
$obj = $db->fetch_object($resql);
|
||||
|
||||
print '<tr class="oddeven">';
|
||||
print '<td class="nowrap">';
|
||||
$orderstatic->id = $obj->rowid;
|
||||
$orderstatic->ref = $obj->ref;
|
||||
$orderstatic->total_ht = $obj->total_ht;
|
||||
$orderstatic->total_tva = $obj->total_tva;
|
||||
$orderstatic->total_ttc = $obj->total_ttc;
|
||||
$orderstatic->date = $db->jdate($obj->date);
|
||||
|
||||
print '<tr class="oddeven">';
|
||||
print '<td class="nowraponall">';
|
||||
print $orderstatic->getNomUrl(1);
|
||||
print '</td>';
|
||||
print '<td class="center" width="80">';
|
||||
if ($obj->dc) {
|
||||
print dol_print_date($db->jdate($obj->dc), 'day');
|
||||
} else {
|
||||
print "-";
|
||||
if ($obj->date) {
|
||||
print dol_print_date($orderstatic->date, 'day');
|
||||
}
|
||||
print '</td>';
|
||||
print '<td class="right nowrap"><span class="amount">'.price($orderstatic->total_ttc).'</span></td>';
|
||||
print '<td class="right" class="nowrap">'.$orderstatic->LibStatut($obj->fk_statut, 5).'</td>';
|
||||
print '</tr>';
|
||||
$i++;
|
||||
@ -739,7 +744,7 @@ if ($object->id > 0) {
|
||||
$db->free($resql);
|
||||
|
||||
if ($num > 0) {
|
||||
print "</table>";
|
||||
print "</table></div>";
|
||||
}
|
||||
} else {
|
||||
dol_print_error($db);
|
||||
@ -755,7 +760,7 @@ if ($object->id > 0) {
|
||||
|
||||
if ($user->rights->fournisseur->facture->lire) {
|
||||
// TODO move to DAO class
|
||||
$sql = 'SELECT f.rowid, f.libelle as label, f.ref, f.ref_supplier, f.fk_statut, f.datef as df, f.total_ht, f.total_tva, f.total_ttc as amount,f.paye,';
|
||||
$sql = 'SELECT f.rowid, f.libelle as label, f.ref, f.ref_supplier, f.fk_statut, f.datef as df, f.total_ht, f.total_tva, f.total_ttc, f.paye,';
|
||||
$sql .= ' SUM(pf.amount) as am';
|
||||
$sql .= ' FROM '.MAIN_DB_PREFIX.'facture_fourn as f';
|
||||
$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'paiementfourn_facturefourn as pf ON f.rowid=pf.fk_facturefourn';
|
||||
@ -768,11 +773,13 @@ if ($object->id > 0) {
|
||||
$i = 0;
|
||||
$num = $db->num_rows($resql);
|
||||
if ($num > 0) {
|
||||
print '<div class="div-table-responsive-no-min">';
|
||||
print '<table class="noborder centpercent lastrecordtable">';
|
||||
|
||||
print '<tr class="liste_titre">';
|
||||
print '<td colspan="4">';
|
||||
print '<table class="nobordernopadding" width="100%"><tr><td>'.$langs->trans('LastSuppliersBills', ($num <= $MAXLIST ? "" : $MAXLIST)).'</td><td class="right"><a class="notasortlink" href="'.DOL_URL_ROOT.'/fourn/facture/list.php?socid='.$object->id.'">'.$langs->trans('AllBills').'<span class="badge marginleftonlyshort">'.$num.'</span></td>';
|
||||
print '<table class="nobordernopadding" width="100%"><tr><td>'.$langs->trans('LastSuppliersBills', ($num <= $MAXLIST ? "" : $MAXLIST)).'</td>';
|
||||
print '<td class="right"><a class="notasortlink" href="'.DOL_URL_ROOT.'/fourn/facture/list.php?socid='.$object->id.'"><span class="hideonsmartphone">'.$langs->trans('AllBills').'</span><span class="badge marginleftonlyshort">'.$num.'</span></td>';
|
||||
print '<td width="20px" class="right"><a href="'.DOL_URL_ROOT.'/compta/facture/stats/index.php?mode=supplier&socid='.$object->id.'">'.img_picto($langs->trans("Statistics"), 'stats').'</a></td>';
|
||||
print '</tr></table>';
|
||||
print '</td></tr>';
|
||||
@ -781,9 +788,6 @@ if ($object->id > 0) {
|
||||
while ($i < min($num, $MAXLIST)) {
|
||||
$obj = $db->fetch_object($resql);
|
||||
|
||||
print '<tr class="oddeven">';
|
||||
print '<td>';
|
||||
print '<a href="facture/card.php?facid='.$obj->rowid.'">';
|
||||
$facturestatic->id = $obj->rowid;
|
||||
$facturestatic->ref = ($obj->ref ? $obj->ref : $obj->rowid);
|
||||
$facturestatic->ref_supplier = $obj->ref_supplier;
|
||||
@ -792,12 +796,16 @@ if ($object->id > 0) {
|
||||
$facturestatic->total_ht = $obj->total_ht;
|
||||
$facturestatic->total_tva = $obj->total_tva;
|
||||
$facturestatic->total_ttc = $obj->total_ttc;
|
||||
print $facturestatic->getNomUrl(1);
|
||||
$facturestatic->date = $db->jdate($obj->df);
|
||||
|
||||
print '<tr class="oddeven">';
|
||||
print '<td class="tdoverflowmax200">';
|
||||
print '<span class="nowraponall">'.$facturestatic->getNomUrl(1).'</span>';
|
||||
print $obj->ref_supplier ? ' - '.$obj->ref_supplier : '';
|
||||
print ($obj->label ? ' - ' : '').dol_trunc($obj->label, 14);
|
||||
print '</td>';
|
||||
print '<td class="center nowrap">'.dol_print_date($db->jdate($obj->df), 'day').'</td>';
|
||||
print '<td class="right nowrap">'.price($obj->amount).'</td>';
|
||||
print '<td class="center nowrap">'.dol_print_date($facturestatic->date, 'day').'</td>';
|
||||
print '<td class="right nowrap"><span class="amount">'.price($facturestatic->total_ttc).'</span></td>';
|
||||
print '<td class="right nowrap">';
|
||||
print $facturestatic->LibStatut($obj->paye, $obj->fk_statut, 5, $obj->am);
|
||||
print '</td>';
|
||||
@ -806,7 +814,7 @@ if ($object->id > 0) {
|
||||
}
|
||||
$db->free($resql);
|
||||
if ($num > 0) {
|
||||
print '</table>';
|
||||
print '</table></div>';
|
||||
}
|
||||
} else {
|
||||
dol_print_error($db);
|
||||
|
||||
@ -2012,6 +2012,8 @@ class CommandeFournisseur extends CommonOrder
|
||||
if ($product > 0) {
|
||||
// $price should take into account discount (except if option STOCK_EXCLUDE_DISCOUNT_FOR_PMP is on)
|
||||
$mouv->origin = &$this;
|
||||
$mouv->origin_type = $this->element;
|
||||
$mouv->origin_id = $this->id;
|
||||
$result = $mouv->reception($user, $product, $entrepot, $qty, $price, $comment, $eatby, $sellby, $batch);
|
||||
if ($result < 0) {
|
||||
$this->error = $mouv->error;
|
||||
|
||||
@ -129,7 +129,7 @@ $result = restrictedArea($user, 'fournisseur', $id, 'commande_fournisseur', 'com
|
||||
// Common permissions
|
||||
$usercanread = ($user->rights->fournisseur->commande->lire || $user->rights->supplier_order->lire);
|
||||
$usercancreate = ($user->rights->fournisseur->commande->creer || $user->rights->supplier_order->creer);
|
||||
$usercandelete = ($user->rights->fournisseur->commande->supprimer || $user->rights->supplier_order->supprimer);
|
||||
$usercandelete = (($user->rights->fournisseur->commande->supprimer || $user->rights->supplier_order->supprimer) || ($usercancreate && isset($object->statut) && $object->statut == $object::STATUS_DRAFT));
|
||||
|
||||
// Advanced permissions
|
||||
$usercanvalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($usercancreate)) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->fournisseur->supplier_order_advance->validate)));
|
||||
@ -853,6 +853,8 @@ if (empty($reshook)) {
|
||||
|
||||
$result = $object->deleteline($lineid);
|
||||
if ($result > 0) {
|
||||
// reorder lines
|
||||
$object->line_order(true);
|
||||
// Define output language
|
||||
$outputlangs = $langs;
|
||||
$newlang = '';
|
||||
@ -2580,14 +2582,14 @@ if ($action == 'create') {
|
||||
}
|
||||
|
||||
// Cancel
|
||||
if ($object->statut == 2) {
|
||||
if ($object->statut == CommandeFournisseur::STATUS_ACCEPTED) {
|
||||
if ($usercanorder) {
|
||||
print '<a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=cancel">'.$langs->trans("CancelOrder").'</a>';
|
||||
}
|
||||
}
|
||||
|
||||
// Delete
|
||||
if (!empty($usercandelete) || ($object->statut == CommandeFournisseur::STATUS_DRAFT && !empty($usercancreate))) {
|
||||
if (!empty($usercandelete)) {
|
||||
if ($hasreception) {
|
||||
print '<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("ReceptionExist").'">'.$langs->trans("Delete").'</a>';
|
||||
} else {
|
||||
|
||||
@ -738,7 +738,7 @@ $help_url = '';
|
||||
// llxHeader('',$title,$help_url);
|
||||
|
||||
$sql = 'SELECT';
|
||||
if ($sall || $search_product_category > 0 || $search_user > 0) {
|
||||
if ($sall || $search_product_category > 0) {
|
||||
$sql = 'SELECT DISTINCT';
|
||||
}
|
||||
$sql .= ' s.rowid as socid, s.nom as name, s.town, s.zip, s.fk_pays, s.client, s.code_client, s.email,';
|
||||
@ -780,10 +780,6 @@ $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."projet as p ON p.rowid = cf.fk_projet";
|
||||
if ($search_sale > 0 || (empty($user->rights->societe->client->voir) && !$socid)) {
|
||||
$sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
|
||||
}
|
||||
if ($search_user > 0) {
|
||||
$sql .= ", ".MAIN_DB_PREFIX."element_contact as ec";
|
||||
$sql .= ", ".MAIN_DB_PREFIX."c_type_contact as tc";
|
||||
}
|
||||
$parameters = array();
|
||||
$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
|
||||
$sql .= $hookmanager->resPrint;
|
||||
@ -869,7 +865,13 @@ if ($search_sale > 0) {
|
||||
$sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $search_sale);
|
||||
}
|
||||
if ($search_user > 0) {
|
||||
$sql .= " AND ec.fk_c_type_contact = tc.rowid AND tc.element='supplier_order' AND tc.source='internal' AND ec.element_id = cf.rowid AND ec.fk_socpeople = ".((int) $search_user);
|
||||
$sql .= " AND EXISTS (";
|
||||
$sql .= " SELECT ec.rowid ";
|
||||
$sql .= " FROM " . MAIN_DB_PREFIX . "element_contact as ec";
|
||||
$sql .= " INNER JOIN " . MAIN_DB_PREFIX . "c_type_contact as tc ON tc.rowid = ec.fk_c_type_contact";
|
||||
$sql .= " WHERE ec.element_id = cf.rowid AND ec.fk_socpeople = " . ((int) $search_user);
|
||||
$sql .= " AND tc.element = 'order_supplier' AND tc.source = 'internal'";
|
||||
$sql .= ")";
|
||||
}
|
||||
if ($search_total_ht != '') {
|
||||
$sql .= natural_search('cf.total_ht', $search_total_ht, 1);
|
||||
|
||||
@ -265,6 +265,8 @@ if (empty($reshook)) {
|
||||
// Remove a product line
|
||||
$result = $object->deleteline($lineid);
|
||||
if ($result > 0) {
|
||||
// reorder lines
|
||||
$object->line_order(true);
|
||||
// Define output language
|
||||
/*$outputlangs = $langs;
|
||||
$newlang = '';
|
||||
|
||||
@ -257,6 +257,7 @@ if ($resql) {
|
||||
$trackid = 'prod'.$object->id;
|
||||
include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
|
||||
|
||||
print '<div class="div-table-responsive-no-min">';
|
||||
print '<table class="liste centpercent">';
|
||||
|
||||
// Fields title search
|
||||
@ -357,7 +358,7 @@ if ($resql) {
|
||||
}
|
||||
$db->free($resql);
|
||||
|
||||
print "</table>";
|
||||
print "</table></div>";
|
||||
|
||||
print '</form>';
|
||||
} else {
|
||||
|
||||
@ -90,13 +90,14 @@ if (($id > 0) || $ref) {
|
||||
$hookmanager->initHooks(array('holidaycard', 'globalcard'));
|
||||
|
||||
$cancreate = 0;
|
||||
|
||||
if (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->holiday->writeall_advance)) {
|
||||
$cancreate = 1;
|
||||
}
|
||||
$cancreateall = 0;
|
||||
if (!empty($user->rights->holiday->write) && in_array($fuserid, $childids)) {
|
||||
$cancreate = 1;
|
||||
}
|
||||
if (!empty($user->rights->holiday->writeall)) {
|
||||
$cancreate = 1;
|
||||
$cancreateall = 1;
|
||||
}
|
||||
|
||||
$candelete = 0;
|
||||
if (!empty($user->rights->holiday->delete)) {
|
||||
@ -181,23 +182,25 @@ if (empty($reshook)) {
|
||||
$description = trim(GETPOST('description', 'restricthtml'));
|
||||
|
||||
// Check that leave is for a user inside the hierarchy or advanced permission for all is set
|
||||
if (empty($conf->global->MAIN_USE_ADVANCED_PERMS)) {
|
||||
if (empty($user->rights->holiday->write)) {
|
||||
$error++;
|
||||
setEventMessages($langs->trans("NotEnoughPermissions"), null, 'errors');
|
||||
} elseif (!in_array($fuserid, $childids)) {
|
||||
$error++;
|
||||
setEventMessages($langs->trans("UserNotInHierachy"), null, 'errors');
|
||||
$action = 'create';
|
||||
}
|
||||
} else {
|
||||
if (empty($user->rights->holiday->write) && empty($user->rights->holiday->writeall_advance)) {
|
||||
$error++;
|
||||
setEventMessages($langs->trans("NotEnoughPermissions"), null, 'errors');
|
||||
} elseif (empty($user->rights->holiday->writeall_advance) && !in_array($fuserid, $childids)) {
|
||||
$error++;
|
||||
setEventMessages($langs->trans("UserNotInHierachy"), null, 'errors');
|
||||
$action = 'create';
|
||||
if (!$cancreateall) {
|
||||
if (empty($conf->global->MAIN_USE_ADVANCED_PERMS)) {
|
||||
if (empty($user->rights->holiday->write)) {
|
||||
$error++;
|
||||
setEventMessages($langs->trans("NotEnoughPermissions"), null, 'errors');
|
||||
} elseif (!in_array($fuserid, $childids)) {
|
||||
$error++;
|
||||
setEventMessages($langs->trans("UserNotInHierachy"), null, 'errors');
|
||||
$action = 'create';
|
||||
}
|
||||
} else {
|
||||
if (empty($user->rights->holiday->write) && empty($user->rights->holiday->writeall_advance)) {
|
||||
$error++;
|
||||
setEventMessages($langs->trans("NotEnoughPermissions"), null, 'errors');
|
||||
} elseif (empty($user->rights->holiday->writeall_advance) && !in_array($fuserid, $childids)) {
|
||||
$error++;
|
||||
setEventMessages($langs->trans("UserNotInHierachy"), null, 'errors');
|
||||
$action = 'create';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -279,7 +282,7 @@ if (empty($reshook)) {
|
||||
}
|
||||
}
|
||||
|
||||
// If update and we are an approver, we can update with another approver
|
||||
// If this is an update and we are an approver, we can update to change the approver
|
||||
if ($action == 'update' && GETPOSTISSET('savevalidator') && !empty($user->rights->holiday->approve)) {
|
||||
$object->fetch($id);
|
||||
|
||||
@ -319,10 +322,18 @@ if (empty($reshook)) {
|
||||
}
|
||||
|
||||
// If no right to modify a request
|
||||
if (!$user->rights->holiday->write) {
|
||||
setEventMessages($langs->trans("CantUpdate"), null, 'errors');
|
||||
header('Location: '.$_SERVER["PHP_SELF"].'?action=create');
|
||||
exit;
|
||||
if (!$cancreateall) {
|
||||
if ($cancreate) {
|
||||
if (!in_array($fuserid, $childids)) {
|
||||
setEventMessages($langs->trans("UserNotInHierachy"), null, 'errors');
|
||||
header('Location: '.$_SERVER["PHP_SELF"].'?action=create');
|
||||
exit;
|
||||
}
|
||||
} else {
|
||||
setEventMessages($langs->trans("NotEnoughPermissions"), null, 'errors');
|
||||
header('Location: '.$_SERVER["PHP_SELF"].'?action=create');
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
$object->fetch($id);
|
||||
@ -337,13 +348,13 @@ if (empty($reshook)) {
|
||||
$description = trim(GETPOST('description', 'restricthtml'));
|
||||
|
||||
// If no start date
|
||||
if (empty($_POST['date_debut_'])) {
|
||||
if (!GETPOST('date_debut_')) {
|
||||
header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=edit&token='.newToken().'&error=nodatedebut');
|
||||
exit;
|
||||
}
|
||||
|
||||
// If no end date
|
||||
if (empty($_POST['date_fin_'])) {
|
||||
if (!GETPOST('date_fin_')) {
|
||||
header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=edit&token='.newToken().'&error=nodatefin');
|
||||
exit;
|
||||
}
|
||||
@ -394,7 +405,7 @@ if (empty($reshook)) {
|
||||
}
|
||||
|
||||
// If delete of request
|
||||
if ($action == 'confirm_delete' && GETPOST('confirm') == 'yes' && $user->rights->holiday->delete) {
|
||||
if ($action == 'confirm_delete' && GETPOST('confirm') == 'yes' && $candelete) {
|
||||
$error = 0;
|
||||
|
||||
$db->begin();
|
||||
@ -403,14 +414,11 @@ if (empty($reshook)) {
|
||||
|
||||
// If this is a rough draft, approved, canceled or refused
|
||||
if ($object->statut == Holiday::STATUS_DRAFT || $object->statut == Holiday::STATUS_CANCELED || $object->statut == Holiday::STATUS_REFUSED) {
|
||||
// Si l'utilisateur à le droit de lire cette demande, il peut la supprimer
|
||||
if ($candelete) {
|
||||
$result = $object->delete($user);
|
||||
} else {
|
||||
$error++;
|
||||
setEventMessages($langs->trans('ErrorCantDeleteCP'), null, 'errors');
|
||||
$action = '';
|
||||
}
|
||||
$result = $object->delete($user);
|
||||
} else {
|
||||
$error++;
|
||||
setEventMessages($langs->trans('BadStatusOfObject'), null, 'errors');
|
||||
$action = '';
|
||||
}
|
||||
|
||||
if (!$error) {
|
||||
@ -765,7 +773,7 @@ if (empty($reshook)) {
|
||||
|
||||
// If status pending validation and validator = validator or user, or rights to do for others
|
||||
if (($object->statut == Holiday::STATUS_VALIDATED || $object->statut == Holiday::STATUS_APPROVED) &&
|
||||
(!empty($user->admin) || $user->id == $object->fk_validator || in_array($object->fk_user, $childids) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->holiday->writeall_advance)))) {
|
||||
(!empty($user->admin) || $user->id == $object->fk_validator || $cancreate || $cancreateall)) {
|
||||
$db->begin();
|
||||
|
||||
$oldstatus = $object->statut;
|
||||
@ -996,12 +1004,11 @@ if ((empty($id) && empty($ref)) || $action == 'create' || $action == 'add') {
|
||||
print '<tr>';
|
||||
print '<td class="titlefield fieldrequired">'.$langs->trans("User").'</td>';
|
||||
print '<td>';
|
||||
|
||||
if (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || empty($user->rights->holiday->writeall_advance)) {
|
||||
if ($cancreate && !$cancreateall) {
|
||||
print img_picto('', 'user').$form->select_dolusers(($fuserid ? $fuserid : $user->id), 'fuserid', 0, '', 0, 'hierarchyme', '', '0,'.$conf->entity, 0, 0, $morefilter, 0, '', 'minwidth200 maxwidth500');
|
||||
//print '<input type="hidden" name="fuserid" value="'.($fuserid?$fuserid:$user->id).'">';
|
||||
} else {
|
||||
print img_picto('', 'user').$form->select_dolusers(GETPOST('fuserid', 'int') ? GETPOST('fuserid', 'int') : $user->id, 'fuserid', 0, '', 0, '', '', '0,'.$conf->entity, 0, 0, $morefilter, 0, '', 'minwidth200 maxwidth500');
|
||||
print img_picto('', 'user').$form->select_dolusers($fuserid ? $fuserid : $user->id, 'fuserid', 0, '', 0, '', '', '0,'.$conf->entity, 0, 0, $morefilter, 0, '', 'minwidth200 maxwidth500');
|
||||
}
|
||||
print '</td>';
|
||||
print '</tr>';
|
||||
@ -1464,7 +1471,7 @@ if ((empty($id) && empty($ref)) || $action == 'create' || $action == 'add') {
|
||||
print '<a href="#" class="butActionRefused classfortooltip" title="'.$langs->trans("NotTheAssignedApprover").'">'.$langs->trans("ActionRefuseCP").'</a>';
|
||||
|
||||
// Button Cancel (because we can't approve)
|
||||
if (in_array($object->fk_user, $childids) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->holiday->writeall_advance))) {
|
||||
if ($cancreate || $cancreateall) {
|
||||
if (($object->date_debut > dol_now()) || !empty($user->admin)) {
|
||||
print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=cancel&token='.newToken().'" class="butAction">'.$langs->trans("ActionCancelCP").'</a>';
|
||||
} else {
|
||||
@ -1473,17 +1480,15 @@ if ((empty($id) && empty($ref)) || $action == 'create' || $action == 'add') {
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($object->statut == Holiday::STATUS_APPROVED) { // If validated or approved
|
||||
if ($user->id == $object->fk_validator
|
||||
|| in_array($object->fk_user, $childids)
|
||||
|| (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->holiday->writeall_advance))) {
|
||||
if ($object->statut == Holiday::STATUS_APPROVED) { // If validated and approved
|
||||
if ($user->id == $object->fk_validator || $cancreate || $cancreateall) {
|
||||
if (($object->date_debut > dol_now()) || !empty($user->admin)) {
|
||||
print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=cancel&token='.newToken().'" class="butAction">'.$langs->trans("ActionCancelCP").'</a>';
|
||||
} else {
|
||||
print '<a href="#" class="butActionRefused classfortooltip" title="'.$langs->trans("HolidayStarted").'-'.$langs->trans("NotAllowed").'">'.$langs->trans("ActionCancelCP").'</a>';
|
||||
}
|
||||
} else { // I have no rights on the user of the holiday.
|
||||
if (!empty($user->admin)) { // If current validator can't cancel an approved leave, we allow admin user
|
||||
if (!empty($user->admin)) { // If current approver can't cancel an approved leave, we allow admin user
|
||||
print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=cancel&token='.newToken().'" class="butAction">'.$langs->trans("ActionCancelCP").'</a>';
|
||||
} else {
|
||||
print '<a href="#" class="butActionRefused classfortooltip" title="'.$langs->trans("NotAllowed").'">'.$langs->trans("ActionCancelCP").'</a>';
|
||||
@ -1491,7 +1496,7 @@ if ((empty($id) && empty($ref)) || $action == 'create' || $action == 'add') {
|
||||
}
|
||||
}
|
||||
|
||||
if ($cancreate && $object->statut == Holiday::STATUS_CANCELED) {
|
||||
if (($cancreate || $cancreateall) && $object->statut == Holiday::STATUS_CANCELED) {
|
||||
print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=backtodraft" class="butAction">'.$langs->trans("SetToDraft").'</a>';
|
||||
}
|
||||
if ($candelete && ($object->statut == Holiday::STATUS_DRAFT || $object->statut == Holiday::STATUS_CANCELED || $object->statut == Holiday::STATUS_REFUSED)) { // If draft or canceled or refused
|
||||
|
||||
@ -93,23 +93,6 @@ if (($id > 0) || $ref) {
|
||||
}
|
||||
}
|
||||
|
||||
/*$cancreate = 0;
|
||||
|
||||
if (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->holiday->writeall_advance)) {
|
||||
$cancreate = 1;
|
||||
}
|
||||
if (!empty($user->rights->holiday->write) && in_array($fuserid, $childids)) {
|
||||
$cancreate = 1;
|
||||
}
|
||||
|
||||
$candelete = 0;
|
||||
if (!empty($user->rights->holiday->delete)) {
|
||||
$candelete = 1;
|
||||
}
|
||||
if ($object->statut == Holiday::STATUS_DRAFT && $user->rights->holiday->write && in_array($object->fk_user, $childids)) {
|
||||
$candelete = 1;
|
||||
}
|
||||
*/
|
||||
|
||||
$upload_dir = $conf->holiday->dir_output.'/'.get_exdir(0, 0, 0, 1, $object, '');
|
||||
$modulepart = 'holiday';
|
||||
|
||||
@ -488,9 +488,15 @@ if ($resql) {
|
||||
|
||||
print '<div class="tabsAction">';
|
||||
|
||||
$canedit = (($user->id == $user_id && $user->rights->holiday->write) || ($user->id != $user_id && (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->holiday->writeall_advance))));
|
||||
$cancreate = 0;
|
||||
if (!empty($user->rights->holiday->writeall)) {
|
||||
$cancreate = 1;
|
||||
}
|
||||
if (!empty($user->rights->holiday->write) && in_array($user_id, $childids)) {
|
||||
$cancreate = 1;
|
||||
}
|
||||
|
||||
if ($canedit) {
|
||||
if ($cancreate) {
|
||||
print '<a href="'.DOL_URL_ROOT.'/holiday/card.php?action=create&fuserid='.$user_id.'" class="butAction">'.$langs->trans("AddCP").'</a>';
|
||||
}
|
||||
|
||||
|
||||
@ -236,7 +236,7 @@ class Evaluation extends CommonObject
|
||||
$line = new Evaluationline($this->db);
|
||||
$line->fk_evaluation = $resultcreate;
|
||||
$line->fk_skill = $required->fk_skill;
|
||||
$line->required_rank = $required->rank;
|
||||
$line->required_rank = $required->rankorder;
|
||||
$line->fk_rank = 0;
|
||||
|
||||
$res = $line->create($user, $notrigger);
|
||||
|
||||
@ -978,7 +978,7 @@ class Skill extends CommonObject
|
||||
$this->lines = array();
|
||||
|
||||
$objectline = new SkillLine($this->db);
|
||||
$result = $objectline->fetchAll('ASC', 'rank', 0, 0, array('customsql'=>'fk_skill = '.$this->id));
|
||||
$result = $objectline->fetchAll('ASC', 'rankorder', 0, 0, array('customsql'=>'fk_skill = '.$this->id));
|
||||
|
||||
if (is_numeric($result)) {
|
||||
$this->error = $this->error;
|
||||
|
||||
@ -107,7 +107,7 @@ class SkillRank extends CommonObject
|
||||
public $fields=array(
|
||||
'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>0, 'noteditable'=>'1', 'index'=>1, 'css'=>'left', 'comment'=>"Id"),
|
||||
'fk_skill' => array('type'=>'integer:Skill:hrm/class/skill.class.php:1', 'label'=>'Skill', 'enabled'=>'1', 'position'=>3, 'notnull'=>1, 'visible'=>1, 'index'=>1,),
|
||||
'rank' => array('type'=>'integer', 'label'=>'Rank', 'enabled'=>'1', 'position'=>4, 'notnull'=>1, 'visible'=>1, 'default' => 0),
|
||||
'rankorder' => array('type'=>'integer', 'label'=>'Rank', 'enabled'=>'1', 'position'=>4, 'notnull'=>1, 'visible'=>1, 'default' => 0),
|
||||
'fk_object' => array('type'=>'integer', 'label'=>'object', 'enabled'=>'1', 'position'=>5, 'notnull'=>1, 'visible'=>0,),
|
||||
'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>'1', 'position'=>500, 'notnull'=>1, 'visible'=>-2,),
|
||||
'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>'1', 'position'=>501, 'notnull'=>0, 'visible'=>-2,),
|
||||
@ -371,7 +371,7 @@ class SkillRank extends CommonObject
|
||||
global $user;
|
||||
|
||||
$this->fk_skill = $currentSkill->fk_skill;
|
||||
$this->rank = $currentSkill->rank;
|
||||
$this->rankorder = $currentSkill->rankorder;
|
||||
$this->fk_object = $fk_user;
|
||||
$this->date_creation = dol_now();
|
||||
$this->fk_user_creat = $user->id;
|
||||
|
||||
@ -42,7 +42,7 @@ require_once DOL_DOCUMENT_ROOT . '/hrm/class/evaluation.class.php';
|
||||
require_once DOL_DOCUMENT_ROOT . '/hrm/class/position.class.php';
|
||||
require_once DOL_DOCUMENT_ROOT . '/hrm/lib/hrm.lib.php';
|
||||
|
||||
$permissiontoread = $user->rights->hrm->evaluation->read || $user->rights->hrm->compare->read;
|
||||
$permissiontoread = $user->rights->hrm->evaluation->read || $user->rights->hrm->compare_advance->read;
|
||||
$permissiontoadd = 0;
|
||||
if (empty($conf->hrm->enabled)) accessforbidden();
|
||||
if (!$permissiontoread || ($action === 'create' && !$permissiontoadd)) accessforbidden();
|
||||
@ -372,7 +372,7 @@ function mergeSkills($TSkill1, $TSkill2)
|
||||
foreach ($TSkill1 as &$sk) {
|
||||
if (empty($Tab[$sk->fk_skill])) $Tab[$sk->fk_skill] = new stdClass;
|
||||
|
||||
$Tab[$sk->fk_skill]->rate1 = $sk->rank;
|
||||
$Tab[$sk->fk_skill]->rate1 = $sk->rankorder;
|
||||
$Tab[$sk->fk_skill]->how_many_max1 = $sk->how_many_max;
|
||||
$Tab[$sk->fk_skill]->label = $sk->label;
|
||||
$Tab[$sk->fk_skill]->description = $sk->description;
|
||||
@ -380,7 +380,7 @@ function mergeSkills($TSkill1, $TSkill2)
|
||||
|
||||
foreach ($TSkill2 as &$sk) {
|
||||
if (empty($Tab[$sk->fk_skill])) $Tab[$sk->fk_skill] = new stdClass;
|
||||
$Tab[$sk->fk_skill]->rate2 = $sk->rank;
|
||||
$Tab[$sk->fk_skill]->rate2 = $sk->rankorder;
|
||||
$Tab[$sk->fk_skill]->label = $sk->label;
|
||||
$Tab[$sk->fk_skill]->description = $sk->description;
|
||||
$Tab[$sk->fk_skill]->how_many_max2 = $sk->how_many_max;
|
||||
@ -481,7 +481,7 @@ function getSkillForUsers($TUser)
|
||||
if (empty($TUser)) return array();
|
||||
|
||||
$sql = 'SELECT sk.rowid, sk.label, sk.description, sk.skill_type, sr.fk_object, sr.objecttype, sr.fk_skill, ';
|
||||
$sql.= ' MAX(sr.rank) as "rank"';
|
||||
$sql.= ' MAX(sr.rankorder) as "rankorder"';
|
||||
$sql.= ' FROM '.MAIN_DB_PREFIX.'hrm_skill sk';
|
||||
$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'hrm_skillrank sr ON (sk.rowid = sr.fk_skill)';
|
||||
$sql.= " WHERE sr.objecttype = '".SkillRank::SKILLRANK_TYPE_USER."'";
|
||||
@ -496,7 +496,7 @@ function getSkillForUsers($TUser)
|
||||
$num = 0;
|
||||
while ($obj = $db->fetch_object($resql) ) {
|
||||
$sql1 = "SELECT count(*) as how_many_max FROM ".MAIN_DB_PREFIX."hrm_skillrank sr";
|
||||
$sql1.=" WHERE sr.rank = ".((int) $obj->rank);
|
||||
$sql1.=" WHERE sr.rankorder = ".((int) $obj->rankorder);
|
||||
$sql1.=" AND sr.objecttype = '".Skillrank::SKILLRANK_TYPE_USER."'";
|
||||
$sql1.=" AND sr.fk_skill = ".((int) $obj->fk_skill);
|
||||
$sql1.=" AND sr.fk_object IN (".$db->sanitize(implode(',', $TUser)).")";
|
||||
@ -511,7 +511,7 @@ function getSkillForUsers($TUser)
|
||||
$Tab[$num]->skill_type = $obj->skill_type;
|
||||
$Tab[$num]->fk_object = $obj->fk_object;
|
||||
$Tab[$num]->objectType = SkillRank::SKILLRANK_TYPE_USER;
|
||||
$Tab[$num]->rank = $obj->rank;
|
||||
$Tab[$num]->rankorder = $obj->rankorder;
|
||||
$Tab[$num]->how_many_max = $objMax->how_many_max;
|
||||
|
||||
$num++;
|
||||
@ -536,7 +536,7 @@ function getSkillForJob($fk_job)
|
||||
if (empty($fk_job)) return array();
|
||||
|
||||
$sql = 'SELECT sk.rowid, sk.label, sk.description, sk.skill_type, sr.fk_object, sr.objecttype, sr.fk_skill, ';
|
||||
$sql.= ' MAX(sr.rank) as "rank"';
|
||||
$sql.= ' MAX(sr.rankorder) as "rankorder"';
|
||||
$sql.=' FROM '.MAIN_DB_PREFIX.'hrm_skill sk';
|
||||
$sql.=' LEFT JOIN '.MAIN_DB_PREFIX.'hrm_skillrank sr ON (sk.rowid = sr.fk_skill)';
|
||||
$sql.=" WHERE sr.objecttype = '".SkillRank::SKILLRANK_TYPE_JOB."'";
|
||||
@ -559,7 +559,7 @@ function getSkillForJob($fk_job)
|
||||
//$Tab[$num]->date_end = ''; // du poste
|
||||
$Tab[$num]->fk_object = $obj->fk_object;
|
||||
$Tab[$num]->objectType = SkillRank::SKILLRANK_TYPE_JOB;
|
||||
$Tab[$num]->rank = $obj->rank;
|
||||
$Tab[$num]->rankorder = $obj->rankorder;
|
||||
$Tab[$num]->how_many_max = $obj->how_many_max;
|
||||
|
||||
$num++;
|
||||
|
||||
@ -93,7 +93,7 @@ print '</td>';
|
||||
<?php
|
||||
global $permissiontoadd;
|
||||
|
||||
print displayRankInfos($line->rank, $line->fk_skill, 'TNote', ($this->status == 0 && $permissiontoadd) ? 'edit' : 'view');
|
||||
print displayRankInfos($line->rankorder, $line->fk_skill, 'TNote', ($this->status == 0 && $permissiontoadd) ? 'edit' : 'view');
|
||||
|
||||
?>
|
||||
|
||||
|
||||
@ -82,7 +82,7 @@ include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be includ
|
||||
|
||||
$permissiontoread = $user->rights->hrm->evaluation->read;
|
||||
$permissiontoadd = $user->rights->hrm->evaluation->write; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
|
||||
$permissiontovalidate = $user->rights->hrm->evaluation->validate;
|
||||
$permissiontovalidate = $user->rights->hrm->evaluation_advance->validate;
|
||||
$permissiontoClose = $user->rights->hrm->evaluation->write;
|
||||
$permissiontodelete = $user->rights->hrm->evaluation->delete/* || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT)*/;
|
||||
$permissiondellink = $user->rights->hrm->evaluation->write; // Used by the include of actions_dellink.inc.php
|
||||
@ -156,7 +156,7 @@ if (empty($reshook)) {
|
||||
$TNote = GETPOST('TNote', 'array');
|
||||
if (!empty($TNote)) {
|
||||
foreach ($object->lines as $line) {
|
||||
$line->rank = $TNote[$line->fk_skill];
|
||||
$line->rankorder = $TNote[$line->fk_skill];
|
||||
$line->update($user);
|
||||
}
|
||||
}
|
||||
@ -172,16 +172,12 @@ if (empty($reshook)) {
|
||||
foreach ($object->lines as $key => $line) {
|
||||
// no reference .. we add the line to use it
|
||||
if (count($SkillrecordsForActiveUser) == 0) {
|
||||
if ($res > 0) {
|
||||
$newSkill = new SkillRank($db);
|
||||
$resCreate = $newSkill->cloneFromCurrentSkill($line, $object->fk_user);
|
||||
$newSkill = new SkillRank($db);
|
||||
$resCreate = $newSkill->cloneFromCurrentSkill($line, $object->fk_user);
|
||||
|
||||
if ($resCreate <= 0) {
|
||||
$errors++;
|
||||
setEventMessage($langs->trans('ErrorCreateUserSkill'), $line->fk_skill);
|
||||
}
|
||||
} else {
|
||||
setEventMessage($langs->trans('NoSkilRankLoaded'));
|
||||
if ($resCreate <= 0) {
|
||||
$errors++;
|
||||
setEventMessage($langs->trans('ErrorCreateUserSkill'), $line->fk_skill);
|
||||
}
|
||||
} else {
|
||||
//check if the skill is present to use it
|
||||
@ -198,7 +194,7 @@ if (empty($reshook)) {
|
||||
if ($find) {
|
||||
$updSkill = $SkillrecordsForActiveUser[$k];
|
||||
|
||||
$updSkill->rank = $line->rank;
|
||||
$updSkill->rankorder = $line->rankorder;
|
||||
$updSkill->update($user);
|
||||
} else { // sinon on ajoute la skill
|
||||
$newSkill = new SkillRank($db);
|
||||
@ -519,9 +515,9 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
|
||||
$sql .= ' sk.label as "skilllabel",';
|
||||
$sql .= ' sk.skill_type,';
|
||||
$sql .= ' sk.description,';
|
||||
$sql .= ' ed.rank,';
|
||||
$sql .= ' ed.rankorder,';
|
||||
$sql .= ' ed.required_rank,';
|
||||
$sql .= ' ed.rank as "userRankForSkill",';
|
||||
$sql .= ' ed.rankorder as "userRankForSkill",';
|
||||
$sql .= ' skdet_user.description as "userRankForSkillDesc",';
|
||||
$sql .= ' skdet_required.description as "required_rank_desc"';
|
||||
|
||||
@ -529,9 +525,9 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
|
||||
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'hrm_evaluationdet as ed ON e.rowid = ed.fk_evaluation';
|
||||
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'hrm_job as j ON e.fk_job = j.rowid';
|
||||
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'hrm_skill as sk ON ed.fk_skill = sk.rowid';
|
||||
$sql .= ' INNER JOIN ' . MAIN_DB_PREFIX . 'hrm_skilldet as skdet_user ON (skdet_user.fk_skill = sk.rowid AND skdet_user.rank = ed.rank)';
|
||||
$sql .= ' INNER JOIN ' . MAIN_DB_PREFIX . 'hrm_skilldet as skdet_user ON (skdet_user.fk_skill = sk.rowid AND skdet_user.rankorder = ed.rankorder)';
|
||||
//$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "hrm_skillrank as skr ON (j.rowid = skr.fk_object AND skr.fk_skill = ed.fk_skill AND skr.objecttype = 'job')";
|
||||
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'hrm_skilldet as skdet_required ON (skdet_required.fk_skill = sk.rowid AND skdet_required.rank = ed.required_rank)';
|
||||
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'hrm_skilldet as skdet_required ON (skdet_required.fk_skill = sk.rowid AND skdet_required.rankorder = ed.required_rank)';
|
||||
$sql .= " WHERE e.rowid =" . ((int) $object->id);
|
||||
|
||||
// echo $sql;
|
||||
|
||||
@ -124,13 +124,13 @@ function displayRankInfos($selected_rank, $fk_skill, $inputname = 'TNote', $mode
|
||||
if (is_array($Lines) && !empty($Lines)) {
|
||||
foreach ($Lines as $line) {
|
||||
$MaxNumberSkill = isset($conf->global->HRM_MAXRANK) ? $conf->global->HRM_MAXRANK : Skill::DEFAULT_MAX_RANK_PER_SKILL;
|
||||
if ($line->rank > $MaxNumberSkill) {
|
||||
if ($line->rankorder > $MaxNumberSkill) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$ret .= '<span title="' . $line->description . '" class="radio_js_bloc_number ' . $inputname . '_' . $line->fk_skill;
|
||||
$ret .= $line->rank == $selected_rank ? ' selected' : '';
|
||||
$ret .= '">' . $line->rank . '</span>';
|
||||
$ret .= $line->rankorder == $selected_rank ? ' selected' : '';
|
||||
$ret .= '">' . $line->rankorder . '</span>';
|
||||
}
|
||||
|
||||
if ($mode == 'edit') {
|
||||
|
||||
@ -42,7 +42,6 @@
|
||||
//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT', 'auto'); // Force lang to a particular value
|
||||
//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler
|
||||
//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN', 1); // The main.inc.php does not make a redirect if not logged, instead show simple error message
|
||||
//if (! defined("FORCECSP")) define('FORCECSP', 'none'); // Disable all Content Security Policies
|
||||
//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET
|
||||
//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification
|
||||
|
||||
|
||||
@ -130,7 +130,7 @@ if (empty($reshook)) {
|
||||
$TSkills = $skill->fetchAll('ASC', 't.rowid', 0, 0, array('customsql' => 'fk_object=' . ((int) $id) . " AND objecttype='" . $db->escape($objecttype) . "' AND fk_skill = " . ((int) $skillId)));
|
||||
if (is_array($TSkills) && !empty($TSkills)) {
|
||||
foreach ($TSkills as $tmpObj) {
|
||||
$tmpObj->rank = $rank;
|
||||
$tmpObj->rankorder = $rank;
|
||||
$tmpObj->update($user);
|
||||
}
|
||||
}
|
||||
@ -305,7 +305,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
|
||||
print '<td>';
|
||||
print $sk->description;
|
||||
print '</td><td class="linecolrank">';
|
||||
print displayRankInfos($skillElement->rank, $skillElement->fk_skill, 'TNote', $objecttype == 'job' && $permissiontoadd ? 'edit' : 'view');
|
||||
print displayRankInfos($skillElement->rankorder, $skillElement->fk_skill, 'TNote', $objecttype == 'job' && $permissiontoadd ? 'edit' : 'view');
|
||||
print '</td>';
|
||||
if ($objecttype != 'user' && $permissiontoadd) {
|
||||
print '<td class="linecoledit"></td>';
|
||||
|
||||
@ -13,194 +13,196 @@ use OAuth\Common\Http\Uri\Uri;
|
||||
|
||||
class Google extends AbstractService
|
||||
{
|
||||
/**
|
||||
* Defined scopes - More scopes are listed here:
|
||||
* https://developers.google.com/oauthplayground/
|
||||
*
|
||||
* Make a pull request if you need more scopes.
|
||||
*/
|
||||
/**
|
||||
* Defined scopes - More scopes are listed here:
|
||||
* https://developers.google.com/oauthplayground/
|
||||
*
|
||||
* Make a pull request if you need more scopes.
|
||||
*/
|
||||
|
||||
// Basic
|
||||
const SCOPE_EMAIL = 'email';
|
||||
const SCOPE_PROFILE = 'profile';
|
||||
// Basic
|
||||
const SCOPE_EMAIL = 'email';
|
||||
const SCOPE_PROFILE = 'profile';
|
||||
|
||||
const SCOPE_USERINFO_EMAIL = 'https://www.googleapis.com/auth/userinfo.email';
|
||||
const SCOPE_USERINFO_PROFILE = 'https://www.googleapis.com/auth/userinfo.profile';
|
||||
const SCOPE_USERINFO_EMAIL = 'https://www.googleapis.com/auth/userinfo.email';
|
||||
const SCOPE_USERINFO_PROFILE = 'https://www.googleapis.com/auth/userinfo.profile';
|
||||
|
||||
// Google+
|
||||
const SCOPE_GPLUS_ME = 'https://www.googleapis.com/auth/plus.me';
|
||||
const SCOPE_GPLUS_LOGIN = 'https://www.googleapis.com/auth/plus.login';
|
||||
const SCOPE_GPLUS_CIRCLES_READ = 'https://www.googleapis.com/auth/plus.circles.read';
|
||||
const SCOPE_GPLUS_CIRCLES_WRITE = 'https://www.googleapis.com/auth/plus.circles.write';
|
||||
const SCOPE_GPLUS_STREAM_READ = 'https://www.googleapis.com/auth/plus.stream.read';
|
||||
const SCOPE_GPLUS_STREAM_WRITE = 'https://www.googleapis.com/auth/plus.stream.write';
|
||||
const SCOPE_GPLUS_MEDIA = 'https://www.googleapis.com/auth/plus.media.upload';
|
||||
// Google+
|
||||
const SCOPE_GPLUS_ME = 'https://www.googleapis.com/auth/plus.me';
|
||||
const SCOPE_GPLUS_LOGIN = 'https://www.googleapis.com/auth/plus.login';
|
||||
const SCOPE_GPLUS_CIRCLES_READ = 'https://www.googleapis.com/auth/plus.circles.read';
|
||||
const SCOPE_GPLUS_CIRCLES_WRITE = 'https://www.googleapis.com/auth/plus.circles.write';
|
||||
const SCOPE_GPLUS_STREAM_READ = 'https://www.googleapis.com/auth/plus.stream.read';
|
||||
const SCOPE_GPLUS_STREAM_WRITE = 'https://www.googleapis.com/auth/plus.stream.write';
|
||||
const SCOPE_GPLUS_MEDIA = 'https://www.googleapis.com/auth/plus.media.upload';
|
||||
|
||||
// Google Drive
|
||||
const SCOPE_DOCUMENTSLIST = 'https://docs.google.com/feeds/';
|
||||
const SCOPE_SPREADSHEETS = 'https://spreadsheets.google.com/feeds/';
|
||||
const SCOPE_GOOGLEDRIVE = 'https://www.googleapis.com/auth/drive';
|
||||
const SCOPE_DRIVE_APPS = 'https://www.googleapis.com/auth/drive.appdata';
|
||||
const SCOPE_DRIVE_APPS_READ_ONLY = 'https://www.googleapis.com/auth/drive.apps.readonly';
|
||||
const SCOPE_GOOGLEDRIVE_FILES = 'https://www.googleapis.com/auth/drive.file';
|
||||
const SCOPE_DRIVE_METADATA_READ_ONLY = 'https://www.googleapis.com/auth/drive.metadata.readonly';
|
||||
const SCOPE_DRIVE_READ_ONLY = 'https://www.googleapis.com/auth/drive.readonly';
|
||||
const SCOPE_DRIVE_SCRIPTS = 'https://www.googleapis.com/auth/drive.scripts';
|
||||
// Google Drive
|
||||
const SCOPE_DOCUMENTSLIST = 'https://docs.google.com/feeds/';
|
||||
const SCOPE_SPREADSHEETS = 'https://spreadsheets.google.com/feeds/';
|
||||
const SCOPE_GOOGLEDRIVE = 'https://www.googleapis.com/auth/drive';
|
||||
const SCOPE_DRIVE_APPS = 'https://www.googleapis.com/auth/drive.appdata';
|
||||
const SCOPE_DRIVE_APPS_READ_ONLY = 'https://www.googleapis.com/auth/drive.apps.readonly';
|
||||
const SCOPE_GOOGLEDRIVE_FILES = 'https://www.googleapis.com/auth/drive.file';
|
||||
const SCOPE_DRIVE_METADATA_READ_ONLY = 'https://www.googleapis.com/auth/drive.metadata.readonly';
|
||||
const SCOPE_DRIVE_READ_ONLY = 'https://www.googleapis.com/auth/drive.readonly';
|
||||
const SCOPE_DRIVE_SCRIPTS = 'https://www.googleapis.com/auth/drive.scripts';
|
||||
|
||||
// Cloud Print
|
||||
const SCOPE_CLOUD_PRINT = 'https://www.googleapis.com/auth/cloudprint';
|
||||
// Cloud Print
|
||||
const SCOPE_CLOUD_PRINT = 'https://www.googleapis.com/auth/cloudprint';
|
||||
|
||||
// Adwords
|
||||
const SCOPE_ADSENSE = 'https://www.googleapis.com/auth/adsense';
|
||||
const SCOPE_ADWORDS = 'https://www.googleapis.com/auth/adwords/';
|
||||
const SCOPE_GAN = 'https://www.googleapis.com/auth/gan'; // google affiliate network...?
|
||||
// Adwords
|
||||
const SCOPE_ADSENSE = 'https://www.googleapis.com/auth/adsense';
|
||||
const SCOPE_ADWORDS = 'https://www.googleapis.com/auth/adwords/';
|
||||
const SCOPE_GAN = 'https://www.googleapis.com/auth/gan'; // google affiliate network...?
|
||||
|
||||
// Google Analytics
|
||||
const SCOPE_ANALYTICS = 'https://www.googleapis.com/auth/analytics';
|
||||
const SCOPE_ANALYTICS_EDIT = 'https://www.googleapis.com/auth/analytics.edit';
|
||||
const SCOPE_ANALYTICS_MANAGE_USERS = 'https://www.googleapis.com/auth/analytics.manage.users';
|
||||
const SCOPE_ANALYTICS_READ_ONLY = 'https://www.googleapis.com/auth/analytics.readonly';
|
||||
// Google Analytics
|
||||
const SCOPE_ANALYTICS = 'https://www.googleapis.com/auth/analytics';
|
||||
const SCOPE_ANALYTICS_EDIT = 'https://www.googleapis.com/auth/analytics.edit';
|
||||
const SCOPE_ANALYTICS_MANAGE_USERS = 'https://www.googleapis.com/auth/analytics.manage.users';
|
||||
const SCOPE_ANALYTICS_READ_ONLY = 'https://www.googleapis.com/auth/analytics.readonly';
|
||||
|
||||
//Gmail
|
||||
const SCOPE_GMAIL_MODIFY = 'https://www.googleapis.com/auth/gmail.modify';
|
||||
const SCOPE_GMAIL_READONLY = 'https://www.googleapis.com/auth/gmail.readonly';
|
||||
const SCOPE_GMAIL_COMPOSE = 'https://www.googleapis.com/auth/gmail.compose';
|
||||
const SCOPE_GMAIL_SEND = 'https://www.googleapis.com/auth/gmail.send';
|
||||
const SCOPE_GMAIL_INSERT = 'https://www.googleapis.com/auth/gmail.insert';
|
||||
const SCOPE_GMAIL_LABELS = 'https://www.googleapis.com/auth/gmail.labels';
|
||||
const SCOPE_GMAIL_FULL = 'https://mail.google.com/';
|
||||
//Gmail
|
||||
const SCOPE_GMAIL_MODIFY = 'https://www.googleapis.com/auth/gmail.modify';
|
||||
const SCOPE_GMAIL_READONLY = 'https://www.googleapis.com/auth/gmail.readonly';
|
||||
const SCOPE_GMAIL_COMPOSE = 'https://www.googleapis.com/auth/gmail.compose';
|
||||
const SCOPE_GMAIL_SEND = 'https://www.googleapis.com/auth/gmail.send';
|
||||
const SCOPE_GMAIL_INSERT = 'https://www.googleapis.com/auth/gmail.insert';
|
||||
const SCOPE_GMAIL_LABELS = 'https://www.googleapis.com/auth/gmail.labels';
|
||||
const SCOPE_GMAIL_FULL = 'https://mail.google.com/';
|
||||
|
||||
// Other services
|
||||
const SCOPE_BOOKS = 'https://www.googleapis.com/auth/books';
|
||||
const SCOPE_BLOGGER = 'https://www.googleapis.com/auth/blogger';
|
||||
const SCOPE_CALENDAR = 'https://www.googleapis.com/auth/calendar';
|
||||
const SCOPE_CALENDAR_READ_ONLY = 'https://www.googleapis.com/auth/calendar.readonly';
|
||||
const SCOPE_CONTACT = 'https://www.google.com/m8/feeds/';
|
||||
const SCOPE_CONTACTS_RO = 'https://www.googleapis.com/auth/contacts.readonly';
|
||||
const SCOPE_CHROMEWEBSTORE = 'https://www.googleapis.com/auth/chromewebstore.readonly';
|
||||
const SCOPE_GMAIL = 'https://mail.google.com/mail/feed/atom';
|
||||
const SCOPE_GMAIL_IMAP_SMTP = 'https://mail.google.com';
|
||||
const SCOPE_PICASAWEB = 'https://picasaweb.google.com/data/';
|
||||
const SCOPE_SITES = 'https://sites.google.com/feeds/';
|
||||
const SCOPE_URLSHORTENER = 'https://www.googleapis.com/auth/urlshortener';
|
||||
const SCOPE_WEBMASTERTOOLS = 'https://www.google.com/webmasters/tools/feeds/';
|
||||
const SCOPE_TASKS = 'https://www.googleapis.com/auth/tasks';
|
||||
// Other services
|
||||
const SCOPE_BOOKS = 'https://www.googleapis.com/auth/books';
|
||||
const SCOPE_BLOGGER = 'https://www.googleapis.com/auth/blogger';
|
||||
const SCOPE_CALENDAR = 'https://www.googleapis.com/auth/calendar';
|
||||
const SCOPE_CALENDAR_READ_ONLY = 'https://www.googleapis.com/auth/calendar.readonly';
|
||||
const SCOPE_CONTACT = 'https://www.google.com/m8/feeds/';
|
||||
const SCOPE_CONTACTS_RO = 'https://www.googleapis.com/auth/contacts.readonly';
|
||||
const SCOPE_CHROMEWEBSTORE = 'https://www.googleapis.com/auth/chromewebstore.readonly';
|
||||
const SCOPE_GMAIL = 'https://mail.google.com/mail/feed/atom';
|
||||
const SCOPE_GMAIL_IMAP_SMTP = 'https://mail.google.com';
|
||||
const SCOPE_PICASAWEB = 'https://picasaweb.google.com/data/';
|
||||
const SCOPE_SITES = 'https://sites.google.com/feeds/';
|
||||
const SCOPE_URLSHORTENER = 'https://www.googleapis.com/auth/urlshortener';
|
||||
const SCOPE_WEBMASTERTOOLS = 'https://www.google.com/webmasters/tools/feeds/';
|
||||
const SCOPE_TASKS = 'https://www.googleapis.com/auth/tasks';
|
||||
|
||||
// Cloud services
|
||||
const SCOPE_CLOUDSTORAGE = 'https://www.googleapis.com/auth/devstorage.read_write';
|
||||
const SCOPE_CONTENTFORSHOPPING = 'https://www.googleapis.com/auth/structuredcontent'; // what even is this
|
||||
const SCOPE_USER_PROVISIONING = 'https://apps-apis.google.com/a/feeds/user/';
|
||||
const SCOPE_GROUPS_PROVISIONING = 'https://apps-apis.google.com/a/feeds/groups/';
|
||||
const SCOPE_NICKNAME_PROVISIONING = 'https://apps-apis.google.com/a/feeds/alias/';
|
||||
// Cloud services
|
||||
const SCOPE_CLOUDSTORAGE = 'https://www.googleapis.com/auth/devstorage.read_write';
|
||||
const SCOPE_CONTENTFORSHOPPING = 'https://www.googleapis.com/auth/structuredcontent'; // what even is this
|
||||
const SCOPE_USER_PROVISIONING = 'https://apps-apis.google.com/a/feeds/user/';
|
||||
const SCOPE_GROUPS_PROVISIONING = 'https://apps-apis.google.com/a/feeds/groups/';
|
||||
const SCOPE_NICKNAME_PROVISIONING = 'https://apps-apis.google.com/a/feeds/alias/';
|
||||
|
||||
// Old
|
||||
const SCOPE_ORKUT = 'https://www.googleapis.com/auth/orkut';
|
||||
const SCOPE_GOOGLELATITUDE =
|
||||
'https://www.googleapis.com/auth/latitude.all.best https://www.googleapis.com/auth/latitude.all.city';
|
||||
const SCOPE_OPENID = 'openid';
|
||||
// Old
|
||||
const SCOPE_ORKUT = 'https://www.googleapis.com/auth/orkut';
|
||||
const SCOPE_GOOGLELATITUDE =
|
||||
'https://www.googleapis.com/auth/latitude.all.best https://www.googleapis.com/auth/latitude.all.city';
|
||||
const SCOPE_OPENID = 'openid';
|
||||
|
||||
// YouTube
|
||||
const SCOPE_YOUTUBE_GDATA = 'https://gdata.youtube.com';
|
||||
const SCOPE_YOUTUBE_ANALYTICS_MONETARY = 'https://www.googleapis.com/auth/yt-analytics-monetary.readonly';
|
||||
const SCOPE_YOUTUBE_ANALYTICS = 'https://www.googleapis.com/auth/yt-analytics.readonly';
|
||||
const SCOPE_YOUTUBE = 'https://www.googleapis.com/auth/youtube';
|
||||
const SCOPE_YOUTUBE_READ_ONLY = 'https://www.googleapis.com/auth/youtube.readonly';
|
||||
const SCOPE_YOUTUBE_UPLOAD = 'https://www.googleapis.com/auth/youtube.upload';
|
||||
const SCOPE_YOUTUBE_PARTNER = 'https://www.googleapis.com/auth/youtubepartner';
|
||||
const SCOPE_YOUTUBE_PARTNER_AUDIT = 'https://www.googleapis.com/auth/youtubepartner-channel-audit';
|
||||
// YouTube
|
||||
const SCOPE_YOUTUBE_GDATA = 'https://gdata.youtube.com';
|
||||
const SCOPE_YOUTUBE_ANALYTICS_MONETARY = 'https://www.googleapis.com/auth/yt-analytics-monetary.readonly';
|
||||
const SCOPE_YOUTUBE_ANALYTICS = 'https://www.googleapis.com/auth/yt-analytics.readonly';
|
||||
const SCOPE_YOUTUBE = 'https://www.googleapis.com/auth/youtube';
|
||||
const SCOPE_YOUTUBE_READ_ONLY = 'https://www.googleapis.com/auth/youtube.readonly';
|
||||
const SCOPE_YOUTUBE_UPLOAD = 'https://www.googleapis.com/auth/youtube.upload';
|
||||
const SCOPE_YOUTUBE_PARTNER = 'https://www.googleapis.com/auth/youtubepartner';
|
||||
const SCOPE_YOUTUBE_PARTNER_AUDIT = 'https://www.googleapis.com/auth/youtubepartner-channel-audit';
|
||||
|
||||
// Google Glass
|
||||
const SCOPE_GLASS_TIMELINE = 'https://www.googleapis.com/auth/glass.timeline';
|
||||
const SCOPE_GLASS_LOCATION = 'https://www.googleapis.com/auth/glass.location';
|
||||
// Google Glass
|
||||
const SCOPE_GLASS_TIMELINE = 'https://www.googleapis.com/auth/glass.timeline';
|
||||
const SCOPE_GLASS_LOCATION = 'https://www.googleapis.com/auth/glass.location';
|
||||
|
||||
// Android Publisher
|
||||
const SCOPE_ANDROID_PUBLISHER = 'https://www.googleapis.com/auth/androidpublisher';
|
||||
// Android Publisher
|
||||
const SCOPE_ANDROID_PUBLISHER = 'https://www.googleapis.com/auth/androidpublisher';
|
||||
|
||||
|
||||
// Google Gsuite
|
||||
// Google Gsuite
|
||||
const SCOPE_ADMIN_DIRECTORY_USER = "https://www.googleapis.com/auth/admin.directory.user";
|
||||
const SCOPE_ADMIN_DIRECTORY_CUSTOMER = "https://www.googleapis.com/auth/admin.directory.customer";
|
||||
|
||||
protected $accessType = 'online';
|
||||
protected $accessType = 'online';
|
||||
|
||||
public function __construct(
|
||||
CredentialsInterface $credentials,
|
||||
ClientInterface $httpClient,
|
||||
TokenStorageInterface $storage,
|
||||
$scopes = array(),
|
||||
UriInterface $baseApiUri = null
|
||||
) {
|
||||
parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri, true);
|
||||
public function __construct(
|
||||
CredentialsInterface $credentials,
|
||||
ClientInterface $httpClient,
|
||||
TokenStorageInterface $storage,
|
||||
$scopes = array(),
|
||||
UriInterface $baseApiUri = null
|
||||
) {
|
||||
parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri, true);
|
||||
|
||||
if (null === $baseApiUri) {
|
||||
$this->baseApiUri = new Uri('https://www.googleapis.com/oauth2/v1/');
|
||||
}
|
||||
}
|
||||
if (null === $baseApiUri) {
|
||||
$this->baseApiUri = new Uri('https://www.googleapis.com/oauth2/v1/');
|
||||
}
|
||||
}
|
||||
|
||||
public function setAccessType($accessType)
|
||||
{
|
||||
if (!in_array($accessType, array('online', 'offline'), true)) {
|
||||
throw new InvalidAccessTypeException('Invalid accessType, expected either online or offline');
|
||||
}
|
||||
$this->accessType = $accessType;
|
||||
}
|
||||
public function setAccessType($accessType)
|
||||
{
|
||||
if (!in_array($accessType, array('online', 'offline'), true)) {
|
||||
throw new InvalidAccessTypeException('Invalid accessType, expected either online or offline');
|
||||
}
|
||||
$this->accessType = $accessType;
|
||||
}
|
||||
|
||||
// LDR CHANGE Add approval_prompt to force the prompt if value is set to 'force' so it force return of a "refresh token" in addition to "standard token"
|
||||
public $approvalPrompt='auto';
|
||||
public function setApprouvalPrompt($prompt)
|
||||
{
|
||||
if (!in_array($prompt, array('auto', 'force'), true)) {
|
||||
// @todo Maybe could we rename this exception
|
||||
throw new InvalidAccessTypeException('Invalid approuvalPrompt, expected either auto or force.');
|
||||
}
|
||||
$this->approvalPrompt = $prompt;
|
||||
}
|
||||
// LDR CHANGE Add approval_prompt to force the prompt if value is set to 'force' so it force return of a "refresh token" in addition to "standard token"
|
||||
public $approvalPrompt='auto';
|
||||
public function setApprouvalPrompt($prompt)
|
||||
{
|
||||
if (!in_array($prompt, array('auto', 'force'), true)) {
|
||||
// @todo Maybe could we rename this exception
|
||||
throw new InvalidAccessTypeException('Invalid approuvalPrompt, expected either auto or force.');
|
||||
}
|
||||
$this->approvalPrompt = $prompt;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getAuthorizationEndpoint()
|
||||
{
|
||||
// LDR CHANGE Add approval_prompt to force the prompt if value is set to 'force' so it force return of a "refresh token" in addition to "standard token"
|
||||
//return new Uri('https://accounts.google.com/o/oauth2/auth?access_type='.$this->accessType);
|
||||
return new Uri('https://accounts.google.com/o/oauth2/auth?'.($this->approvalPrompt?'approval_prompt='.$this->approvalPrompt.'&':'').'access_type='.$this->accessType);
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getAuthorizationEndpoint()
|
||||
{
|
||||
// LDR CHANGE Add approval_prompt to force the prompt if value is set to 'force' so it force return of a "refresh token" in addition to "standard token"
|
||||
//return new Uri('https://accounts.google.com/o/oauth2/auth?access_type='.$this->accessType);
|
||||
$url = 'https://accounts.google.com/o/oauth2/auth?'.($this->approvalPrompt?'approval_prompt='.$this->approvalPrompt.'&':'').'access_type='.$this->accessType;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getAccessTokenEndpoint()
|
||||
{
|
||||
return new Uri('https://accounts.google.com/o/oauth2/token');
|
||||
}
|
||||
return new Uri($url);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function parseAccessTokenResponse($responseBody)
|
||||
{
|
||||
$data = json_decode($responseBody, true);
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getAccessTokenEndpoint()
|
||||
{
|
||||
return new Uri('https://accounts.google.com/o/oauth2/token');
|
||||
}
|
||||
|
||||
if (null === $data || !is_array($data)) {
|
||||
throw new TokenResponseException('Unable to parse response.');
|
||||
} elseif (isset($data['error'])) {
|
||||
throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
|
||||
}
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function parseAccessTokenResponse($responseBody)
|
||||
{
|
||||
$data = json_decode($responseBody, true);
|
||||
|
||||
$token = new StdOAuth2Token();
|
||||
$token->setAccessToken($data['access_token']);
|
||||
$token->setLifetime($data['expires_in']);
|
||||
if (null === $data || !is_array($data)) {
|
||||
throw new TokenResponseException('Unable to parse response.');
|
||||
} elseif (isset($data['error'])) {
|
||||
throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '"');
|
||||
}
|
||||
|
||||
if (isset($data['refresh_token'])) {
|
||||
$token->setRefreshToken($data['refresh_token']);
|
||||
unset($data['refresh_token']);
|
||||
}
|
||||
$token = new StdOAuth2Token();
|
||||
$token->setAccessToken($data['access_token']);
|
||||
$token->setLifetime($data['expires_in']);
|
||||
|
||||
unset($data['access_token']);
|
||||
unset($data['expires_in']);
|
||||
if (isset($data['refresh_token'])) {
|
||||
$token->setRefreshToken($data['refresh_token']);
|
||||
unset($data['refresh_token']);
|
||||
}
|
||||
|
||||
$token->setExtraParams($data);
|
||||
unset($data['access_token']);
|
||||
unset($data['expires_in']);
|
||||
|
||||
return $token;
|
||||
}
|
||||
$token->setExtraParams($data);
|
||||
|
||||
return $token;
|
||||
}
|
||||
}
|
||||
|
||||
97
htdocs/includes/OAuth/OAuth2/Service/WordPress.php
Executable file
97
htdocs/includes/OAuth/OAuth2/Service/WordPress.php
Executable file
@ -0,0 +1,97 @@
|
||||
<?php
|
||||
|
||||
namespace OAuth\OAuth2\Service;
|
||||
|
||||
use OAuth\Common\Consumer\CredentialsInterface;
|
||||
use OAuth\Common\Http\Client\ClientInterface;
|
||||
use OAuth\Common\Http\Uri\UriInterface;
|
||||
use OAuth\Common\Storage\TokenStorageInterface;
|
||||
use OAuth\OAuth2\Token\StdOAuth2Token;
|
||||
use OAuth\Common\Http\Exception\TokenResponseException;
|
||||
use OAuth\OAuth2\Service\Exception\InvalidAccessTypeException;
|
||||
use OAuth\Common\Http\Uri\Uri;
|
||||
|
||||
class WordPress extends AbstractService
|
||||
{
|
||||
protected $accessType = 'online';
|
||||
|
||||
public function __construct(
|
||||
CredentialsInterface $credentials,
|
||||
ClientInterface $httpClient,
|
||||
TokenStorageInterface $storage,
|
||||
$scopes = array(),
|
||||
UriInterface $baseApiUri = null
|
||||
) {
|
||||
parent::__construct($credentials, $httpClient, $storage, $scopes, $baseApiUri, true);
|
||||
|
||||
if (null === $baseApiUri) {
|
||||
$this->baseApiUri = new Uri('https://addresse_de_votre_site_wordpress');
|
||||
}
|
||||
}
|
||||
/*
|
||||
// LDR CHANGE Add approval_prompt to force the prompt if value is set to 'force' so it force return of a "refresh token" in addition to "standard token"
|
||||
public $approvalPrompt='auto';
|
||||
public function setApprouvalPrompt($prompt)
|
||||
{
|
||||
if (!in_array($prompt, array('auto', 'force'), true)) {
|
||||
// @todo Maybe could we rename this exception
|
||||
throw new InvalidAccessTypeException('Invalid approuvalPrompt, expected either auto or force.');
|
||||
}
|
||||
$this->approvalPrompt = $prompt;
|
||||
}*/
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getAuthorizationEndpoint()
|
||||
{
|
||||
return new Uri(sprintf('%s/oauth/authorize', $this->baseApiUri));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getAccessTokenEndpoint()
|
||||
{
|
||||
return new Uri(sprintf('%s/oauth/token', $this->baseApiUri));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getAuthorizationMethod()
|
||||
{
|
||||
global $conf;
|
||||
return empty($conf->global->OAUTH_WORDPRESS_AUTHORIZATION_METHOD_QUERY_STRING) ? static::AUTHORIZATION_METHOD_HEADER_BEARER : static::AUTHORIZATION_METHOD_QUERY_STRING;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function parseAccessTokenResponse($responseBody)
|
||||
{
|
||||
$data = json_decode($responseBody, true);
|
||||
|
||||
if (null === $data || !is_array($data)) {
|
||||
throw new TokenResponseException('Unable to parse response: "'.(isset($responseBody)?$responseBody:'NULL').'"');
|
||||
} elseif (isset($data['error'])) {
|
||||
throw new TokenResponseException('Error in retrieving token: "' . $data['error'] . '" : "'.$data['error_description'].'"');
|
||||
}
|
||||
|
||||
$token = new StdOAuth2Token();
|
||||
$token->setAccessToken($data['access_token']);
|
||||
$token->setLifetime($data['expires_in']);
|
||||
|
||||
if (isset($data['refresh_token'])) {
|
||||
$token->setRefreshToken($data['refresh_token']);
|
||||
unset($data['refresh_token']);
|
||||
}
|
||||
|
||||
unset($data['access_token']);
|
||||
unset($data['expires_in']);
|
||||
|
||||
$token->setExtraParams($data);
|
||||
|
||||
return $token;
|
||||
}
|
||||
}
|
||||
@ -117,6 +117,11 @@ insert into llx_c_action_trigger (code,label,description,elementtype,rang) value
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_SENTBYMAIL','Ticket message sent by email','Executed when a message is sent from the ticket record','ticket',166);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_DELETE','Ticket deleted','Executed when a ticket is deleted','ticket',167);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('USER_SENTBYMAIL','Email sent','Executed when an email is sent from user card','user',300);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('USER_CREATE','User created','Executed when a user is created','user',301);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('USER_MODIFY','User update','Executed when a user is updated','user',302);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('USER_DELETE','User update','Executed when a user is deleted','user',303);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('USER_NEW_PASSWORD','User update','Executed when a user is change password','user',304);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('USER_ENABLEDISABLE','User update','Executed when a user is enable or disable','user',305);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PRODUCT_MODIFY','Product or service modified','Executed when a product or sevice is modified','product',41);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MEMBER_MODIFY','Member modified','Executed when a member is modified','member',23);
|
||||
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('FICHINTER_MODIFY','Intervention modified','Executed when a intervention is modified','ficheinter',19);
|
||||
|
||||
@ -482,3 +482,12 @@ ALTER TABLE llx_inventorydet ADD COLUMN fk_movement integer NULL;
|
||||
ALTER TABLE llx_stock_mouvement MODIFY COLUMN origintype varchar(64);
|
||||
|
||||
ALTER TABLE llx_intracommreport CHANGE COLUMN period periods varchar(32);
|
||||
|
||||
UPDATE llx_rights_def SET perms = 'writeall' WHERE perms = 'writeall_advance' AND module = 'holiday';
|
||||
|
||||
|
||||
INSERT INTO llx_c_action_trigger (code,label,description,elementtype,rang) values ('USER_CREATE','User created','Executed when a user is created','user',301);
|
||||
INSERT INTO llx_c_action_trigger (code,label,description,elementtype,rang) values ('USER_MODIFY','User update','Executed when a user is updated','user',302);
|
||||
INSERT INTO llx_c_action_trigger (code,label,description,elementtype,rang) values ('USER_DELETE','User update','Executed when a user is deleted','user',303);
|
||||
INSERT INTO llx_c_action_trigger (code,label,description,elementtype,rang) values ('USER_NEW_PASSWORD','User update','Executed when a user is change password','user',304);
|
||||
INSERT INTO llx_c_action_trigger (code,label,description,elementtype,rang) values ('USER_ENABLEDISABLE','User update','Executed when a user is enable or disable','user',305);
|
||||
|
||||
41
htdocs/install/mysql/migration/15.0.0-16.0.0.sql
Normal file
41
htdocs/install/mysql/migration/15.0.0-16.0.0.sql
Normal file
@ -0,0 +1,41 @@
|
||||
--
|
||||
-- Be carefull to requests order.
|
||||
-- This file must be loaded by calling /install/index.php page
|
||||
-- when current version is 14.0.0 or higher.
|
||||
--
|
||||
-- To restrict request to Mysql version x.y minimum use -- VMYSQLx.y
|
||||
-- To restrict request to Pgsql version x.y minimum use -- VPGSQLx.y
|
||||
-- To rename a table: ALTER TABLE llx_table RENAME TO llx_table_new;
|
||||
-- To add a column: ALTER TABLE llx_table ADD COLUMN newcol varchar(60) NOT NULL DEFAULT '0' AFTER existingcol;
|
||||
-- To rename a column: ALTER TABLE llx_table CHANGE COLUMN oldname newname varchar(60);
|
||||
-- To drop a column: ALTER TABLE llx_table DROP COLUMN oldname;
|
||||
-- To change type of field: ALTER TABLE llx_table MODIFY COLUMN name varchar(60);
|
||||
-- To drop a foreign key: ALTER TABLE llx_table DROP FOREIGN KEY fk_name;
|
||||
-- To create a unique index ALTER TABLE llx_table ADD UNIQUE INDEX uk_table_field (field);
|
||||
-- To drop an index: -- VMYSQL4.1 DROP INDEX nomindex on llx_table;
|
||||
-- To drop an index: -- VPGSQL8.2 DROP INDEX nomindex;
|
||||
-- To make pk to be auto increment (mysql): -- VMYSQL4.3 ALTER TABLE llx_table CHANGE COLUMN rowid rowid INTEGER NOT NULL AUTO_INCREMENT;
|
||||
-- To make pk to be auto increment (postgres):
|
||||
-- -- VPGSQL8.2 CREATE SEQUENCE llx_table_rowid_seq OWNED BY llx_table.rowid;
|
||||
-- -- VPGSQL8.2 ALTER TABLE llx_table ADD PRIMARY KEY (rowid);
|
||||
-- -- VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN rowid SET DEFAULT nextval('llx_table_rowid_seq');
|
||||
-- -- VPGSQL8.2 SELECT setval('llx_table_rowid_seq', MAX(rowid)) FROM llx_table;
|
||||
-- To set a field as NULL: -- VMYSQL4.3 ALTER TABLE llx_table MODIFY COLUMN name varchar(60) NULL;
|
||||
-- To set a field as NULL: -- VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN name DROP NOT NULL;
|
||||
-- To set a field as NOT NULL: -- VMYSQL4.3 ALTER TABLE llx_table MODIFY COLUMN name varchar(60) NOT NULL;
|
||||
-- To set a field as NOT NULL: -- VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN name SET NOT NULL;
|
||||
-- To set a field as default NULL: -- VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN name SET DEFAULT NULL;
|
||||
-- Note: fields with type BLOB/TEXT can't have default value.
|
||||
-- To rebuild sequence for postgresql after insert by forcing id autoincrement fields:
|
||||
-- -- VPGSQL8.2 SELECT dol_util_rebuild_sequences();
|
||||
|
||||
|
||||
-- Missing in v15 or lower
|
||||
|
||||
UPDATE llx_rights_def SET perms = 'writeall' WHERE perms = 'writeall_advance' AND module = 'holiday';
|
||||
|
||||
|
||||
|
||||
-- v16
|
||||
|
||||
|
||||
@ -1082,7 +1082,7 @@ if ($ok && GETPOST('force_disable_of_modules_not_found', 'alpha')) {
|
||||
$constantname = $obj->name; // Name of constant for hook or js or css declaration
|
||||
|
||||
print '<tr><td>';
|
||||
print $constantname;
|
||||
print dol_escape_htmltag($constantname);
|
||||
|
||||
$db->begin();
|
||||
|
||||
@ -1106,7 +1106,8 @@ if ($ok && GETPOST('force_disable_of_modules_not_found', 'alpha')) {
|
||||
if ($key == 'css') {
|
||||
$value = $obj->value;
|
||||
$valuearray = json_decode($value);
|
||||
if ($value && count($valuearray) == 0) {
|
||||
if ($value && (!is_array($valuearray) || count($valuearray) == 0)) {
|
||||
$valuearray = array();
|
||||
$valuearray[0] = $value; // If value was not a json array but a string
|
||||
}
|
||||
$reloffile = preg_replace('/^\//', '', $valuearray[0]);
|
||||
@ -1117,9 +1118,10 @@ if ($ok && GETPOST('force_disable_of_modules_not_found', 'alpha')) {
|
||||
try {
|
||||
$result = dol_buildpath($reloffile, 0, 2);
|
||||
} catch (Exception $e) {
|
||||
// No catch yet
|
||||
$result = 'found'; // If error, we force lke if we found to avoid any deletion
|
||||
$result = 'found'; // If error, we force like if we found to avoid any deletion
|
||||
}
|
||||
} else {
|
||||
$result = 'found'; //
|
||||
}
|
||||
|
||||
if (!$result) {
|
||||
|
||||
@ -756,7 +756,7 @@ Permission106=Export sendings
|
||||
Permission109=Delete sendings
|
||||
Permission111=Read financial accounts
|
||||
Permission112=Create/modify/delete and compare transactions
|
||||
Permission113=Setup financial accounts (create, manage categories)
|
||||
Permission113=Setup financial accounts (create, manage categories of bank transactions)
|
||||
Permission114=Reconcile transactions
|
||||
Permission115=Export transactions and account statements
|
||||
Permission116=Transfers between accounts
|
||||
@ -893,12 +893,11 @@ Permission701=Read donations
|
||||
Permission702=Create/modify donations
|
||||
Permission703=Delete donations
|
||||
Permission771=Read expense reports (yours and your subordinates)
|
||||
Permission772=Create/modify expense reports
|
||||
Permission772=Create/modify expense reports (for you and your subordinates)
|
||||
Permission773=Delete expense reports
|
||||
Permission774=Read all expense reports (even for user not subordinates)
|
||||
Permission775=Approve expense reports
|
||||
Permission776=Pay expense reports
|
||||
Permission777=Read expense reports of everybody
|
||||
Permission777=Read all expense reports (even those of user not subordinates)
|
||||
Permission778=Create/modify expense reports of everybody
|
||||
Permission779=Export expense reports
|
||||
Permission1001=Read stocks
|
||||
@ -962,15 +961,11 @@ Permission2801=Use FTP client in read mode (browse and download only)
|
||||
Permission2802=Use FTP client in write mode (delete or upload files)
|
||||
Permission3200=Read archived events and fingerprints
|
||||
Permission3301=Generate new modules
|
||||
Permission4001=See employees
|
||||
Permission4002=Create employees
|
||||
Permission4003=Delete employees
|
||||
Permission4004=Export employees
|
||||
Permission4010=Read skill/job/position
|
||||
Permission4011=Create/modify skill/job/position
|
||||
Permission4012=Delete skill/job/position
|
||||
Permission4020=Read evaluation
|
||||
Permission4021=Create/modify evaluation
|
||||
Permission4001=Read skill/job/position
|
||||
Permission4002=Create/modify skill/job/position
|
||||
Permission4003=Delete skill/job/position
|
||||
Permission4020=Read evaluations
|
||||
Permission4021=Create/modify your evaluation
|
||||
Permission4022=Validate evaluation
|
||||
Permission4023=Delete evaluation
|
||||
Permission4030=See comparison menu
|
||||
@ -981,9 +976,9 @@ Permission10005=Delete website content
|
||||
Permission20001=Read leave requests (your leave and those of your subordinates)
|
||||
Permission20002=Create/modify your leave requests (your leave and those of your subordinates)
|
||||
Permission20003=Delete leave requests
|
||||
Permission20004=Read all leave requests (even of user not subordinates)
|
||||
Permission20005=Create/modify leave requests for everybody (even of user not subordinates)
|
||||
Permission20006=Admin leave requests (setup and update balance)
|
||||
Permission20004=Read all leave requests (even those of user not subordinates)
|
||||
Permission20005=Create/modify leave requests for everybody (even those of user not subordinates)
|
||||
Permission20006=Administer leave requests (setup and update balance)
|
||||
Permission20007=Approve leave requests
|
||||
Permission23001=Read Scheduled job
|
||||
Permission23002=Create/update Scheduled job
|
||||
@ -2069,13 +2064,14 @@ EmailCollectorConfirmCollect=Do you want to run the collection for this collecto
|
||||
NoNewEmailToProcess=No new email (matching filters) to process
|
||||
NothingProcessed=Nothing done
|
||||
XEmailsDoneYActionsDone=%s emails qualified, %s emails successfully processed (for %s record/actions done)
|
||||
RecordEvent=Record email event
|
||||
CreateLeadAndThirdParty=Create lead (and third party if necessary)
|
||||
CreateTicketAndThirdParty=Create ticket (and link to third party if it was loaded by a previous operation)
|
||||
RecordEvent=Record an event in agenda (with type Email sent or received)
|
||||
CreateLeadAndThirdParty=Create a lead (and a third party if necessary)
|
||||
CreateTicketAndThirdParty=Create a ticket (linked to a third party if the third party was loaded by a previous operation, with no third party otherwise)
|
||||
CodeLastResult=Latest result code
|
||||
NbOfEmailsInInbox=Number of emails in source directory
|
||||
LoadThirdPartyFromName=Load third party searching on %s (load only)
|
||||
LoadThirdPartyFromNameOrCreate=Load third party searching on %s (create if not found)
|
||||
AttachJoinedDocumentsToObject=Save attached files into object documents if a ref of an object is found into email topic.
|
||||
WithDolTrackingID=Message from a conversation initiated by a first email sent from Dolibarr
|
||||
WithoutDolTrackingID=Message from a conversation initiated by a first email NOT sent from Dolibarr
|
||||
WithDolTrackingIDInMsgId=Message sent from Dolibarr
|
||||
@ -2084,7 +2080,7 @@ CreateCandidature=Create job application
|
||||
FormatZip=Zip
|
||||
MainMenuCode=Menu entry code (mainmenu)
|
||||
ECMAutoTree=Show automatic ECM tree
|
||||
OperationParamDesc=Define the values to use for the object of the action, or how to extract values. For example:<br>objproperty1=SET:the value to set<br>objproperty2=SET:a value with replacement of __objproperty1__<br>objproperty3=SETIFEMPTY:value used if objproperty3 is not already defined<br>objproperty4=EXTRACT:HEADER:X-Myheaderkey:\\s*([^\\s]*)<br>options_myextrafield1=EXTRACT:SUBJECT:([^\n]*)<br>object.objproperty5=EXTRACT:BODY:My company name is\\s([^\\s]*)<br><br>Use a ; char as separator to extract or set several properties.
|
||||
OperationParamDesc=Define the rules to use to extract or set values.<br>Example for operations that need to extract a name from email subject:<br>name=EXTRACT:SUBJECT:Message from company ([^\n]*)<br>Example for operations that create objects:<br>objproperty1=SET:the value to set<br>objproperty2=SET:a value including value of __objproperty1__<br>objproperty3=SETIFEMPTY:value used if objproperty3 is not already defined<br>objproperty4=EXTRACT:HEADER:X-Myheaderkey:\\s*([^\\s]*)<br>options_myextrafield1=EXTRACT:SUBJECT:([^\n]*)<br>object.objproperty5=EXTRACT:BODY:My company name is\\s([^\\s]*)<br><br>Use a ; char as separator to extract or set several properties.
|
||||
OpeningHours=Opening hours
|
||||
OpeningHoursDesc=Enter here the regular opening hours of your company.
|
||||
ResourceSetup=Configuration of Resource module
|
||||
@ -2130,7 +2126,7 @@ LargerThan=Larger than
|
||||
IfTrackingIDFoundEventWillBeLinked=Note that If a tracking ID of an object is found into email, or if the email is an answer of an email aready collected and linked to an object, the created event will be automatically linked to the known related object.
|
||||
WithGMailYouCanCreateADedicatedPassword=With a GMail account, if you enabled the 2 steps validation, it is recommanded to create a dedicated second password for the application instead of using your own account passsword from https://myaccount.google.com/.
|
||||
EmailCollectorTargetDir=It may be a desired behaviour to move the email into another tag/directory when it was processed successfully. Just set name of directory here to use this feature (Do NOT use special characters in name). Note that you must also use a read/write login account.
|
||||
EmailCollectorLoadThirdPartyHelp=You can use this action to use the email content to find and load an existing thirdparty in your database. The found (or created) thirdparty will be used for following actions that need it.<br>For example, if you want to create a thirdparty with a name extracted a string 'Name: name to find' found into the body, use sender email as email, you can set the parameter field like this:<br>'email=HEADER:^From:(.*);name=EXTRACT:BODY:Name:\\s([^\\s]*);client=SET:2;'<br>
|
||||
EmailCollectorLoadThirdPartyHelp=You can use this action to use the email content to find and load an existing thirdparty in your database. The found (or created) thirdparty will be used for following actions that need it.<br>For example, if you want to create a thirdparty with a name extracted from a string 'Name: name to find' present into the body, use the sender email as email, you can set the parameter field like this:<br>'email=HEADER:^From:(.*);name=EXTRACT:BODY:Name:\\s([^\\s]*);client=SET:2;'<br>
|
||||
EndPointFor=End point for %s : %s
|
||||
DeleteEmailCollector=Delete email collector
|
||||
ConfirmDeleteEmailCollector=Are you sure you want to delete this email collector?
|
||||
@ -2219,3 +2215,4 @@ MissingTranslationForConfKey = Missing translation for %s
|
||||
NativeModules=Native modules
|
||||
NoDeployedModulesFoundWithThisSearchCriteria=No modules found for these search criteria
|
||||
API_DISABLE_COMPRESSION=Disable compression of API responses
|
||||
EachTerminalHasItsOwnCounter=Each terminal use its own counter.
|
||||
|
||||
@ -157,15 +157,15 @@ ProfId3CL=-
|
||||
ProfId4CL=-
|
||||
ProfId5CL=-
|
||||
ProfId6CL=-
|
||||
ProfId1CM=Id. prof. 1 (Registre de Commerce)
|
||||
ProfId2CM=Id. prof. 2 (N° Contribuable)
|
||||
ProfId3CM=Id. prof. 3 (N° Arrêté de création)
|
||||
ProfId1CM=Id. prof. 1 (Trade Register)
|
||||
ProfId2CM=Id. prof. 2 (Taxpayer No.)
|
||||
ProfId3CM=Id. prof. 3 (Decree of creation)
|
||||
ProfId4CM=-
|
||||
ProfId5CM=-
|
||||
ProfId6CM=-
|
||||
ProfId1ShortCM=Registre de Commerce
|
||||
ProfId2ShortCM=N° Contribuable
|
||||
ProfId3ShortCM=N° Arrêté de création
|
||||
ProfId1ShortCM=Trade Register
|
||||
ProfId2ShortCM=Taxpayer No.
|
||||
ProfId3ShortCM=Decree of creation
|
||||
ProfId4ShortCM=-
|
||||
ProfId5ShortCM=-
|
||||
ProfId6ShortCM=-
|
||||
@ -381,7 +381,7 @@ VATIntraCheck=Check
|
||||
VATIntraCheckDesc=The VAT ID must include the country prefix. The link <b>%s</b> uses the European VAT checker service (VIES) which requires internet access from the Dolibarr server.
|
||||
VATIntraCheckURL=http://ec.europa.eu/taxation_customs/vies/vieshome.do
|
||||
VATIntraCheckableOnEUSite=Check the intra-Community VAT ID on the European Commission website
|
||||
VATIntraManualCheck=You can also check manually on the European Commission website <a href="%s" target="_blank">%s</a>
|
||||
VATIntraManualCheck=You can also check manually on the European Commission website <a href="%s" target="_blank" rel="noopener noreferrer">%s</a>
|
||||
ErrorVATCheckMS_UNAVAILABLE=Check not possible. Check service is not provided by the member state (%s).
|
||||
NorProspectNorCustomer=Not prospect, nor customer
|
||||
JuridicalStatus=Business entity type
|
||||
|
||||
@ -273,6 +273,7 @@ ErrorWrongFileName=Name of the file cannot have __SOMETHING__ in it
|
||||
ErrorNotInDictionaryPaymentConditions=Not in Payment Terms Dictionary, please modify.
|
||||
ErrorIsNotADraft=%s is not a draft
|
||||
ErrorExecIdFailed=Can't execute command "id"
|
||||
ErrorBadCharIntoLoginName=Unauthorized character in the login name
|
||||
|
||||
# Warnings
|
||||
WarningParamUploadMaxFileSizeHigherThanPostMaxSize=Your PHP parameter upload_max_filesize (%s) is higher than PHP parameter post_max_size (%s). This is not a consistent setup.
|
||||
|
||||
@ -212,6 +212,8 @@ User=User
|
||||
Users=Users
|
||||
Group=Group
|
||||
Groups=Groups
|
||||
UserGroup=User group
|
||||
UserGroups=User groups
|
||||
NoUserGroupDefined=No user group defined
|
||||
Password=Password
|
||||
PasswordRetype=Retype your password
|
||||
|
||||
@ -258,6 +258,10 @@ PassEncoding=Password encoding
|
||||
PermissionsAdd=Permissions added
|
||||
PermissionsDelete=Permissions removed
|
||||
YourPasswordMustHaveAtLeastXChars=Your password must have at least <strong>%s</strong> chars
|
||||
PasswordNeedAtLeastXUpperCaseChars=The password need at least <strong>%s</strong> upper case chars
|
||||
PasswordNeedAtLeastXDigitChars=The password need at least <strong>%s</strong> numeric chars
|
||||
PasswordNeedAtLeastXSpecialChars=The password need at least <strong>%s</strong> special chars
|
||||
PasswordNeedNoXConsecutiveChars=The password must not have <strong>%s</strong> consecutive similar chars
|
||||
YourPasswordHasBeenReset=Your password has been reset successfully
|
||||
ApplicantIpAddress=IP address of applicant
|
||||
SMSSentTo=SMS sent to %s
|
||||
|
||||
@ -284,3 +284,4 @@ PROJECT_CLASSIFY_CLOSED_WHEN_ALL_TASKS_DONE_help=Note: existing projects with al
|
||||
SelectLinesOfTimeSpentToInvoice=Select lines of time spent that are unbilled, then bulk action "Generate Invoice" to bill them
|
||||
ProjectTasksWithoutTimeSpent=Project tasks without time spent
|
||||
FormForNewLeadDesc=Thanks to fill the following form to contact us. You can also send us an email directly to <b>%s</b>.
|
||||
StartDateCannotBeAfterEndDate=End date cannot be before start date
|
||||
|
||||
@ -15,6 +15,7 @@ BankTransferReceipt=Credit transfer order
|
||||
LatestBankTransferReceipts=Latest %s credit transfer orders
|
||||
LastWithdrawalReceipts=Latest %s direct debit files
|
||||
WithdrawalsLine=Direct debit order line
|
||||
CreditTransfer=Credit transfer
|
||||
CreditTransferLine=Credit transfer line
|
||||
WithdrawalsLines=Direct debit order lines
|
||||
CreditTransferLines=Credit transfer lines
|
||||
@ -47,6 +48,7 @@ ThirdPartyBankCode=Third-party bank code
|
||||
NoInvoiceCouldBeWithdrawed=No invoice debited successfully. Check that invoices are on companies with a valid IBAN and that IBAN has a UMR (Unique Mandate Reference) with mode <strong>%s</strong>.
|
||||
WithdrawalCantBeCreditedTwice=This withdrawal receipt is already marked as credited; this can't be done twice, as this would potentially create duplicate payments and bank entries.
|
||||
ClassCredited=Classify credited
|
||||
ClassDebited=Classify debited
|
||||
ClassCreditedConfirm=Are you sure you want to classify this withdrawal receipt as credited on your bank account?
|
||||
TransData=Transmission date
|
||||
TransMetod=Transmission method
|
||||
|
||||
@ -756,7 +756,7 @@ Permission106=Export sendings
|
||||
Permission109=Delete sendings
|
||||
Permission111=Read financial accounts
|
||||
Permission112=Create/modify/delete and compare transactions
|
||||
Permission113=Setup financial accounts (create, manage categories)
|
||||
Permission113=Setup financial accounts (create, manage categories of bank transactions)
|
||||
Permission114=Reconcile transactions
|
||||
Permission115=Export transactions and account statements
|
||||
Permission116=Transfers between accounts
|
||||
@ -893,12 +893,11 @@ Permission701=Read donations
|
||||
Permission702=Create/modify donations
|
||||
Permission703=Delete donations
|
||||
Permission771=Read expense reports (yours and your subordinates)
|
||||
Permission772=Create/modify expense reports
|
||||
Permission772=Create/modify expense reports (for you and your subordinates)
|
||||
Permission773=Delete expense reports
|
||||
Permission774=Read all expense reports (even for user not subordinates)
|
||||
Permission775=Approve expense reports
|
||||
Permission776=Pay expense reports
|
||||
Permission777=Read expense reports of everybody
|
||||
Permission777=Read all expense reports (even those of user not subordinates)
|
||||
Permission778=Create/modify expense reports of everybody
|
||||
Permission779=Export expense reports
|
||||
Permission1001=Read stocks
|
||||
@ -962,15 +961,11 @@ Permission2801=Use FTP client in read mode (browse and download only)
|
||||
Permission2802=Use FTP client in write mode (delete or upload files)
|
||||
Permission3200=Read archived events and fingerprints
|
||||
Permission3301=Generate new modules
|
||||
Permission4001=See employees
|
||||
Permission4002=Create employees
|
||||
Permission4003=Delete employees
|
||||
Permission4004=Export employees
|
||||
Permission4010=Read skill/job/position
|
||||
Permission4011=Create/modify skill/job/position
|
||||
Permission4012=Delete skill/job/position
|
||||
Permission4020=Read evaluation
|
||||
Permission4021=Create/modify evaluation
|
||||
Permission4001=Read skill/job/position
|
||||
Permission4002=Create/modify skill/job/position
|
||||
Permission4003=Delete skill/job/position
|
||||
Permission4020=Read evaluations
|
||||
Permission4021=Create/modify your evaluation
|
||||
Permission4022=Validate evaluation
|
||||
Permission4023=Delete evaluation
|
||||
Permission4030=See comparison menu
|
||||
@ -981,9 +976,9 @@ Permission10005=Delete website content
|
||||
Permission20001=Read leave requests (your leave and those of your subordinates)
|
||||
Permission20002=Create/modify your leave requests (your leave and those of your subordinates)
|
||||
Permission20003=Delete leave requests
|
||||
Permission20004=Read all leave requests (even of user not subordinates)
|
||||
Permission20005=Create/modify leave requests for everybody (even of user not subordinates)
|
||||
Permission20006=Admin leave requests (setup and update balance)
|
||||
Permission20004=Read all leave requests (even those of user not subordinates)
|
||||
Permission20005=Create/modify leave requests for everybody (even those of user not subordinates)
|
||||
Permission20006=Administer leave requests (setup and update balance)
|
||||
Permission20007=Approve leave requests
|
||||
Permission23001=Read Scheduled job
|
||||
Permission23002=Create/update Scheduled job
|
||||
@ -2069,13 +2064,14 @@ EmailCollectorConfirmCollect=Do you want to run the collection for this collecto
|
||||
NoNewEmailToProcess=No new email (matching filters) to process
|
||||
NothingProcessed=Nothing done
|
||||
XEmailsDoneYActionsDone=%s emails qualified, %s emails successfully processed (for %s record/actions done)
|
||||
RecordEvent=Record email event
|
||||
CreateLeadAndThirdParty=Create lead (and third party if necessary)
|
||||
CreateTicketAndThirdParty=Create ticket (and link to third party if it was loaded by a previous operation)
|
||||
RecordEvent=Record an event in agenda (with type Email sent or received)
|
||||
CreateLeadAndThirdParty=Create a lead (and a third party if necessary)
|
||||
CreateTicketAndThirdParty=Create a ticket (linked to a third party if the third party was loaded by a previous operation, with no third party otherwise)
|
||||
CodeLastResult=Latest result code
|
||||
NbOfEmailsInInbox=Number of emails in source directory
|
||||
LoadThirdPartyFromName=Load third party searching on %s (load only)
|
||||
LoadThirdPartyFromNameOrCreate=Load third party searching on %s (create if not found)
|
||||
AttachJoinedDocumentsToObject=Save attached files into object documents if a ref of an object is found into email topic.
|
||||
WithDolTrackingID=Message from a conversation initiated by a first email sent from Dolibarr
|
||||
WithoutDolTrackingID=Message from a conversation initiated by a first email NOT sent from Dolibarr
|
||||
WithDolTrackingIDInMsgId=Message sent from Dolibarr
|
||||
@ -2084,7 +2080,7 @@ CreateCandidature=Create job application
|
||||
FormatZip=Zip
|
||||
MainMenuCode=Menu entry code (mainmenu)
|
||||
ECMAutoTree=Show automatic ECM tree
|
||||
OperationParamDesc=Define the values to use for the object of the action, or how to extract values. For example:<br>objproperty1=SET:the value to set<br>objproperty2=SET:a value with replacement of __objproperty1__<br>objproperty3=SETIFEMPTY:value used if objproperty3 is not already defined<br>objproperty4=EXTRACT:HEADER:X-Myheaderkey:\\s*([^\\s]*)<br>options_myextrafield1=EXTRACT:SUBJECT:([^\n]*)<br>object.objproperty5=EXTRACT:BODY:My company name is\\s([^\\s]*)<br><br>Use a ; char as separator to extract or set several properties.
|
||||
OperationParamDesc=Define the rules to use to extract or set values.<br>Example for operations that need to extract a name from email subject:<br>name=EXTRACT:SUBJECT:Message from company ([^\n]*)<br>Example for operations that create objects:<br>objproperty1=SET:the value to set<br>objproperty2=SET:a value including value of __objproperty1__<br>objproperty3=SETIFEMPTY:value used if objproperty3 is not already defined<br>objproperty4=EXTRACT:HEADER:X-Myheaderkey:\\s*([^\\s]*)<br>options_myextrafield1=EXTRACT:SUBJECT:([^\n]*)<br>object.objproperty5=EXTRACT:BODY:My company name is\\s([^\\s]*)<br><br>Use a ; char as separator to extract or set several properties.
|
||||
OpeningHours=Opening hours
|
||||
OpeningHoursDesc=Enter here the regular opening hours of your company.
|
||||
ResourceSetup=Configuration of Resource module
|
||||
@ -2130,7 +2126,7 @@ LargerThan=Larger than
|
||||
IfTrackingIDFoundEventWillBeLinked=Note that If a tracking ID of an object is found into email, or if the email is an answer of an email aready collected and linked to an object, the created event will be automatically linked to the known related object.
|
||||
WithGMailYouCanCreateADedicatedPassword=With a GMail account, if you enabled the 2 steps validation, it is recommanded to create a dedicated second password for the application instead of using your own account passsword from https://myaccount.google.com/.
|
||||
EmailCollectorTargetDir=It may be a desired behaviour to move the email into another tag/directory when it was processed successfully. Just set name of directory here to use this feature (Do NOT use special characters in name). Note that you must also use a read/write login account.
|
||||
EmailCollectorLoadThirdPartyHelp=You can use this action to use the email content to find and load an existing thirdparty in your database. The found (or created) thirdparty will be used for following actions that need it.<br>For example, if you want to create a thirdparty with a name extracted a string 'Name: name to find' found into the body, use sender email as email, you can set the parameter field like this:<br>'email=HEADER:^From:(.*);name=EXTRACT:BODY:Name:\\s([^\\s]*);client=SET:2;'<br>
|
||||
EmailCollectorLoadThirdPartyHelp=You can use this action to use the email content to find and load an existing thirdparty in your database. The found (or created) thirdparty will be used for following actions that need it.<br>For example, if you want to create a thirdparty with a name extracted from a string 'Name: name to find' present into the body, use the sender email as email, you can set the parameter field like this:<br>'email=HEADER:^From:(.*);name=EXTRACT:BODY:Name:\\s([^\\s]*);client=SET:2;'<br>
|
||||
EndPointFor=End point for %s : %s
|
||||
DeleteEmailCollector=Delete email collector
|
||||
ConfirmDeleteEmailCollector=Are you sure you want to delete this email collector?
|
||||
@ -2219,3 +2215,4 @@ MissingTranslationForConfKey = Missing translation for %s
|
||||
NativeModules=Native modules
|
||||
NoDeployedModulesFoundWithThisSearchCriteria=No modules found for these search criteria
|
||||
API_DISABLE_COMPRESSION=Disable compression of API responses
|
||||
EachTerminalHasItsOwnCounter=Each terminal use its own counter.
|
||||
|
||||
@ -157,6 +157,18 @@ ProfId3CL=-
|
||||
ProfId4CL=-
|
||||
ProfId5CL=-
|
||||
ProfId6CL=-
|
||||
ProfId1CM=Id. prof. 1 (Trade Register)
|
||||
ProfId2CM=Id. prof. 2 (Taxpayer No.)
|
||||
ProfId3CM=Id. prof. 3 (Decree of creation)
|
||||
ProfId4CM=-
|
||||
ProfId5CM=-
|
||||
ProfId6CM=-
|
||||
ProfId1ShortCM=Trade Register
|
||||
ProfId2ShortCM=Taxpayer No.
|
||||
ProfId3ShortCM=Decree of creation
|
||||
ProfId4ShortCM=-
|
||||
ProfId5ShortCM=-
|
||||
ProfId6ShortCM=-
|
||||
ProfId1CO=Prof Id 1 (R.U.T.)
|
||||
ProfId2CO=-
|
||||
ProfId3CO=-
|
||||
@ -369,7 +381,7 @@ VATIntraCheck=Check
|
||||
VATIntraCheckDesc=The VAT ID must include the country prefix. The link <b>%s</b> uses the European VAT checker service (VIES) which requires internet access from the Dolibarr server.
|
||||
VATIntraCheckURL=http://ec.europa.eu/taxation_customs/vies/vieshome.do
|
||||
VATIntraCheckableOnEUSite=Check the intra-Community VAT ID on the European Commission website
|
||||
VATIntraManualCheck=You can also check manually on the European Commission website <a href="%s" target="_blank">%s</a>
|
||||
VATIntraManualCheck=You can also check manually on the European Commission website <a href="%s" target="_blank" rel="noopener noreferrer">%s</a>
|
||||
ErrorVATCheckMS_UNAVAILABLE=Check not possible. Check service is not provided by the member state (%s).
|
||||
NorProspectNorCustomer=Not prospect, nor customer
|
||||
JuridicalStatus=Business entity type
|
||||
|
||||
@ -273,6 +273,7 @@ ErrorWrongFileName=Name of the file cannot have __SOMETHING__ in it
|
||||
ErrorNotInDictionaryPaymentConditions=Not in Payment Terms Dictionary, please modify.
|
||||
ErrorIsNotADraft=%s is not a draft
|
||||
ErrorExecIdFailed=Can't execute command "id"
|
||||
ErrorBadCharIntoLoginName=Unauthorized character in the login name
|
||||
|
||||
# Warnings
|
||||
WarningParamUploadMaxFileSizeHigherThanPostMaxSize=Your PHP parameter upload_max_filesize (%s) is higher than PHP parameter post_max_size (%s). This is not a consistent setup.
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user