FIX resolve conflicts

This commit is contained in:
lvessiller 2022-08-10 18:10:17 +02:00
commit 8a910e6cef
54 changed files with 701 additions and 341 deletions

View File

@ -52,7 +52,7 @@ Ace 1.4.14 BSD Yes
ChartJS 3.7.1 MIT License Yes JS library for graph ChartJS 3.7.1 MIT License Yes JS library for graph
CKEditor 4.18 LGPL-2.1+ Yes Editor WYSIWYG CKEditor 4.18 LGPL-2.1+ Yes Editor WYSIWYG
jQuery 3.6.0 MIT License Yes JS library jQuery 3.6.0 MIT License Yes JS library
jQuery UI 1.13.1 GPL and MIT License Yes JS library plugin UI jQuery UI 1.13.2 GPL and MIT License Yes JS library plugin UI
jQuery select2 4.0.13 GPL and Apache License Yes JS library plugin for sexier multiselect. Warning: 4.0.6+ create troubles without patching css jQuery select2 4.0.13 GPL and Apache License Yes JS library plugin for sexier multiselect. Warning: 4.0.6+ create troubles without patching css
jQuery blockUI 2.70.0 GPL and MIT License Yes JS library plugin blockUI (to use ajax popups) jQuery blockUI 2.70.0 GPL and MIT License Yes JS library plugin blockUI (to use ajax popups)
jQuery Colorpicker 1.1 MIT License Yes JS library for color picker for a defined list of colors jQuery Colorpicker 1.1 MIT License Yes JS library for color picker for a defined list of colors

View File

@ -49,7 +49,7 @@ if (empty($user->rights->accounting->mouvements->lire)) {
if (empty($conf->comptabilite->enabled) && empty($conf->accounting->enabled) && empty($conf->asset->enabled) && empty($conf->intracommreport->enabled)) { if (empty($conf->comptabilite->enabled) && empty($conf->accounting->enabled) && empty($conf->asset->enabled) && empty($conf->intracommreport->enabled)) {
accessforbidden(); accessforbidden();
} }
if (empty($user->rights->compta->resultat->lire) && empty($user->rights->accounting->comptarapport->lire) && empty($user->rights->accounting->mouvements->lire) && empty($user->rights->asset->read) && empty($user->rights->intracommreport->read)) { if (empty($user->hasRight('compta', 'resultat', 'lire')) && empty($user->hasRight('accounting', 'comptarapport', 'lire')) && empty($user->hasRight('accounting', 'mouvements', 'lire')) && empty($user->hasRight('asset', 'read')) && empty($user->hasRight('intracommreport', 'read'))) {
accessforbidden(); accessforbidden();
} }

View File

@ -40,6 +40,7 @@ require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php';
require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
@ -311,8 +312,8 @@ if (empty($reshook)) {
//$object->twitter = trim(GETPOST("twitter", 'alpha')); //$object->twitter = trim(GETPOST("twitter", 'alpha'));
//$object->facebook = trim(GETPOST("facebook", 'alpha')); //$object->facebook = trim(GETPOST("facebook", 'alpha'));
//$object->linkedin = trim(GETPOST("linkedin", 'alpha')); //$object->linkedin = trim(GETPOST("linkedin", 'alpha'));
$object->birth = $birthdate; $object->birth = $birthdate;
$object->default_lang = GETPOST('default_lang', 'alpha');
$object->typeid = GETPOST("typeid", 'int'); $object->typeid = GETPOST("typeid", 'int');
//$object->note = trim(GETPOST("comment","alpha")); //$object->note = trim(GETPOST("comment","alpha"));
$object->morphy = GETPOST("morphy", 'alpha'); $object->morphy = GETPOST("morphy", 'alpha');
@ -457,6 +458,7 @@ if (empty($reshook)) {
$userid = GETPOST("userid", 'int'); $userid = GETPOST("userid", 'int');
$socid = GETPOST("socid", 'int'); $socid = GETPOST("socid", 'int');
$default_lang = GETPOST('default_lang', 'alpha');
$object->civility_id = $civility_id; $object->civility_id = $civility_id;
$object->firstname = $firstname; $object->firstname = $firstname;
@ -498,7 +500,7 @@ if (empty($reshook)) {
$object->user_id = $userid; $object->user_id = $userid;
$object->socid = $socid; $object->socid = $socid;
$object->public = $public; $object->public = $public;
$object->default_lang = $default_lang;
// Fill array 'array_options' with data from add form // Fill array 'array_options' with data from add form
$ret = $extrafields->setOptionalsFromPost(null, $object); $ret = $extrafields->setOptionalsFromPost(null, $object);
if ($ret < 0) { if ($ret < 0) {
@ -899,6 +901,7 @@ if (empty($reshook)) {
$form = new Form($db); $form = new Form($db);
$formfile = new FormFile($db); $formfile = new FormFile($db);
$formadmin = new FormAdmin($db);
$formcompany = new FormCompany($db); $formcompany = new FormCompany($db);
$title = $langs->trans("Member")." - ".$langs->trans("Card"); $title = $langs->trans("Member")." - ".$langs->trans("Card");
@ -1363,6 +1366,14 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
print $form->selectDate(($object->birth ? $object->birth : -1), 'birth', '', '', 1, 'formsoc'); print $form->selectDate(($object->birth ? $object->birth : -1), 'birth', '', '', 1, 'formsoc');
print "</td></tr>\n"; print "</td></tr>\n";
// Default language
if (!empty($conf->global->MAIN_MULTILANGS)) {
print '<tr><td>'.$form->editfieldkey('DefaultLang', 'default_lang', '', $object, 0).'</td><td colspan="3">'."\n";
print img_picto('', 'language').$formadmin->select_language($object->default_lang, 'default_lang', 0, 0, 1);
print '</td>';
print '</tr>';
}
// Public profil // Public profil
print "<tr><td>".$langs->trans("Public")."</td><td>\n"; print "<tr><td>".$langs->trans("Public")."</td><td>\n";
print $form->selectyesno("public", (GETPOSTISSET("public") ? GETPOST("public", 'alphanohtml', 2) : $object->public), 1); print $form->selectyesno("public", (GETPOSTISSET("public") ? GETPOST("public", 'alphanohtml', 2) : $object->public), 1);
@ -1803,6 +1814,19 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
// Birth Date // Birth Date
print '<tr><td class="titlefield">'.$langs->trans("DateOfBirth").'</td><td class="valeur">'.dol_print_date($object->birth, 'day').'</td></tr>'; print '<tr><td class="titlefield">'.$langs->trans("DateOfBirth").'</td><td class="valeur">'.dol_print_date($object->birth, 'day').'</td></tr>';
// Default language
if (!empty($conf->global->MAIN_MULTILANGS)) {
require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
print '<tr><td>'.$langs->trans("DefaultLang").'</td><td>';
//$s=picto_from_langcode($object->default_lang);
//print ($s?$s.' ':'');
$langs->load("languages");
$labellang = ($object->default_lang ? $langs->trans('Language_'.$object->default_lang) : '');
print picto_from_langcode($object->default_lang, 'class="paddingrightonly saturatemedium opacitylow"');
print $labellang;
print '</td></tr>';
}
// Public // Public
print '<tr><td>'.$langs->trans("Public").'</td><td class="valeur">'.yn($object->public).'</td></tr>'; print '<tr><td>'.$langs->trans("Public").'</td><td class="valeur">'.yn($object->public).'</td></tr>';

View File

@ -215,6 +215,12 @@ class Adherent extends CommonObject
*/ */
public $public; public $public;
/**
* Default language code of member (en_US, ...)
* @var string
*/
public $default_lang;
/** /**
* @var string photo of member * @var string photo of member
*/ */
@ -328,6 +334,7 @@ class Adherent extends CommonObject
'photo' => array('type' => 'varchar(255)', 'label' => 'Photo', 'enabled' => 1, 'visible' => -1, 'position' => 135), 'photo' => array('type' => 'varchar(255)', 'label' => 'Photo', 'enabled' => 1, 'visible' => -1, 'position' => 135),
'public' => array('type' => 'smallint(6)', 'label' => 'Public', 'enabled' => 1, 'visible' => -1, 'notnull' => 1, 'position' => 145), 'public' => array('type' => 'smallint(6)', 'label' => 'Public', 'enabled' => 1, 'visible' => -1, 'notnull' => 1, 'position' => 145),
'datefin' => array('type' => 'datetime', 'label' => 'DateEnd', 'enabled' => 1, 'visible' => -1, 'position' => 150), 'datefin' => array('type' => 'datetime', 'label' => 'DateEnd', 'enabled' => 1, 'visible' => -1, 'position' => 150),
'default_lang' =>array('type'=>'varchar(6)', 'label'=>'Default lang', 'enabled'=>1, 'visible'=>-1, 'position'=> 153),
'note_private' => array('type' => 'text', 'label' => 'NotePublic', 'enabled' => 1, 'visible' => 0, 'position' => 155), 'note_private' => array('type' => 'text', 'label' => 'NotePublic', 'enabled' => 1, 'visible' => 0, 'position' => 155),
'note_public' => array('type' => 'text', 'label' => 'NotePrivate', 'enabled' => 1, 'visible' => 0, 'position' => 160), 'note_public' => array('type' => 'text', 'label' => 'NotePrivate', 'enabled' => 1, 'visible' => 0, 'position' => 160),
'datevalid' => array('type' => 'datetime', 'label' => 'DateValidation', 'enabled' => 1, 'visible' => -1, 'position' => 165), 'datevalid' => array('type' => 'datetime', 'label' => 'DateValidation', 'enabled' => 1, 'visible' => -1, 'position' => 165),
@ -710,9 +717,11 @@ class Adherent extends CommonObject
$sql .= ", photo = ".($this->photo ? "'".$this->db->escape($this->photo)."'" : "null"); $sql .= ", photo = ".($this->photo ? "'".$this->db->escape($this->photo)."'" : "null");
$sql .= ", public = '".$this->db->escape($this->public)."'"; $sql .= ", public = '".$this->db->escape($this->public)."'";
$sql .= ", statut = ".$this->db->escape($this->statut); $sql .= ", statut = ".$this->db->escape($this->statut);
$sql .= ", default_lang = ".(!empty($this->default_lang) ? "'".$this->db->escape($this->default_lang)."'" : "null");
$sql .= ", fk_adherent_type = ".$this->db->escape($this->typeid); $sql .= ", fk_adherent_type = ".$this->db->escape($this->typeid);
$sql .= ", morphy = '".$this->db->escape($this->morphy)."'"; $sql .= ", morphy = '".$this->db->escape($this->morphy)."'";
$sql .= ", birth = ".($this->birth ? "'".$this->db->idate($this->birth)."'" : "null"); $sql .= ", birth = ".($this->birth ? "'".$this->db->idate($this->birth)."'" : "null");
if ($this->datefin) { if ($this->datefin) {
$sql .= ", datefin = '".$this->db->idate($this->datefin)."'"; // Must be modified only when deleting a subscription $sql .= ", datefin = '".$this->db->idate($this->datefin)."'"; // Must be modified only when deleting a subscription
} }
@ -833,6 +842,8 @@ class Adherent extends CommonObject
$luser->office_phone = $this->phone; $luser->office_phone = $this->phone;
$luser->user_mobile = $this->phone_mobile; $luser->user_mobile = $this->phone_mobile;
$luser->lang = $this->default_lang;
$luser->fk_member = $this->id; $luser->fk_member = $this->id;
$result = $luser->update($user, 0, 1, 1); // Use nosync to 1 to avoid cyclic updates $result = $luser->update($user, 0, 1, 1); // Use nosync to 1 to avoid cyclic updates
@ -868,6 +879,7 @@ class Adherent extends CommonObject
$lthirdparty->state_id = $this->state_id; $lthirdparty->state_id = $this->state_id;
$lthirdparty->country_id = $this->country_id; $lthirdparty->country_id = $this->country_id;
//$lthirdparty->phone_mobile=$this->phone_mobile; //$lthirdparty->phone_mobile=$this->phone_mobile;
$lthirdparty->default_lang = $this->default_lang;
$result = $lthirdparty->update($this->fk_soc, $user, 0, 1, 1, 'update'); // Use sync to 0 to avoid cyclic updates $result = $lthirdparty->update($this->fk_soc, $user, 0, 1, 1, 'update'); // Use sync to 0 to avoid cyclic updates
@ -1314,7 +1326,7 @@ class Adherent extends CommonObject
$sql .= " d.photo, d.fk_adherent_type, d.morphy, d.entity,"; $sql .= " d.photo, d.fk_adherent_type, d.morphy, d.entity,";
$sql .= " d.datec as datec,"; $sql .= " d.datec as datec,";
$sql .= " d.tms as datem,"; $sql .= " d.tms as datem,";
$sql .= " d.datefin as datefin,"; $sql .= " d.datefin as datefin, d.default_lang,";
$sql .= " d.birth as birthday,"; $sql .= " d.birth as birthday,";
$sql .= " d.datevalid as datev,"; $sql .= " d.datevalid as datev,";
$sql .= " d.country,"; $sql .= " d.country,";
@ -1407,6 +1419,8 @@ class Adherent extends CommonObject
$this->date_validation = $this->db->jdate($obj->datev); $this->date_validation = $this->db->jdate($obj->datev);
$this->birth = $this->db->jdate($obj->birthday); $this->birth = $this->db->jdate($obj->birthday);
$this->default_lang = $obj->default_lang;
$this->note_private = $obj->note_private; $this->note_private = $obj->note_private;
$this->note_public = $obj->note_public; $this->note_public = $obj->note_public;
$this->morphy = $obj->morphy; $this->morphy = $obj->morphy;
@ -2556,6 +2570,7 @@ class Adherent extends CommonObject
$this->datefin = $now; $this->datefin = $now;
$this->datevalid = $now; $this->datevalid = $now;
$this->default_lang = '';
$this->typeid = 1; // Id type adherent $this->typeid = 1; // Id type adherent
$this->type = 'Type adherent'; // Libelle type adherent $this->type = 'Type adherent'; // Libelle type adherent

View File

@ -1220,14 +1220,16 @@ if ($id > 0) {
$sql .= natural_search("code_iso", $search_code); $sql .= natural_search("code_iso", $search_code);
} elseif ($search_code != '' && $id == 28) { } elseif ($search_code != '' && $id == 28) {
$sql .= natural_search("h.code", $search_code); $sql .= natural_search("h.code", $search_code);
} elseif ($search_code != '' && $id == 32) { } elseif ($search_code != '' && ($id == 7 || $id == 32)) {
$sql .= natural_search("a.code", $search_code); $sql .= natural_search("a.code", $search_code);
} elseif ($search_code != '' && $id == 3) { } elseif ($search_code != '' && $id == 3) {
$sql .= natural_search("r.code_region", $search_code); $sql .= natural_search("r.code_region", $search_code);
} elseif ($search_code != '' && $id == 7) { } elseif ($search_code != '' && ($id == 8 || $id == 10)) {
$sql .= natural_search("a.code", $search_code);
} elseif ($search_code != '' && $id == 10) {
$sql .= natural_search("t.code", $search_code); $sql .= natural_search("t.code", $search_code);
} elseif ($search_code != '' && $id == 1) {
$sql .= natural_search("f.code", $search_code);
} elseif ($search_code != '' && $id == 2) {
$sql .= natural_search("d.code_departement", $search_code);
} elseif ($search_code != '' && $id != 9) { } elseif ($search_code != '' && $id != 9) {
$sql .= natural_search("code", $search_code); $sql .= natural_search("code", $search_code);
} }

View File

@ -88,7 +88,15 @@ if ($action == 'update' && !$cancel) {
dolibarr_set_const($db, "MAIN_MAIL_SMTP_PORT", GETPOST("MAIN_MAIL_SMTP_PORT", 'int'), 'chaine', 0, '', $conf->entity); dolibarr_set_const($db, "MAIN_MAIL_SMTP_PORT", GETPOST("MAIN_MAIL_SMTP_PORT", 'int'), 'chaine', 0, '', $conf->entity);
dolibarr_set_const($db, "MAIN_MAIL_SMTP_SERVER", GETPOST("MAIN_MAIL_SMTP_SERVER", 'alphanohtml'), 'chaine', 0, '', $conf->entity); dolibarr_set_const($db, "MAIN_MAIL_SMTP_SERVER", GETPOST("MAIN_MAIL_SMTP_SERVER", 'alphanohtml'), 'chaine', 0, '', $conf->entity);
dolibarr_set_const($db, "MAIN_MAIL_SMTPS_ID", GETPOST("MAIN_MAIL_SMTPS_ID", 'alphanohtml'), 'chaine', 0, '', $conf->entity); dolibarr_set_const($db, "MAIN_MAIL_SMTPS_ID", GETPOST("MAIN_MAIL_SMTPS_ID", 'alphanohtml'), 'chaine', 0, '', $conf->entity);
dolibarr_set_const($db, "MAIN_MAIL_SMTPS_PW", GETPOST("MAIN_MAIL_SMTPS_PW", 'none'), 'chaine', 0, '', $conf->entity); if (GETPOSTISSET("MAIN_MAIL_SMTPS_PW")) {
dolibarr_set_const($db, "MAIN_MAIL_SMTPS_PW", GETPOST("MAIN_MAIL_SMTPS_PW", 'none'), 'chaine', 0, '', $conf->entity);
}
if (GETPOSTISSET("MAIN_MAIL_SMTPS_AUTH_TYPE")) {
dolibarr_set_const($db, "MAIN_MAIL_SMTPS_AUTH_TYPE", GETPOST("MAIN_MAIL_SMTPS_AUTH_TYPE", 'chaine'), 'chaine', 0, '', $conf->entity);
}
if (GETPOSTISSET("MAIN_MAIL_SMTPS_OAUTH_SERVICE")) {
dolibarr_set_const($db, "MAIN_MAIL_SMTPS_OAUTH_SERVICE", GETPOST("MAIN_MAIL_SMTPS_OAUTH_SERVICE", 'chaine'), 'chaine', 0, '', $conf->entity);
}
dolibarr_set_const($db, "MAIN_MAIL_EMAIL_TLS", GETPOST("MAIN_MAIL_EMAIL_TLS", 'int'), 'chaine', 0, '', $conf->entity); dolibarr_set_const($db, "MAIN_MAIL_EMAIL_TLS", GETPOST("MAIN_MAIL_EMAIL_TLS", 'int'), 'chaine', 0, '', $conf->entity);
dolibarr_set_const($db, "MAIN_MAIL_EMAIL_STARTTLS", GETPOST("MAIN_MAIL_EMAIL_STARTTLS", 'int'), 'chaine', 0, '', $conf->entity); dolibarr_set_const($db, "MAIN_MAIL_EMAIL_STARTTLS", GETPOST("MAIN_MAIL_EMAIL_STARTTLS", 'int'), 'chaine', 0, '', $conf->entity);
dolibarr_set_const($db, "MAIN_MAIL_EMAIL_SMTP_ALLOW_SELF_SIGNED", GETPOST("MAIN_MAIL_EMAIL_SMTP_ALLOW_SELF_SIGNED", 'int'), 'chaine', 0, '', $conf->entity); dolibarr_set_const($db, "MAIN_MAIL_EMAIL_SMTP_ALLOW_SELF_SIGNED", GETPOST("MAIN_MAIL_EMAIL_SMTP_ALLOW_SELF_SIGNED", 'int'), 'chaine', 0, '', $conf->entity);
@ -171,6 +179,24 @@ if (version_compare(phpversion(), '7.0', '>=')) {
$listofmethods['swiftmailer'] = 'Swift Mailer socket library'; $listofmethods['swiftmailer'] = 'Swift Mailer socket library';
} }
// List of oauth services
$oauthservices = array();
foreach ($conf->global as $key => $val) {
if (!empty($val) && preg_match('/^OAUTH_.*_ID$/', $key)) {
$key = preg_replace('/^OAUTH_/', '', $key);
$key = preg_replace('/_ID$/', '', $key);
if (preg_match('/^.*-/', $key)) {
$name = preg_replace('/^.*-/', '', $key);
} else {
$name = $langs->trans("NoName");
}
$provider = preg_replace('/-.*$/', '', $key);
$provider = ucfirst(strtolower($provider));
$oauthservices[$key] = $name." (".$provider.")";
}
}
if ($action == 'edit') { if ($action == 'edit') {
if ($conf->use_javascript_ajax) { if ($conf->use_javascript_ajax) {
@ -195,6 +221,7 @@ if ($action == 'edit') {
jQuery("#MAIN_MAIL_EMAIL_DKIM_PRIVATE_KEY").prop("disabled", true); jQuery("#MAIN_MAIL_EMAIL_DKIM_PRIVATE_KEY").prop("disabled", true);
jQuery(".smtp_method").hide(); jQuery(".smtp_method").hide();
jQuery(".dkim").hide(); jQuery(".dkim").hide();
jQuery(".smtp_auth_method").hide();
'; ';
if ($linuxlike) { if ($linuxlike) {
print ' print '
@ -237,6 +264,7 @@ if ($action == 'edit') {
jQuery("#smtp_port_mess").hide(); jQuery("#smtp_port_mess").hide();
jQuery(".smtp_method").show(); jQuery(".smtp_method").show();
jQuery(".dkim").hide(); jQuery(".dkim").hide();
jQuery(".smtp_auth_method").show();
} }
if (jQuery("#MAIN_MAIL_SENDMODE").val()==\'swiftmailer\') if (jQuery("#MAIN_MAIL_SENDMODE").val()==\'swiftmailer\')
{ {
@ -264,12 +292,31 @@ if ($action == 'edit') {
jQuery("#smtp_port_mess").hide(); jQuery("#smtp_port_mess").hide();
jQuery(".smtp_method").show(); jQuery(".smtp_method").show();
jQuery(".dkim").show(); jQuery(".dkim").show();
jQuery(".smtp_auth_method").hide();
} }
} }
function change_smtp_auth_method() {
console.log(jQuery("#radio_pw").prop("checked"));
if (jQuery("#MAIN_MAIL_SENDMODE").val()==\'smtps\' && jQuery("#radio_oauth").prop("checked")) {
jQuery(".smtp_oauth_service").show();
jQuery(".smtp_pw").hide();
} else if(jQuery("#MAIN_MAIL_SENDMODE").val()==\'mail\'){
jQuery(".smtp_oauth_service").hide();
jQuery(".smtp_pw").hide();
} else {
jQuery(".smtp_oauth_service").hide();
jQuery(".smtp_pw").show();
}
}
initfields(); initfields();
change_smtp_auth_method();
jQuery("#MAIN_MAIL_SENDMODE").change(function() { jQuery("#MAIN_MAIL_SENDMODE").change(function() {
initfields(); initfields();
change_smtp_auth_method();
}); });
jQuery("#radio_pw, #radio_oauth").change(function() {
change_smtp_auth_method();
});
jQuery("#MAIN_MAIL_EMAIL_TLS").change(function() { jQuery("#MAIN_MAIL_EMAIL_TLS").change(function() {
if (jQuery("#MAIN_MAIL_EMAIL_TLS").val() == 1) if (jQuery("#MAIN_MAIL_EMAIL_TLS").val() == 1)
jQuery("#MAIN_MAIL_EMAIL_STARTTLS").val(0); jQuery("#MAIN_MAIL_EMAIL_STARTTLS").val(0);
@ -413,10 +460,29 @@ if ($action == 'edit') {
print '</td></tr>'; print '</td></tr>';
} }
// OAUTH
if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps', 'swiftmailer')))) {
print '<tr class="oddeven smtp_auth_method"><td>'.$langs->trans("MAIN_MAIL_SMTPS_AUTH_TYPE").'</td><td>';
if (empty($conf->multicompany->enabled) || ($user->admin && !$user->entity)) {
print '<input type="radio" id="radio_pw" name="MAIN_MAIL_SMTPS_AUTH_TYPE" value="LOGIN"'.($conf->global->MAIN_MAIL_SMTPS_AUTH_TYPE == 'LOGIN' ? ' checked' : '').'> ';
print '<label for="radio_pw" >'.$langs->trans("UsePassword").'</label>';
print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
print '<input type="radio" id="radio_oauth" name="MAIN_MAIL_SMTPS_AUTH_TYPE" value="XOAUTH2"'.($conf->global->MAIN_MAIL_SMTPS_AUTH_TYPE == 'XOAUTH2' ? ' checked' : '').'> ';
print '<label for="radio_oauth" >'.$form->textwithpicto($langs->trans("UseOauth"), $langs->trans("OauthNotAvailableForAllAndHadToBeCreatedBefore")).'</label>';
} else {
$value = $conf->global->MAIN_MAIL_SMTPS_AUTH_TYPE;
$htmltext = $langs->trans("ContactSuperAdminForChange");
print $form->textwithpicto($langs->trans("MAIN_MAIL_SMTPS_AUTH_TYPE"), $htmltext, 1, 'superadmin');
print '<input type="hidden" id="MAIN_MAIL_SMTPS_AUTH_TYPE" name="MAIN_MAIL_SMTPS_AUTH_TYPE" value="'.$value.'">';
}
print '</td></tr>';
}
// PW // PW
if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps', 'swiftmailer')))) { if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps', 'swiftmailer')))) {
$mainsmtppw = (!empty($conf->global->MAIN_MAIL_SMTPS_PW) ? $conf->global->MAIN_MAIL_SMTPS_PW : ''); $mainsmtppw = (!empty($conf->global->MAIN_MAIL_SMTPS_PW) ? $conf->global->MAIN_MAIL_SMTPS_PW : '');
print '<tr class="drag drop oddeven"><td>'; print '<tr class="drag drop oddeven smtp_pw"><td>';
print $form->textwithpicto($langs->trans("MAIN_MAIL_SMTPS_PW"), $langs->trans("WithGMailYouCanCreateADedicatedPassword")); print $form->textwithpicto($langs->trans("MAIN_MAIL_SMTPS_PW"), $langs->trans("WithGMailYouCanCreateADedicatedPassword"));
print '</td><td>'; print '</td><td>';
// SuperAdministrator access only // SuperAdministrator access only
@ -430,6 +496,24 @@ if ($action == 'edit') {
print '</td></tr>'; print '</td></tr>';
} }
// OAUTH service provider
if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps')))) {
print '<tr class="oddeven smtp_oauth_service"><td>'.$langs->trans("MAIN_MAIL_SMTPS_OAUTH_SERVICE").'</td><td>';
// SuperAdministrator access only
if ((empty($conf->global->MAIN_MODULE_MULTICOMPANY)) || ($user->admin && !$user->entity)) {
print $form->selectarray('MAIN_MAIL_SMTPS_OAUTH_SERVICE', $oauthservices, $conf->global->MAIN_MAIL_SMTPS_OAUTH_SERVICE);
} else {
$text = $oauthservices[$conf->global->MAIN_MAIL_SMTPS_OAUTH_SERVICE];
if (empty($text)) {
$text = $langs->trans("Undefined");
}
$htmltext = $langs->trans("ContactSuperAdminForChange");
print $form->textwithpicto($text, $htmltext, 1, 'superadmin');
print '<input type="hidden" name="MAIN_MAIL_SMTPS_OAUTH_SERVICE" value="'.$conf->global->MAIN_MAIL_SMTPS_OAUTH_SERVICE.'">';
}
print '</td></tr>';
}
// TLS // TLS
print '<tr class="oddeven"><td>'.$langs->trans("MAIN_MAIL_EMAIL_TLS").'</td><td>'; print '<tr class="oddeven"><td>'.$langs->trans("MAIN_MAIL_EMAIL_TLS").'</td><td>';
if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps', 'swiftmailer')))) { if (!empty($conf->use_javascript_ajax) || (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps', 'swiftmailer')))) {
@ -601,6 +685,7 @@ if ($action == 'edit') {
print '<tr class="oddeven"><td>'.$langs->trans("MAIN_MAIL_SMTP_SERVER", ini_get('SMTP') ?ini_get('SMTP') : $langs->transnoentities("Undefined")).'</td><td>'.(!empty($conf->global->MAIN_MAIL_SMTP_SERVER) ? $conf->global->MAIN_MAIL_SMTP_SERVER : '').'</td></tr>'; print '<tr class="oddeven"><td>'.$langs->trans("MAIN_MAIL_SMTP_SERVER", ini_get('SMTP') ?ini_get('SMTP') : $langs->transnoentities("Undefined")).'</td><td>'.(!empty($conf->global->MAIN_MAIL_SMTP_SERVER) ? $conf->global->MAIN_MAIL_SMTP_SERVER : '').'</td></tr>';
} }
// Port // Port
if ($linuxlike && (isset($conf->global->MAIN_MAIL_SENDMODE) && $conf->global->MAIN_MAIL_SENDMODE == 'mail')) { if ($linuxlike && (isset($conf->global->MAIN_MAIL_SENDMODE) && $conf->global->MAIN_MAIL_SENDMODE == 'mail')) {
print '<tr class="oddeven"><td>'.$langs->trans("MAIN_MAIL_SMTP_PORT_NotAvailableOnLinuxLike").'</td><td><span class="opacitymedium">'.$langs->trans("SeeLocalSendMailSetup").'</span></td></tr>'; print '<tr class="oddeven"><td>'.$langs->trans("MAIN_MAIL_SMTP_PORT_NotAvailableOnLinuxLike").'</td><td><span class="opacitymedium">'.$langs->trans("SeeLocalSendMailSetup").'</span></td></tr>';
@ -613,11 +698,27 @@ if ($action == 'edit') {
print '<tr class="oddeven"><td>'.$langs->trans("MAIN_MAIL_SMTPS_ID").'</td><td>'.$conf->global->MAIN_MAIL_SMTPS_ID.'</td></tr>'; print '<tr class="oddeven"><td>'.$langs->trans("MAIN_MAIL_SMTPS_ID").'</td><td>'.$conf->global->MAIN_MAIL_SMTPS_ID.'</td></tr>';
} }
// AUTH method
if (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps'))) {
$authtype = $conf->global->MAIN_MAIL_SMTPS_AUTH_TYPE;
$text = ($authtype === "LOGIN") ? $langs->trans("UsePassword") : ($authtype === "XOAUTH2" ? $langs->trans("UseOauth") : '') ;
print '<tr class="oddeven"><td>'.$langs->trans("MAIN_MAIL_SMTPS_AUTH_TYPE").'</td><td>'.$text.'</td></tr>';
}
// SMTPS PW // SMTPS PW
if (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps', 'swiftmailer'))) { if (isset($conf->global->MAIN_MAIL_SENDMODE) && (in_array($conf->global->MAIN_MAIL_SENDMODE, array('swiftmailer')) || (in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps')) && (isset($conf->global->MAIN_MAIL_SMTPS_AUTH_TYPE) && $conf->global->MAIN_MAIL_SMTPS_AUTH_TYPE === "LOGIN")))) {
print '<tr class="oddeven"><td>'.$langs->trans("MAIN_MAIL_SMTPS_PW").'</td><td>'.preg_replace('/./', '*', $conf->global->MAIN_MAIL_SMTPS_PW).'</td></tr>'; print '<tr class="oddeven"><td>'.$langs->trans("MAIN_MAIL_SMTPS_PW").'</td><td>'.preg_replace('/./', '*', $conf->global->MAIN_MAIL_SMTPS_PW).'</td></tr>';
} }
// SMTPS oauth service
if (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps')) && isset($conf->global->MAIN_MAIL_SMTPS_AUTH_TYPE) && $conf->global->MAIN_MAIL_SMTPS_AUTH_TYPE === "XOAUTH2") {
$text = $oauthservices[$conf->global->MAIN_MAIL_SMTPS_OAUTH_SERVICE];
if (empty($text)) {
$text = $langs->trans("Undefined").img_warning();
}
print '<tr class="oddeven"><td>'.$langs->trans("MAIN_MAIL_SMTPS_OAUTH_SERVICE").'</td><td>'.$text.'</td></tr>';
}
// TLS // TLS
print '<tr class="oddeven"><td>'.$langs->trans("MAIN_MAIL_EMAIL_TLS").'</td><td>'; print '<tr class="oddeven"><td>'.$langs->trans("MAIN_MAIL_EMAIL_TLS").'</td><td>';
if (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps', 'swiftmailer'))) { if (isset($conf->global->MAIN_MAIL_SENDMODE) && in_array($conf->global->MAIN_MAIL_SENDMODE, array('smtps', 'swiftmailer'))) {

View File

@ -305,7 +305,8 @@ class Categories extends DolibarrApi
Categorie::TYPE_CUSTOMER, Categorie::TYPE_CUSTOMER,
Categorie::TYPE_SUPPLIER, Categorie::TYPE_SUPPLIER,
Categorie::TYPE_MEMBER, Categorie::TYPE_MEMBER,
Categorie::TYPE_PROJECT Categorie::TYPE_PROJECT,
Categorie::TYPE_KNOWLEDGEMANAGEMENT
])) { ])) {
throw new RestException(401); throw new RestException(401);
} }
@ -322,6 +323,8 @@ class Categories extends DolibarrApi
throw new RestException(401); throw new RestException(401);
} elseif ($type == Categorie::TYPE_PROJECT && !DolibarrApiAccess::$user->rights->projet->lire) { } elseif ($type == Categorie::TYPE_PROJECT && !DolibarrApiAccess::$user->rights->projet->lire) {
throw new RestException(401); throw new RestException(401);
} elseif ($type == Categorie::TYPE_KNOWLEDGEMANAGEMENT && !DolibarrApiAccess::$user->rights->knowledgemanagement->knowledgerecord->read) {
throw new RestException(401);
} }
$categories = $this->category->getListForItem($id, $type, $sortfield, $sortorder, $limit, $page); $categories = $this->category->getListForItem($id, $type, $sortfield, $sortorder, $limit, $page);

View File

@ -1030,7 +1030,7 @@ if ($type == Categorie::TYPE_PROJECT) {
} }
// List of users // List of users
if ($type == Categorie::TYPE_USER) { if ($type == Categorie::TYPE_USER && $user->hasRight("user", "user", "read")) {
require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php'; require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
$users = $object->getObjectsInCateg($type); $users = $object->getObjectsInCateg($type);
@ -1099,6 +1099,9 @@ if ($type == Categorie::TYPE_USER) {
print '</form>'."\n"; print '</form>'."\n";
} }
} else {
print_barre_liste($langs->trans("Users"), null, $_SERVER["PHP_SELF"], '', '', '', '', '', '', 'user');
accessforbidden($langs->trans("NotEnoughPermissions"), 0, 0);
} }

View File

@ -75,7 +75,7 @@ if ($_socid > 0) {
// We load data of thirdparty // We load data of thirdparty
$objsoc = new Societe($db); $objsoc = new Societe($db);
$objsoc->id = $_socid; $objsoc->id = $_socid;
$objsoc->fetch($_socid, $to); $objsoc->fetch($_socid);
$head = societe_prepare_head($objsoc); $head = societe_prepare_head($objsoc);
@ -141,7 +141,6 @@ if ($_socid > 0) {
$resql = $db->query($sql); $resql = $db->query($sql);
if ($resql) { if ($resql) {
print '<table class="noborder centpercent">'; print '<table class="noborder centpercent">';
$tag = !$tag;
print '<tr class="liste_titre">'; print '<tr class="liste_titre">';
print '<td>'.$langs->trans("Date").'</td>'; print '<td>'.$langs->trans("Date").'</td>';
print '<td>'.$langs->trans("PriceLevel").'</td>'; print '<td>'.$langs->trans("PriceLevel").'</td>';

View File

@ -112,9 +112,9 @@ if ($id > 0 || !empty($ref)) {
// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
$hookmanager->initHooks(array('propalcard', 'globalcard')); $hookmanager->initHooks(array('propalcard', 'globalcard'));
$usercanread = $user->rights->propal->lire; $usercanread = $user->hasRight("propal", "lire");
$usercancreate = $user->rights->propal->creer; $usercancreate = $user->hasRight("propal", "creer");
$usercandelete = $user->rights->propal->supprimer; $usercandelete = $user->hasRight("propal", "supprimer");
$usercanclose = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $usercancreate) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->propal->propal_advance->close))); $usercanclose = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $usercancreate) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->propal->propal_advance->close)));
$usercanvalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $usercancreate) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->propal->propal_advance->validate))); $usercanvalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $usercancreate) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->propal->propal_advance->validate)));

View File

@ -108,9 +108,9 @@ $extrafields->fetch_name_optionals_label($object->table_element);
// Load object // Load object
include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once
$usercanread = $user->hasRight('commande', 'lire'); $usercanread = $user->hasRight("commande", "lire");
$usercancreate = $user->hasRight('commande', 'creer'); $usercancreate = $user->hasRight("commande", "creer");
$usercandelete = $user->hasRight('commande', 'supprimer'); $usercandelete = $user->hasRight("commande", "supprimer");
// Advanced permissions // Advanced permissions
$usercanclose = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($usercancreate)) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->hasRight('commande', 'order_advance', 'close')))); $usercanclose = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($usercancreate)) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->hasRight('commande', 'order_advance', 'close'))));

View File

@ -128,11 +128,11 @@ if ($id > 0 || !empty($ref)) {
// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
$hookmanager->initHooks(array('invoicecard', 'globalcard')); $hookmanager->initHooks(array('invoicecard', 'globalcard'));
$usercanread = $user->rights->facture->lire; $usercanread = $user->hasRight("facture", "lire");
$usercancreate = $user->rights->facture->creer; $usercancreate = $user->hasRight("facture", "creer");
$usercanissuepayment = $user->rights->facture->paiement; $usercanissuepayment = $user->hasRight("facture", "paiement");
$usercandelete = $user->rights->facture->supprimer; $usercandelete = $user->hasRight("facture", "supprimer");
$usercancreatecontract = $user->rights->contrat->creer; $usercancreatecontract = $user->hasRight("contrat", "creer");
$usercanvalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $usercancreate) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->facture->invoice_advance->validate))); $usercanvalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $usercancreate) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->facture->invoice_advance->validate)));
$usercansend = (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->facture->invoice_advance->send))); $usercansend = (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->facture->invoice_advance->send)));
$usercanreopen = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $usercancreate) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->facture->invoice_advance->reopen))); $usercanreopen = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $usercancreate) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->facture->invoice_advance->reopen)));

View File

@ -59,8 +59,15 @@ $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit;
$offset = $limit * $page; $offset = $limit * $page;
$upload_dir = $conf->bank->multidir_output[$object->entity ? $object->entity : $conf->entity]."/checkdeposits"; $upload_dir = $conf->bank->multidir_output[$object->entity ? $object->entity : $conf->entity]."/checkdeposits";
// filter by dates from / to
$filterdate = dol_mktime(0, 0, 0, GETPOST('fdmonth'), GETPOST('fdday'), GETPOST('fdyear')); $search_date_start_day = GETPOST('search_date_start_day', 'int');
$search_date_start_month = GETPOST('search_date_start_month', 'int');
$search_date_start_year = GETPOST('search_date_start_year', 'int');
$search_date_end_day = GETPOST('search_date_end_day', 'int');
$search_date_end_month = GETPOST('search_date_end_month', 'int');
$search_date_end_year = GETPOST('search_date_end_year', 'int');
$search_date_start = dol_mktime(0, 0, 0, $search_date_start_month, $search_date_start_day, $search_date_start_year);
$search_date_end = dol_mktime(23, 59, 59, $search_date_end_month, $search_date_end_day, $search_date_end_year);
$filteraccountid = GETPOST('accountid', 'int'); $filteraccountid = GETPOST('accountid', 'int');
// Security check // Security check
@ -265,7 +272,15 @@ if ($action == 'builddoc' && $user->rights->banque->cheque) {
*/ */
if (GETPOST('removefilter')) { if (GETPOST('removefilter')) {
$filterdate = ''; // filter by dates from / to
$search_date_start_day = '';
$search_date_start_month = '';
$search_date_start_year = '';
$search_date_end_day = '';
$search_date_end_month = '';
$search_date_end_year = '';
$search_date_start = '';
$search_date_end = '';
$filteraccountid = 0; $filteraccountid = 0;
} }
@ -352,7 +367,13 @@ if ($action == 'new') {
//print '<tr><td width="30%">'.$langs->trans('Date').'</td><td width="70%">'.dol_print_date($now,'day').'</td></tr>'; //print '<tr><td width="30%">'.$langs->trans('Date').'</td><td width="70%">'.dol_print_date($now,'day').'</td></tr>';
// Filter // Filter
print '<tr><td class="titlefieldcreate">'.$langs->trans("DateChequeReceived").'</td><td>'; print '<tr><td class="titlefieldcreate">'.$langs->trans("DateChequeReceived").'</td><td>';
print $form->selectDate($filterdate, 'fd', 0, 0, 1, '', 1, 1); // filter by dates from / to
print '<div class="nowrap">';
print $form->selectDate($search_date_start, 'search_date_start_', 0, 0, 1, '', 1, 1, 0, '', '', '', '', 1, '', $langs->trans('From'));
print '</div>';
print '<div class="nowrap">';
print $form->selectDate($search_date_end, 'search_date_end_', 0, 0, 1, '', 1, 1, 0, '', '', '', '', 1, '', $langs->trans('to'));
print '</div>';
print '</td></tr>'; print '</td></tr>';
print '<tr><td>'.$langs->trans("BankAccount").'</td><td>'; print '<tr><td>'.$langs->trans("BankAccount").'</td><td>';
$form->select_comptes($filteraccountid, 'accountid', 0, 'courant <> 2', 1); $form->select_comptes($filteraccountid, 'accountid', 0, 'courant <> 2', 1);
@ -363,7 +384,7 @@ if ($action == 'new') {
print '<div class="center">'; print '<div class="center">';
print '<input type="submit" class="button" name="filter" value="'.dol_escape_htmltag($langs->trans("ToFilter")).'">'; print '<input type="submit" class="button" name="filter" value="'.dol_escape_htmltag($langs->trans("ToFilter")).'">';
if ($filterdate || $filteraccountid > 0) { if ($search_date_start || $search_date_end || $filteraccountid > 0) {
print ' &nbsp; '; print ' &nbsp; ';
print '<input type="submit" class="button" name="removefilter" value="'.dol_escape_htmltag($langs->trans("RemoveFilter")).'">'; print '<input type="submit" class="button" name="removefilter" value="'.dol_escape_htmltag($langs->trans("RemoveFilter")).'">';
} }
@ -382,8 +403,11 @@ if ($action == 'new') {
$sql .= " AND ba.entity IN (".getEntity('bank_account').")"; $sql .= " AND ba.entity IN (".getEntity('bank_account').")";
$sql .= " AND b.fk_bordereau = 0"; $sql .= " AND b.fk_bordereau = 0";
$sql .= " AND b.amount > 0"; $sql .= " AND b.amount > 0";
if ($filterdate) { if ($search_date_start) {
$sql .= " AND b.dateo = '".$db->idate($filterdate)."'"; $sql .= " AND b.dateo >= '".$db->idate($search_date_start)."'";
}
if ($search_date_end) {
$sql .= " AND b.dateo <= '".$db->idate($search_date_end)."'";
} }
if ($filteraccountid > 0) { if ($filteraccountid > 0) {
$sql .= " AND ba.rowid = ".((int) $filteraccountid); $sql .= " AND ba.rowid = ".((int) $filteraccountid);

View File

@ -185,7 +185,7 @@ $dolibarr_main_instance_unique_id='84b5bc91f83b56e458db71e0adac2b62';
// values using a ",". In this case, Dolibarr will check login/pass for each value in // values using a ",". In this case, Dolibarr will check login/pass for each value in
// order defined into value. However, note that this can't work with all values. // order defined into value. However, note that this can't work with all values.
// Examples: // Examples:
// $dolibarr_main_authentication='dolibarr'; // Use the password defined into application on user record. // $dolibarr_main_authentication='dolibarr'; // Use the password defined into application on user file (default).
// $dolibarr_main_authentication='http'; // Use the HTTP Basic authentication // $dolibarr_main_authentication='http'; // Use the HTTP Basic authentication
// $dolibarr_main_authentication='ldap'; // Check the password into a LDAP server // $dolibarr_main_authentication='ldap'; // Check the password into a LDAP server
// $dolibarr_main_authentication='ldap,dolibarr'; // You can set several mode using a comma as a separator. // $dolibarr_main_authentication='ldap,dolibarr'; // You can set several mode using a comma as a separator.

View File

@ -361,7 +361,7 @@ if (($action == 'send' || $action == 'relance') && !GETPOST('addfile') && !GETPO
} }
$mailfile = new CMailFile($subject, $sendto, $from, $message, $filepath, $mimetype, $filename, $sendtocc, $sendtobcc, $deliveryreceipt, -1, '', '', $trackid, '', $sendcontext); $mailfile = new CMailFile($subject, $sendto, $from, $message, $filepath, $mimetype, $filename, $sendtocc, $sendtobcc, $deliveryreceipt, -1, '', '', $trackid, '', $sendcontext);
if ($mailfile->error) { if (!empty($mailfile->error) || !empty($mailfile->errors)) {
setEventMessages($mailfile->error, $mailfile->errors, 'errors'); setEventMessages($mailfile->error, $mailfile->errors, 'errors');
$action = 'presend'; $action = 'presend';
} else { } else {

View File

@ -30,6 +30,7 @@
* \brief File of class to send emails (with attachments or not) * \brief File of class to send emails (with attachments or not)
*/ */
use OAuth\Common\Storage\DoliStorage;
/** /**
* Class to send emails (with attachments or not) * Class to send emails (with attachments or not)
* Usage: $mailfile = new CMailFile($subject,$sendto,$replyto,$message,$filepath,$mimetype,$filename,$cc,$ccc,$deliveryreceipt,$msgishtml,$errors_to,$css,$trackid,$moreinheader,$sendcontext,$replyto); * Usage: $mailfile = new CMailFile($subject,$sendto,$replyto,$message,$filepath,$mimetype,$filename,$cc,$ccc,$deliveryreceipt,$msgishtml,$errors_to,$css,$trackid,$moreinheader,$sendcontext,$replyto);
@ -470,12 +471,12 @@ class CMailFile
$emailMatchs = preg_match_all($regexp, $from, $adressEmailFrom); $emailMatchs = preg_match_all($regexp, $from, $adressEmailFrom);
$adressEmailFrom = reset($adressEmailFrom); $adressEmailFrom = reset($adressEmailFrom);
if ($emailMatchs !== false && filter_var($conf->global->MAIN_MAIL_SMTPS_ID, FILTER_VALIDATE_EMAIL) && $conf->global->MAIN_MAIL_SMTPS_ID !== $adressEmailFrom) { if ($emailMatchs !== false && filter_var($conf->global->MAIN_MAIL_SMTPS_ID, FILTER_VALIDATE_EMAIL) && $conf->global->MAIN_MAIL_SMTPS_ID !== $adressEmailFrom) {
$result = $this->message->setFrom($conf->global->MAIN_MAIL_SMTPS_ID); $this->message->setFrom($conf->global->MAIN_MAIL_SMTPS_ID);
} else { } else {
$result = $this->message->setFrom($this->getArrayAddress($this->addr_from)); $this->message->setFrom($this->getArrayAddress($this->addr_from));
} }
} else { } else {
$result = $this->message->setFrom($this->getArrayAddress($this->addr_from)); $this->message->setFrom($this->getArrayAddress($this->addr_from));
} }
} catch (Exception $e) { } catch (Exception $e) {
$this->errors[] = $e->getMessage(); $this->errors[] = $e->getMessage();
@ -485,7 +486,7 @@ class CMailFile
// Set the To addresses with an associative array // Set the To addresses with an associative array
if (!empty($this->addr_to)) { if (!empty($this->addr_to)) {
try { try {
$result = $this->message->setTo($this->getArrayAddress($this->addr_to)); $this->message->setTo($this->getArrayAddress($this->addr_to));
} catch (Exception $e) { } catch (Exception $e) {
$this->errors[] = $e->getMessage(); $this->errors[] = $e->getMessage();
} }
@ -493,14 +494,14 @@ class CMailFile
if (!empty($this->reply_to)) { if (!empty($this->reply_to)) {
try { try {
$result = $this->message->SetReplyTo($this->getArrayAddress($this->reply_to)); $this->message->SetReplyTo($this->getArrayAddress($this->reply_to));
} catch (Exception $e) { } catch (Exception $e) {
$this->errors[] = $e->getMessage(); $this->errors[] = $e->getMessage();
} }
} }
try { try {
$result = $this->message->setCharSet($conf->file->character_set_client); $this->message->setCharSet($conf->file->character_set_client);
} catch (Exception $e) { } catch (Exception $e) {
$this->errors[] = $e->getMessage(); $this->errors[] = $e->getMessage();
} }
@ -562,7 +563,11 @@ class CMailFile
} }
//if (! empty($this->errors_to)) $this->message->setErrorsTo($this->getArrayAddress($this->errors_to)); //if (! empty($this->errors_to)) $this->message->setErrorsTo($this->getArrayAddress($this->errors_to));
if (isset($this->deliveryreceipt) && $this->deliveryreceipt == 1) { if (isset($this->deliveryreceipt) && $this->deliveryreceipt == 1) {
$this->message->setReadReceiptTo($this->getArrayAddress($this->addr_from)); try {
$this->message->setReadReceiptTo($this->getArrayAddress($this->addr_from));
} catch (Exception $e) {
$this->errors[] = $e->getMessage();
}
} }
} else { } else {
// Send mail method not correctly defined // Send mail method not correctly defined
@ -665,6 +670,8 @@ class CMailFile
} }
$keyforsmtpserver = 'MAIN_MAIL_SMTP_SERVER'; $keyforsmtpserver = 'MAIN_MAIL_SMTP_SERVER';
$keyforsmtpauthtype = "MAIN_MAIL_SMTPS_AUTH_TYPE";
$keyforsmtpoauthservice = "MAIN_MAIL_SMTPS_OAUTH_SERVICE";
$keyforsmtpport = 'MAIN_MAIL_SMTP_PORT'; $keyforsmtpport = 'MAIN_MAIL_SMTP_PORT';
$keyforsmtpid = 'MAIN_MAIL_SMTPS_ID'; $keyforsmtpid = 'MAIN_MAIL_SMTPS_ID';
$keyforsmtppw = 'MAIN_MAIL_SMTPS_PW'; $keyforsmtppw = 'MAIN_MAIL_SMTPS_PW';
@ -840,6 +847,36 @@ class CMailFile
$this->smtps->setPW($loginpass); $this->smtps->setPW($loginpass);
} }
if (!empty($conf->global->$keyforsmtpauthtype) && $conf->global->$keyforsmtpauthtype === "XOAUTH2") {
require_once DOL_DOCUMENT_ROOT.'/core/lib/oauth.lib.php'; // define $supportedoauth2array
$keyforsupportedoauth2array = $conf->global->$keyforsmtpoauthservice;
if (preg_match('/^.*-/', $keyforsupportedoauth2array)) {
$keyforprovider = preg_replace('/^.*-/', '', $keyforsupportedoauth2array);
} else {
$keyforprovider = '';
}
$keyforsupportedoauth2array = preg_replace('/-.*$/', '', $keyforsupportedoauth2array);
$keyforsupportedoauth2array = 'OAUTH_'.$keyforsupportedoauth2array.'_NAME';
$OAUTH_SERVICENAME = (empty($supportedoauth2array[$keyforsupportedoauth2array]['name']) ? 'Unknown' : $supportedoauth2array[$keyforsupportedoauth2array]['name'].($keyforprovider ? '-'.$keyforprovider : ''));
require_once DOL_DOCUMENT_ROOT.'/includes/OAuth/bootstrap.php';
$storage = new DoliStorage($db, $conf);
try {
$tokenobj = $storage->retrieveAccessToken($OAUTH_SERVICENAME);
if (is_object($tokenobj)) {
$this->smtps->setToken($tokenobj->getAccessToken());
} else {
$this->error = "Token not found";
}
} catch (Exception $e) {
// Return an error if token not found
$this->error = $e->getMessage();
dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
}
}
$res = true; $res = true;
$from = $this->smtps->getFrom('org'); $from = $this->smtps->getFrom('org');
if ($res && !$from) { if ($res && !$from) {

View File

@ -6024,7 +6024,7 @@ abstract class CommonObject
// Test fetch_array ! is_int($key) because fetch_array result is a mix table with Key as alpha and Key as int (depend db engine) // Test fetch_array ! is_int($key) because fetch_array result is a mix table with Key as alpha and Key as int (depend db engine)
if ($key != 'rowid' && $key != 'tms' && $key != 'fk_member' && !is_int($key)) { if ($key != 'rowid' && $key != 'tms' && $key != 'fk_member' && !is_int($key)) {
// we can add this attribute to object // we can add this attribute to object
if (!empty($extrafields) && in_array($extrafields->attributes[$this->table_element]['type'][$key], array('date', 'datetime'))) { if (!empty($extrafields->attributes[$this->table_element]) && in_array($extrafields->attributes[$this->table_element]['type'][$key], array('date', 'datetime'))) {
//var_dump($extrafields->attributes[$this->table_element]['type'][$key]); //var_dump($extrafields->attributes[$this->table_element]['type'][$key]);
$this->array_options["options_".$key] = $this->db->jdate($value); $this->array_options["options_".$key] = $this->db->jdate($value);
} else { } else {
@ -6037,7 +6037,7 @@ abstract class CommonObject
// If field is a computed field, value must become result of compute // If field is a computed field, value must become result of compute
foreach ($tab as $key => $value) { foreach ($tab as $key => $value) {
if (!empty($extrafields) && !empty($extrafields->attributes[$this->table_element]['computed'][$key])) { if (!empty($extrafields->attributes[$this->table_element]) && !empty($extrafields->attributes[$this->table_element]['computed'][$key])) {
//var_dump($conf->disable_compute); //var_dump($conf->disable_compute);
if (empty($conf->disable_compute)) { if (empty($conf->disable_compute)) {
$this->array_options["options_".$key] = dol_eval($extrafields->attributes[$this->table_element]['computed'][$key], 1, 0, ''); $this->array_options["options_".$key] = dol_eval($extrafields->attributes[$this->table_element]['computed'][$key], 1, 0, '');

View File

@ -68,6 +68,11 @@ class SMTPs
*/ */
private $_smtpsPW = null; private $_smtpsPW = null;
/**
* Token in case we use OAUTH2
*/
private $_smtpsToken = null;
/** /**
* Who sent the Message * Who sent the Message
* This can be defined via a INI file or via a setter method * This can be defined via a INI file or via a setter method
@ -565,13 +570,13 @@ class SMTPs
} }
// Default authentication method is LOGIN // Default authentication method is LOGIN
if (empty($conf->global->MAIL_SMTP_AUTH_TYPE)) { if (empty($conf->global->MAIN_MAIL_SMTPS_AUTH_TYPE)) {
$conf->global->MAIL_SMTP_AUTH_TYPE = 'LOGIN'; $conf->global->MAIN_MAIL_SMTPS_AUTH_TYPE = 'LOGIN';
} }
// Send Authentication to Server // Send Authentication to Server
// Check for errors along the way // Check for errors along the way
switch ($conf->global->MAIL_SMTP_AUTH_TYPE) { switch ($conf->global->MAIN_MAIL_SMTPS_AUTH_TYPE) {
case 'NONE': case 'NONE':
// Do not send the 'AUTH type' message. For test purpose, if you don't need authentication, it is better to not enter login/pass into setup. // Do not send the 'AUTH type' message. For test purpose, if you don't need authentication, it is better to not enter login/pass into setup.
$_retVal = true; $_retVal = true;
@ -583,9 +588,10 @@ class SMTPs
break; break;
case 'XOAUTH2': case 'XOAUTH2':
// "user=$email\1auth=Bearer $token\1\1" // "user=$email\1auth=Bearer $token\1\1"
$token = 'xxx'; $user = $this->_smtpsID;
$xxxx = "user=".$this->_smtpsID."\1auth=Bearer ".$token."\1\1"; $token = $this->_smtpsToken;
$_retVal = $this->socket_send_str('AUTH XOAUTH2 '.base64_encode($xxxx), '235'); $initRes = "user=".$user."\001auth=Bearer ".$token."\001\001";
$_retVal = $this->socket_send_str('AUTH XOAUTH2 '.base64_encode($initRes), '235');
if (!$_retVal) { if (!$_retVal) {
$this->_setErr(130, 'Error when asking for AUTH XOAUTH2'); $this->_setErr(130, 'Error when asking for AUTH XOAUTH2');
} }
@ -631,7 +637,7 @@ class SMTPs
// Connect to Server // Connect to Server
if ($this->socket = $this->_server_connect()) { if ($this->socket = $this->_server_connect()) {
// If a User ID *and* a password is given, assume Authentication is desired // If a User ID *and* a password is given, assume Authentication is desired
if (!empty($this->_smtpsID) && !empty($this->_smtpsPW)) { if (!empty($this->_smtpsID) && (!empty($this->_smtpsPW) || !empty($this->_smtpsToken))) {
// Send the RFC2554 specified EHLO. // Send the RFC2554 specified EHLO.
$_retVal = $this->_server_authenticate(); $_retVal = $this->_server_authenticate();
} else { } else {
@ -923,6 +929,27 @@ class SMTPs
return $this->_smtpsPW; return $this->_smtpsPW;
} }
/**
* User token for OAUTH2
*
* @param string $_strToken User token
* @return void
*/
public function setToken($_strToken)
{
$this->_smtpsToken = $_strToken;
}
/**
* Retrieves the User token for OAUTH2
*
* @return string User token for OAUTH2
*/
public function getToken()
{
return $this->_smtpsToken;
}
/** /**
* Character set used for current message * Character set used for current message
* Character set is defaulted to 'iso-8859-1'; * Character set is defaulted to 'iso-8859-1';
@ -1866,7 +1893,7 @@ class SMTPs
} }
if (!(substr($server_response, 0, 3) == $response)) { if (!(substr($server_response, 0, 3) == $response)) {
$this->_setErr(120, "Ran into problems sending Mail.\r\nResponse: $server_response"); $this->_setErr(120, "Ran into problems sending Mail.\r\nResponse:".$server_response);
$_retVal = false; $_retVal = false;
} }

View File

@ -276,3 +276,32 @@ function dol_ftp_rmdir($connect_id, $file, $newsection)
return @ftp_rmdir($connect_id, $newremotefileiso); return @ftp_rmdir($connect_id, $newremotefileiso);
} }
} }
/**
* Remove FTP directory
*
* @param resource $connect_id Connection handler
* @param string $newdir Dir create
* @param string $newsection $newsection
* @return result
*/
function dol_ftp_mkdir($connect_id, $newdir, $newsection)
{
global $conf;
if (!empty($conf->global->FTP_CONNECT_WITH_SFTP)) {
$newsection = ssh2_sftp_realpath($connect_id, ".").'/./'; // workaround for bug https://bugs.php.net/bug.php?id=64169
}
// Remote file
$newremotefileiso = $newsection.(preg_match('@[\\\/]$@', $newsection) ? '' : '/').$newdir;
$newremotefileiso = utf8_decode($newremotefileiso);
if (!empty($conf->global->FTP_CONNECT_WITH_SFTP)) {
return ssh2_sftp_mkdir($connect_id, $newremotefileiso, 0777);
} else {
return @ftp_mkdir($connect_id, $newremotefileiso);
}
}

View File

@ -116,30 +116,30 @@ class pdf_sponge extends ModelePDFFactures
public $marge_basse; public $marge_basse;
/** /**
* @var int heightforinfotot * @var int heightforinfotot
*/ */
public $heightforinfotot; public $heightforinfotot;
/** /**
* @var int heightforfreetext * @var int heightforfreetext
*/ */
public $heightforfreetext; public $heightforfreetext;
/** /**
* @var int heightforfooter * @var int heightforfooter
*/ */
public $heightforfooter; public $heightforfooter;
/** /**
* @var int tab_top * @var int tab_top
*/ */
public $tab_top; public $tab_top;
/** /**
* @var int tab_top_newpage * @var int tab_top_newpage
*/ */
public $tab_top_newpage; public $tab_top_newpage;
/** /**
* Issuer * Issuer
@ -1243,37 +1243,37 @@ class pdf_sponge extends ModelePDFFactures
if (empty($object->mode_reglement_code) if (empty($object->mode_reglement_code)
&& empty($conf->global->FACTURE_CHQ_NUMBER) && empty($conf->global->FACTURE_CHQ_NUMBER)
&& empty($conf->global->FACTURE_RIB_NUMBER)) { && empty($conf->global->FACTURE_RIB_NUMBER)) {
$this->error = $outputlangs->transnoentities("ErrorNoPaiementModeConfigured"); $this->error = $outputlangs->transnoentities("ErrorNoPaiementModeConfigured");
} elseif (($object->mode_reglement_code == 'CHQ' && empty($conf->global->FACTURE_CHQ_NUMBER) && empty($object->fk_account) && empty($object->fk_bank)) } elseif (($object->mode_reglement_code == 'CHQ' && empty($conf->global->FACTURE_CHQ_NUMBER) && empty($object->fk_account) && empty($object->fk_bank))
|| ($object->mode_reglement_code == 'VIR' && empty($conf->global->FACTURE_RIB_NUMBER) && empty($object->fk_account) && empty($object->fk_bank))) { || ($object->mode_reglement_code == 'VIR' && empty($conf->global->FACTURE_RIB_NUMBER) && empty($object->fk_account) && empty($object->fk_bank))) {
// Avoid having any valid PDF with setup that is not complete // Avoid having any valid PDF with setup that is not complete
$outputlangs->load("errors"); $outputlangs->load("errors");
$pdf->SetXY($this->marge_gauche, $posy); $pdf->SetXY($this->marge_gauche, $posy);
$pdf->SetTextColor(200, 0, 0); $pdf->SetTextColor(200, 0, 0);
$pdf->SetFont('', 'B', $default_font_size - 2); $pdf->SetFont('', 'B', $default_font_size - 2);
$this->error = $outputlangs->transnoentities("ErrorPaymentModeDefinedToWithoutSetup", $object->mode_reglement_code); $this->error = $outputlangs->transnoentities("ErrorPaymentModeDefinedToWithoutSetup", $object->mode_reglement_code);
$pdf->MultiCell($posxend - $this->marge_gauche, 3, $this->error, 0, 'L', 0); $pdf->MultiCell($posxend - $this->marge_gauche, 3, $this->error, 0, 'L', 0);
$pdf->SetTextColor(0, 0, 0); $pdf->SetTextColor(0, 0, 0);
$posy = $pdf->GetY() + 1; $posy = $pdf->GetY() + 1;
} }
// Show payment mode // Show payment mode
if (!empty($object->mode_reglement_code) if (!empty($object->mode_reglement_code)
&& $object->mode_reglement_code != 'CHQ' && $object->mode_reglement_code != 'CHQ'
&& $object->mode_reglement_code != 'VIR') { && $object->mode_reglement_code != 'VIR') {
$pdf->SetFont('', 'B', $default_font_size - 2); $pdf->SetFont('', 'B', $default_font_size - 2);
$pdf->SetXY($this->marge_gauche, $posy); $pdf->SetXY($this->marge_gauche, $posy);
$titre = $outputlangs->transnoentities("PaymentMode").':'; $titre = $outputlangs->transnoentities("PaymentMode").':';
$pdf->MultiCell($posxend - $this->marge_gauche, 5, $titre, 0, 'L'); $pdf->MultiCell($posxend - $this->marge_gauche, 5, $titre, 0, 'L');
$pdf->SetFont('', '', $default_font_size - 2); $pdf->SetFont('', '', $default_font_size - 2);
$pdf->SetXY($posxval, $posy); $pdf->SetXY($posxval, $posy);
$lib_mode_reg = $outputlangs->transnoentities("PaymentType".$object->mode_reglement_code) != ('PaymentType'.$object->mode_reglement_code) ? $outputlangs->transnoentities("PaymentType".$object->mode_reglement_code) : $outputlangs->convToOutputCharset($object->mode_reglement); $lib_mode_reg = $outputlangs->transnoentities("PaymentType".$object->mode_reglement_code) != ('PaymentType'.$object->mode_reglement_code) ? $outputlangs->transnoentities("PaymentType".$object->mode_reglement_code) : $outputlangs->convToOutputCharset($object->mode_reglement);
$pdf->MultiCell($posxend - $posxval, 5, $lib_mode_reg, 0, 'L'); $pdf->MultiCell($posxend - $posxval, 5, $lib_mode_reg, 0, 'L');
$posy = $pdf->GetY(); $posy = $pdf->GetY();
} }
// Show online payment link // Show online payment link
@ -1461,13 +1461,12 @@ class pdf_sponge extends ModelePDFFactures
if ($posy > $this->page_hauteur - 4 - $this->heightforfooter) { if ($posy > $this->page_hauteur - 4 - $this->heightforfooter) {
$this->_pagefoot($pdf, $object, $outputlangs, 1); $this->_pagefoot($pdf, $object, $outputlangs, 1);
$pdf->addPage(); $pdf->addPage();
if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) { if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
$this->_pagehead($pdf, $object, 0, $outputlangs, $outputlangsbis); $this->_pagehead($pdf, $object, 0, $outputlangs, $outputlangsbis);
$pdf->setY($this->tab_top_newpage); $pdf->setY($this->tab_top_newpage);
} } else {
else{ $pdf->setY($this->marge_haute);
$pdf->setY($this->marge_haute); }
}
$posy = $pdf->GetY(); $posy = $pdf->GetY();
} }
@ -1529,13 +1528,12 @@ class pdf_sponge extends ModelePDFFactures
if ($posy > $this->page_hauteur - 4 - $this->heightforfooter) { if ($posy > $this->page_hauteur - 4 - $this->heightforfooter) {
$pdf->addPage(); $pdf->addPage();
if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) { if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) {
$this->_pagehead($pdf, $object, 0, $outputlangs, $outputlangsbis); $this->_pagehead($pdf, $object, 0, $outputlangs, $outputlangsbis);
$pdf->setY($this->tab_top_newpage); $pdf->setY($this->tab_top_newpage);
} } else {
else { $pdf->setY($this->marge_haute);
$pdf->setY($this->marge_haute); }
}
$posy = $pdf->GetY(); $posy = $pdf->GetY();
} }

View File

@ -120,7 +120,7 @@ if ($user->socid > 0) {
// For some module part, dir may be privates // For some module part, dir may be privates
if (in_array($modulepart, array('facture_paiement', 'unpaid'))) { if (in_array($modulepart, array('facture_paiement', 'unpaid'))) {
if (empty($user->rights->societe->client->voir) || $socid) { if (empty($user->hasRight('societe', 'client', 'voir')) || $socid) {
$original_file = 'private/'.$user->id.'/'.$original_file; // If user has no permission to see all, output dir is specific to user $original_file = 'private/'.$user->id.'/'.$original_file; // If user has no permission to see all, output dir is specific to user
} }
} }

View File

@ -111,7 +111,7 @@ class EmailCollector extends CommonObject
public $fields = array( public $fields = array(
'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'visible'=>2, 'enabled'=>1, 'position'=>1, 'notnull'=>1, 'index'=>1), 'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'visible'=>2, 'enabled'=>1, 'position'=>1, 'notnull'=>1, 'index'=>1),
'entity' => array('type'=>'integer', 'label'=>'Entity', 'enabled'=>1, 'visible'=>0, 'default'=>1, 'notnull'=>1, 'index'=>1, 'position'=>20), 'entity' => array('type'=>'integer', 'label'=>'Entity', 'enabled'=>1, 'visible'=>0, 'default'=>1, 'notnull'=>1, 'index'=>1, 'position'=>20),
'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>1, 'index'=>1, 'position'=>10, 'searchall'=>1, 'help'=>'Example: MyCollector1', 'csslist'=>'tdoverflowmax200'), 'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>1, 'index'=>1, 'position'=>10, 'searchall'=>1, 'help'=>'Example: MyCollector1', 'csslist'=>'tdoverflowmax150'),
'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'visible'=>1, 'enabled'=>1, 'position'=>30, 'notnull'=>-1, 'searchall'=>1, 'help'=>'Example: My Email collector', 'csslist'=>'tdoverflowmax150'), 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'visible'=>1, 'enabled'=>1, 'position'=>30, 'notnull'=>-1, 'searchall'=>1, 'help'=>'Example: My Email collector', 'csslist'=>'tdoverflowmax150'),
'description' => array('type'=>'text', 'label'=>'Description', 'visible'=>-1, 'enabled'=>1, 'position'=>60, 'notnull'=>-1, 'csslist'=>'small'), 'description' => array('type'=>'text', 'label'=>'Description', 'visible'=>-1, 'enabled'=>1, 'position'=>60, 'notnull'=>-1, 'csslist'=>'small'),
'host' => array('type'=>'varchar(255)', 'label'=>'EMailHost', 'visible'=>1, 'enabled'=>1, 'position'=>90, 'notnull'=>1, 'searchall'=>1, 'comment'=>"IMAP server", 'help'=>'Example: imap.gmail.com', 'csslist'=>'tdoverflow125'), 'host' => array('type'=>'varchar(255)', 'label'=>'EMailHost', 'visible'=>1, 'enabled'=>1, 'position'=>90, 'notnull'=>1, 'searchall'=>1, 'comment'=>"IMAP server", 'help'=>'Example: imap.gmail.com', 'csslist'=>'tdoverflow125'),

View File

@ -41,6 +41,7 @@ $result = restrictedArea($user, 'ftp', '');
// Get parameters // Get parameters
$action = GETPOST('action', 'aZ09'); $action = GETPOST('action', 'aZ09');
$section = GETPOST('section'); $section = GETPOST('section');
$newfolder = GETPOST('newfolder');
if (!$section) { if (!$section) {
$section = '/'; $section = '/';
} }
@ -141,11 +142,8 @@ if ($action == 'uploadfile') {
$mesg = $resultarray['mesg']; $mesg = $resultarray['mesg'];
} }
if ($conn_id && $ok && !$mesg) { if ($conn_id && $ok && !$mesg) {
// var_dump($_FILES['userfile']['name']);
$nbfile = count($_FILES['userfile']['name']); $nbfile = count($_FILES['userfile']['name']);
$i = 0; for ($i = 0; $i < $nbfile; $i++) {
for (; $i < $nbfile; $i++) {
var_dump($i);
$newsection = $newsectioniso; $newsection = $newsectioniso;
$fileupload = $_FILES['userfile']['name'][$i]; $fileupload = $_FILES['userfile']['name'][$i];
$fileuploadpath = $_FILES['userfile']['tmp_name'][$i]; $fileuploadpath = $_FILES['userfile']['tmp_name'][$i];
@ -164,6 +162,30 @@ if ($action == 'uploadfile') {
} }
} }
if ($action == 'addfolder') {
// set up a connection or die
if (!$conn_id) {
$newsectioniso = utf8_decode($section);
$resultarray = dol_ftp_connect($ftp_server, $ftp_port, $ftp_user, $ftp_password, $newsectioniso, $ftp_passive);
$conn_id = $resultarray['conn_id'];
$ok = $resultarray['ok'];
$mesg = $resultarray['mesg'];
}
if ($conn_id && $ok && !$mesg) {
$result = dol_ftp_mkdir($conn_id, $newfolder, $newsectioniso);
if ($result) {
setEventMessages($langs->trans("FileWasCreateFolder", $newfolder), null, 'mesgs');
} else {
dol_syslog("ftp/index.php ftp_delete", LOG_ERR);
setEventMessages($langs->trans("FTPFailedToCreateFolder", $newfolder), null, 'errors');
}
$action = '';
} else {
dol_print_error('', $mesg);
}
}
// Action ajout d'un rep // Action ajout d'un rep
if ($action == 'add' && $user->rights->ftp->setup) { if ($action == 'add' && $user->rights->ftp->setup) {
$ecmdir->ref = GETPOST("ref"); $ecmdir->ref = GETPOST("ref");
@ -633,6 +655,16 @@ if (!function_exists('ftp_connect')) {
print '<td></td>'; print '<td></td>';
print '<td align="center"><button type="submit" class="butAction" name="uploadfile" value="'.$langs->trans("Save").'">'.$langs->trans("Upload").'</button></td>'; print '<td align="center"><button type="submit" class="butAction" name="uploadfile" value="'.$langs->trans("Save").'">'.$langs->trans("Upload").'</button></td>';
print '</form>'; print '</form>';
print load_fiche_titre($langs->trans("AddFolder"), null, null);
print '<form enctype="multipart/form-data" action="'.$_SERVER["PHP_SELF"].'" method="post">';
print '<input type="hidden" name="token" value="'.newToken().'">';
print '<input type="hidden" name="numero_ftp" value="'.$numero_ftp.'">';
print '<input type="hidden" name="section" value="'.$section.'">';
print '<input type="hidden" name="action" value="addfolder">';
print '<td><input type="text" class="flat" name="newfolder" multiple></td>';
print '<td></td>';
print '<td align="center"><button type="submit" class="butAction" name="addfolder" value="'.$langs->trans("Save").'">'.$langs->trans("AddFolder").'</button></td>';
print '</form>';
} }
} else { } else {
$foundsetup = false; $foundsetup = false;

View File

@ -1818,7 +1818,7 @@ if ($step == 5 && $datatoimport) {
// Actions // Actions
print '<div class="center">'; print '<div class="center">';
if ($user->rights->import->run) { if ($user->hasRight('import', 'run')) {
print '<input type="submit" class="butAction" value="'.$langs->trans("RunSimulateImportFile").'">'; print '<input type="submit" class="butAction" value="'.$langs->trans("RunSimulateImportFile").'">';
} else { } else {
print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("RunSimulateImportFile").'</a>'; print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")).'">'.$langs->trans("RunSimulateImportFile").'</a>';
@ -1974,7 +1974,7 @@ if ($step == 5 && $datatoimport) {
// Actions // Actions
print '<div class="center">'; print '<div class="center">';
if ($user->rights->import->run) { if ($user->hasRight('import', 'run')) {
if (empty($nboferrors)) { if (empty($nboferrors)) {
print '<a class="butAction" href="'.DOL_URL_ROOT.'/imports/import.php?leftmenu=import&step=6&importid='.$importid.$param.'">'.$langs->trans("RunImportFile").'</a>'; print '<a class="butAction" href="'.DOL_URL_ROOT.'/imports/import.php?leftmenu=import&step=6&importid='.$importid.$param.'">'.$langs->trans("RunImportFile").'</a>';
} else { } else {

View File

@ -1,4 +1,4 @@
/*! jQuery UI - v1.13.1 - 2022-01-20 /*! jQuery UI - v1.13.2 - 2022-07-14
* http://jqueryui.com * http://jqueryui.com
* Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js * Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js
* Copyright jQuery Foundation and other contributors; Licensed MIT */ * Copyright jQuery Foundation and other contributors; Licensed MIT */
@ -20,11 +20,11 @@
$.ui = $.ui || {}; $.ui = $.ui || {};
var version = $.ui.version = "1.13.1"; var version = $.ui.version = "1.13.2";
/*! /*!
* jQuery UI Widget 1.13.1 * jQuery UI Widget 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -766,7 +766,7 @@ var widget = $.widget;
/*! /*!
* jQuery UI Position 1.13.1 * jQuery UI Position 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -1263,7 +1263,7 @@ var position = $.ui.position;
/*! /*!
* jQuery UI :data 1.13.1 * jQuery UI :data 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -1292,7 +1292,7 @@ var data = $.extend( $.expr.pseudos, {
} ); } );
/*! /*!
* jQuery UI Disable Selection 1.13.1 * jQuery UI Disable Selection 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -2047,7 +2047,7 @@ colors = jQuery.Color.names = {
/*! /*!
* jQuery UI Effects 1.13.1 * jQuery UI Effects 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -2431,7 +2431,7 @@ if ( $.uiBackCompat !== false ) {
} }
$.extend( $.effects, { $.extend( $.effects, {
version: "1.13.1", version: "1.13.2",
define: function( name, mode, effect ) { define: function( name, mode, effect ) {
if ( !effect ) { if ( !effect ) {
@ -2999,7 +2999,7 @@ var effect = $.effects;
/*! /*!
* jQuery UI Effects Blind 1.13.1 * jQuery UI Effects Blind 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -3054,7 +3054,7 @@ var effectsEffectBlind = $.effects.define( "blind", "hide", function( options, d
/*! /*!
* jQuery UI Effects Bounce 1.13.1 * jQuery UI Effects Bounce 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -3149,7 +3149,7 @@ var effectsEffectBounce = $.effects.define( "bounce", function( options, done )
/*! /*!
* jQuery UI Effects Clip 1.13.1 * jQuery UI Effects Clip 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -3199,7 +3199,7 @@ var effectsEffectClip = $.effects.define( "clip", "hide", function( options, don
/*! /*!
* jQuery UI Effects Drop 1.13.1 * jQuery UI Effects Drop 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -3253,7 +3253,7 @@ var effectsEffectDrop = $.effects.define( "drop", "hide", function( options, don
/*! /*!
* jQuery UI Effects Explode 1.13.1 * jQuery UI Effects Explode 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -3349,7 +3349,7 @@ var effectsEffectExplode = $.effects.define( "explode", "hide", function( option
/*! /*!
* jQuery UI Effects Fade 1.13.1 * jQuery UI Effects Fade 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -3381,7 +3381,7 @@ var effectsEffectFade = $.effects.define( "fade", "toggle", function( options, d
/*! /*!
* jQuery UI Effects Fold 1.13.1 * jQuery UI Effects Fold 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -3455,7 +3455,7 @@ var effectsEffectFold = $.effects.define( "fold", "hide", function( options, don
/*! /*!
* jQuery UI Effects Highlight 1.13.1 * jQuery UI Effects Highlight 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -3497,7 +3497,7 @@ var effectsEffectHighlight = $.effects.define( "highlight", "show", function( op
/*! /*!
* jQuery UI Effects Size 1.13.1 * jQuery UI Effects Size 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -3675,7 +3675,7 @@ var effectsEffectSize = $.effects.define( "size", function( options, done ) {
/*! /*!
* jQuery UI Effects Scale 1.13.1 * jQuery UI Effects Scale 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -3715,7 +3715,7 @@ var effectsEffectScale = $.effects.define( "scale", function( options, done ) {
/*! /*!
* jQuery UI Effects Puff 1.13.1 * jQuery UI Effects Puff 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -3741,7 +3741,7 @@ var effectsEffectPuff = $.effects.define( "puff", "hide", function( options, don
/*! /*!
* jQuery UI Effects Pulsate 1.13.1 * jQuery UI Effects Pulsate 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -3790,7 +3790,7 @@ var effectsEffectPulsate = $.effects.define( "pulsate", "show", function( option
/*! /*!
* jQuery UI Effects Shake 1.13.1 * jQuery UI Effects Shake 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -3849,7 +3849,7 @@ var effectsEffectShake = $.effects.define( "shake", function( options, done ) {
/*! /*!
* jQuery UI Effects Slide 1.13.1 * jQuery UI Effects Slide 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -3910,7 +3910,7 @@ var effectsEffectSlide = $.effects.define( "slide", "show", function( options, d
/*! /*!
* jQuery UI Effects Transfer 1.13.1 * jQuery UI Effects Transfer 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -3935,7 +3935,7 @@ var effectsEffectTransfer = effect;
/*! /*!
* jQuery UI Focusable 1.13.1 * jQuery UI Focusable 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -4017,7 +4017,7 @@ var form = $.fn._form = function() {
/*! /*!
* jQuery UI Form Reset Mixin 1.13.1 * jQuery UI Form Reset Mixin 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -4079,7 +4079,7 @@ var formResetMixin = $.ui.formResetMixin = {
/*! /*!
* jQuery UI Support for jQuery core 1.8.x and newer 1.13.1 * jQuery UI Support for jQuery core 1.8.x and newer 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -4154,7 +4154,7 @@ if ( !$.fn.even || !$.fn.odd ) {
; ;
/*! /*!
* jQuery UI Keycode 1.13.1 * jQuery UI Keycode 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -4189,7 +4189,7 @@ var keycode = $.ui.keyCode = {
/*! /*!
* jQuery UI Labels 1.13.1 * jQuery UI Labels 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -4244,7 +4244,7 @@ var labels = $.fn.labels = function() {
/*! /*!
* jQuery UI Scroll Parent 1.13.1 * jQuery UI Scroll Parent 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -4278,7 +4278,7 @@ var scrollParent = $.fn.scrollParent = function( includeHidden ) {
/*! /*!
* jQuery UI Tabbable 1.13.1 * jQuery UI Tabbable 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -4302,7 +4302,7 @@ var tabbable = $.extend( $.expr.pseudos, {
/*! /*!
* jQuery UI Unique ID 1.13.1 * jQuery UI Unique ID 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -4340,7 +4340,7 @@ var uniqueId = $.fn.extend( {
/*! /*!
* jQuery UI Accordion 1.13.1 * jQuery UI Accordion 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -4361,7 +4361,7 @@ var uniqueId = $.fn.extend( {
var widgetsAccordion = $.widget( "ui.accordion", { var widgetsAccordion = $.widget( "ui.accordion", {
version: "1.13.1", version: "1.13.2",
options: { options: {
active: 0, active: 0,
animate: {}, animate: {},
@ -4972,7 +4972,7 @@ var safeActiveElement = $.ui.safeActiveElement = function( document ) {
/*! /*!
* jQuery UI Menu 1.13.1 * jQuery UI Menu 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -4991,7 +4991,7 @@ var safeActiveElement = $.ui.safeActiveElement = function( document ) {
var widgetsMenu = $.widget( "ui.menu", { var widgetsMenu = $.widget( "ui.menu", {
version: "1.13.1", version: "1.13.2",
defaultElement: "<ul>", defaultElement: "<ul>",
delay: 300, delay: 300,
options: { options: {
@ -5663,7 +5663,7 @@ var widgetsMenu = $.widget( "ui.menu", {
/*! /*!
* jQuery UI Autocomplete 1.13.1 * jQuery UI Autocomplete 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -5682,7 +5682,7 @@ var widgetsMenu = $.widget( "ui.menu", {
$.widget( "ui.autocomplete", { $.widget( "ui.autocomplete", {
version: "1.13.1", version: "1.13.2",
defaultElement: "<input>", defaultElement: "<input>",
options: { options: {
appendTo: null, appendTo: null,
@ -6319,7 +6319,7 @@ var widgetsAutocomplete = $.ui.autocomplete;
/*! /*!
* jQuery UI Controlgroup 1.13.1 * jQuery UI Controlgroup 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -6340,7 +6340,7 @@ var widgetsAutocomplete = $.ui.autocomplete;
var controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g; var controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g;
var widgetsControlgroup = $.widget( "ui.controlgroup", { var widgetsControlgroup = $.widget( "ui.controlgroup", {
version: "1.13.1", version: "1.13.2",
defaultElement: "<div>", defaultElement: "<div>",
options: { options: {
direction: "horizontal", direction: "horizontal",
@ -6604,7 +6604,7 @@ var widgetsControlgroup = $.widget( "ui.controlgroup", {
} ); } );
/*! /*!
* jQuery UI Checkboxradio 1.13.1 * jQuery UI Checkboxradio 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -6624,7 +6624,7 @@ var widgetsControlgroup = $.widget( "ui.controlgroup", {
$.widget( "ui.checkboxradio", [ $.ui.formResetMixin, { $.widget( "ui.checkboxradio", [ $.ui.formResetMixin, {
version: "1.13.1", version: "1.13.2",
options: { options: {
disabled: null, disabled: null,
label: null, label: null,
@ -6636,8 +6636,7 @@ $.widget( "ui.checkboxradio", [ $.ui.formResetMixin, {
}, },
_getCreateOptions: function() { _getCreateOptions: function() {
var disabled, labels; var disabled, labels, labelContents;
var that = this;
var options = this._super() || {}; var options = this._super() || {};
// We read the type here, because it makes more sense to throw a element type error first, // We read the type here, because it makes more sense to throw a element type error first,
@ -6657,12 +6656,18 @@ $.widget( "ui.checkboxradio", [ $.ui.formResetMixin, {
// We need to get the label text but this may also need to make sure it does not contain the // We need to get the label text but this may also need to make sure it does not contain the
// input itself. // input itself.
this.label.contents().not( this.element[ 0 ] ).each( function() { // The label contents could be text, html, or a mix. We wrap all elements
// and read the wrapper's `innerHTML` to get a string representation of
// the label, without the input as part of it.
labelContents = this.label.contents().not( this.element[ 0 ] );
// The label contents could be text, html, or a mix. We concat each element to get a if ( labelContents.length ) {
// string representation of the label, without the input as part of it. this.originalLabel += labelContents
that.originalLabel += this.nodeType === 3 ? $( this ).text() : this.outerHTML; .clone()
} ); .wrapAll( "<div></div>" )
.parent()
.html();
}
// Set the label option if we found label text // Set the label option if we found label text
if ( this.originalLabel ) { if ( this.originalLabel ) {
@ -6870,7 +6875,7 @@ var widgetsCheckboxradio = $.ui.checkboxradio;
/*! /*!
* jQuery UI Button 1.13.1 * jQuery UI Button 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -6889,7 +6894,7 @@ var widgetsCheckboxradio = $.ui.checkboxradio;
$.widget( "ui.button", { $.widget( "ui.button", {
version: "1.13.1", version: "1.13.2",
defaultElement: "<button>", defaultElement: "<button>",
options: { options: {
classes: { classes: {
@ -7296,7 +7301,7 @@ var widgetsButton = $.ui.button;
/* eslint-disable max-len, camelcase */ /* eslint-disable max-len, camelcase */
/*! /*!
* jQuery UI Datepicker 1.13.1 * jQuery UI Datepicker 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -7314,7 +7319,7 @@ var widgetsButton = $.ui.button;
//>>css.theme: ../../themes/base/theme.css //>>css.theme: ../../themes/base/theme.css
$.extend( $.ui, { datepicker: { version: "1.13.1" } } ); $.extend( $.ui, { datepicker: { version: "1.13.2" } } );
var datepicker_instActive; var datepicker_instActive;
@ -9511,7 +9516,7 @@ $.fn.datepicker = function( options ) {
$.datepicker = new Datepicker(); // singleton instance $.datepicker = new Datepicker(); // singleton instance
$.datepicker.initialized = false; $.datepicker.initialized = false;
$.datepicker.uuid = new Date().getTime(); $.datepicker.uuid = new Date().getTime();
$.datepicker.version = "1.13.1"; $.datepicker.version = "1.13.2";
var widgetsDatepicker = $.datepicker; var widgetsDatepicker = $.datepicker;
@ -9521,7 +9526,7 @@ var widgetsDatepicker = $.datepicker;
var ie = $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ); var ie = $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
/*! /*!
* jQuery UI Mouse 1.13.1 * jQuery UI Mouse 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -9541,7 +9546,7 @@ $( document ).on( "mouseup", function() {
} ); } );
var widgetsMouse = $.widget( "ui.mouse", { var widgetsMouse = $.widget( "ui.mouse", {
version: "1.13.1", version: "1.13.2",
options: { options: {
cancel: "input, textarea, button, select, option", cancel: "input, textarea, button, select, option",
distance: 1, distance: 1,
@ -9783,7 +9788,7 @@ var safeBlur = $.ui.safeBlur = function( element ) {
/*! /*!
* jQuery UI Draggable 1.13.1 * jQuery UI Draggable 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -9800,7 +9805,7 @@ var safeBlur = $.ui.safeBlur = function( element ) {
$.widget( "ui.draggable", $.ui.mouse, { $.widget( "ui.draggable", $.ui.mouse, {
version: "1.13.1", version: "1.13.2",
widgetEventPrefix: "drag", widgetEventPrefix: "drag",
options: { options: {
addClasses: true, addClasses: true,
@ -11018,7 +11023,7 @@ var widgetsDraggable = $.ui.draggable;
/*! /*!
* jQuery UI Resizable 1.13.1 * jQuery UI Resizable 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -11037,7 +11042,7 @@ var widgetsDraggable = $.ui.draggable;
$.widget( "ui.resizable", $.ui.mouse, { $.widget( "ui.resizable", $.ui.mouse, {
version: "1.13.1", version: "1.13.2",
widgetEventPrefix: "resize", widgetEventPrefix: "resize",
options: { options: {
alsoResize: false, alsoResize: false,
@ -12216,7 +12221,7 @@ var widgetsResizable = $.ui.resizable;
/*! /*!
* jQuery UI Dialog 1.13.1 * jQuery UI Dialog 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -12235,7 +12240,7 @@ var widgetsResizable = $.ui.resizable;
$.widget( "ui.dialog", { $.widget( "ui.dialog", {
version: "1.13.1", version: "1.13.2",
options: { options: {
appendTo: "body", appendTo: "body",
autoOpen: true, autoOpen: true,
@ -13141,7 +13146,7 @@ var widgetsDialog = $.ui.dialog;
/*! /*!
* jQuery UI Droppable 1.13.1 * jQuery UI Droppable 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -13157,7 +13162,7 @@ var widgetsDialog = $.ui.dialog;
$.widget( "ui.droppable", { $.widget( "ui.droppable", {
version: "1.13.1", version: "1.13.2",
widgetEventPrefix: "drop", widgetEventPrefix: "drop",
options: { options: {
accept: "*", accept: "*",
@ -13624,7 +13629,7 @@ var widgetsDroppable = $.ui.droppable;
/*! /*!
* jQuery UI Progressbar 1.13.1 * jQuery UI Progressbar 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -13645,7 +13650,7 @@ var widgetsDroppable = $.ui.droppable;
var widgetsProgressbar = $.widget( "ui.progressbar", { var widgetsProgressbar = $.widget( "ui.progressbar", {
version: "1.13.1", version: "1.13.2",
options: { options: {
classes: { classes: {
"ui-progressbar": "ui-corner-all", "ui-progressbar": "ui-corner-all",
@ -13787,7 +13792,7 @@ var widgetsProgressbar = $.widget( "ui.progressbar", {
/*! /*!
* jQuery UI Selectable 1.13.1 * jQuery UI Selectable 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -13804,7 +13809,7 @@ var widgetsProgressbar = $.widget( "ui.progressbar", {
var widgetsSelectable = $.widget( "ui.selectable", $.ui.mouse, { var widgetsSelectable = $.widget( "ui.selectable", $.ui.mouse, {
version: "1.13.1", version: "1.13.2",
options: { options: {
appendTo: "body", appendTo: "body",
autoRefresh: true, autoRefresh: true,
@ -14085,7 +14090,7 @@ var widgetsSelectable = $.widget( "ui.selectable", $.ui.mouse, {
/*! /*!
* jQuery UI Selectmenu 1.13.1 * jQuery UI Selectmenu 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -14106,7 +14111,7 @@ var widgetsSelectable = $.widget( "ui.selectable", $.ui.mouse, {
var widgetsSelectmenu = $.widget( "ui.selectmenu", [ $.ui.formResetMixin, { var widgetsSelectmenu = $.widget( "ui.selectmenu", [ $.ui.formResetMixin, {
version: "1.13.1", version: "1.13.2",
defaultElement: "<select>", defaultElement: "<select>",
options: { options: {
appendTo: null, appendTo: null,
@ -14479,7 +14484,7 @@ var widgetsSelectmenu = $.widget( "ui.selectmenu", [ $.ui.formResetMixin, {
// Support: IE // Support: IE
// Setting the text selection kills the button focus in IE, but // Setting the text selection kills the button focus in IE, but
// restoring the focus doesn't kill the selection. // restoring the focus doesn't kill the selection.
this.button.focus(); this.button.trigger( "focus" );
}, },
_documentClick: { _documentClick: {
@ -14754,7 +14759,7 @@ var widgetsSelectmenu = $.widget( "ui.selectmenu", [ $.ui.formResetMixin, {
/*! /*!
* jQuery UI Slider 1.13.1 * jQuery UI Slider 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -14773,7 +14778,7 @@ var widgetsSelectmenu = $.widget( "ui.selectmenu", [ $.ui.formResetMixin, {
var widgetsSlider = $.widget( "ui.slider", $.ui.mouse, { var widgetsSlider = $.widget( "ui.slider", $.ui.mouse, {
version: "1.13.1", version: "1.13.2",
widgetEventPrefix: "slide", widgetEventPrefix: "slide",
options: { options: {
@ -15489,7 +15494,7 @@ var widgetsSlider = $.widget( "ui.slider", $.ui.mouse, {
/*! /*!
* jQuery UI Sortable 1.13.1 * jQuery UI Sortable 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -15506,7 +15511,7 @@ var widgetsSlider = $.widget( "ui.slider", $.ui.mouse, {
var widgetsSortable = $.widget( "ui.sortable", $.ui.mouse, { var widgetsSortable = $.widget( "ui.sortable", $.ui.mouse, {
version: "1.13.1", version: "1.13.2",
widgetEventPrefix: "sort", widgetEventPrefix: "sort",
ready: false, ready: false,
options: { options: {
@ -17082,7 +17087,7 @@ var widgetsSortable = $.widget( "ui.sortable", $.ui.mouse, {
/*! /*!
* jQuery UI Spinner 1.13.1 * jQuery UI Spinner 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -17112,7 +17117,7 @@ function spinnerModifier( fn ) {
} }
$.widget( "ui.spinner", { $.widget( "ui.spinner", {
version: "1.13.1", version: "1.13.2",
defaultElement: "<input>", defaultElement: "<input>",
widgetEventPrefix: "spin", widgetEventPrefix: "spin",
options: { options: {
@ -17643,7 +17648,7 @@ var widgetsSpinner = $.ui.spinner;
/*! /*!
* jQuery UI Tabs 1.13.1 * jQuery UI Tabs 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -17662,7 +17667,7 @@ var widgetsSpinner = $.ui.spinner;
$.widget( "ui.tabs", { $.widget( "ui.tabs", {
version: "1.13.1", version: "1.13.2",
delay: 300, delay: 300,
options: { options: {
active: null, active: null,
@ -18547,7 +18552,7 @@ var widgetsTabs = $.ui.tabs;
/*! /*!
* jQuery UI Tooltip 1.13.1 * jQuery UI Tooltip 1.13.2
* http://jqueryui.com * http://jqueryui.com
* *
* Copyright jQuery Foundation and other contributors * Copyright jQuery Foundation and other contributors
@ -18566,7 +18571,7 @@ var widgetsTabs = $.ui.tabs;
$.widget( "ui.tooltip", { $.widget( "ui.tooltip", {
version: "1.13.1", version: "1.13.2",
options: { options: {
classes: { classes: {
"ui-tooltip": "ui-corner-all ui-widget-shadow" "ui-tooltip": "ui-corner-all ui-widget-shadow"

File diff suppressed because one or more lines are too long

View File

@ -155,14 +155,14 @@ if (empty($conf->global->MAIN_DISABLE_GLOBAL_WORKBOARD)) {
require_once DOL_DOCUMENT_ROOT.'/core/class/workboardresponse.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/workboardresponse.class.php';
// Number of actions to do (late) // Number of actions to do (late)
if (isModEnabled('agenda') && empty($conf->global->MAIN_DISABLE_BLOCK_AGENDA) && $user->rights->agenda->myactions->read) { if (isModEnabled('agenda') && empty($conf->global->MAIN_DISABLE_BLOCK_AGENDA) && $user->hasRight('agenda', 'myactions', 'read')) {
include_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php'; include_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
$board = new ActionComm($db); $board = new ActionComm($db);
$dashboardlines[$board->element] = $board->load_board($user); $dashboardlines[$board->element] = $board->load_board($user);
} }
// Number of project opened // Number of project opened
if (!empty($conf->project->enabled) && empty($conf->global->MAIN_DISABLE_BLOCK_PROJECT) && $user->hasRight('projet', 'lire')) { if (isModEnabled('project') && empty($conf->global->MAIN_DISABLE_BLOCK_PROJECT) && $user->hasRight('projet', 'lire')) {
include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
$board = new Project($db); $board = new Project($db);
$dashboardlines[$board->element] = $board->load_board($user); $dashboardlines[$board->element] = $board->load_board($user);
@ -202,7 +202,7 @@ if (empty($conf->global->MAIN_DISABLE_GLOBAL_WORKBOARD)) {
} }
// Number of suppliers orders a deal // Number of suppliers orders a deal
if (isModEnabled('supplier_order') && empty($conf->global->MAIN_DISABLE_BLOCK_SUPPLIER) && $user->rights->fournisseur->commande->lire) { if (isModEnabled('supplier_order') && empty($conf->global->MAIN_DISABLE_BLOCK_SUPPLIER) && $user->hasRight('fournisseur', 'commande', 'lire')) {
include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php'; include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
$board = new CommandeFournisseur($db); $board = new CommandeFournisseur($db);
$dashboardlines[$board->element.'_opened'] = $board->load_board($user, "opened"); $dashboardlines[$board->element.'_opened'] = $board->load_board($user, "opened");
@ -235,7 +235,7 @@ if (empty($conf->global->MAIN_DISABLE_GLOBAL_WORKBOARD)) {
} }
// Number of supplier invoices (paid) // Number of supplier invoices (paid)
if (isModEnabled('supplier_invoice') && empty($conf->global->MAIN_DISABLE_BLOCK_SUPPLIER) && !empty($user->rights->fournisseur->facture->lire)) { if (isModEnabled('supplier_invoice') && empty($conf->global->MAIN_DISABLE_BLOCK_SUPPLIER) && $user->hasRight('fournisseur', 'facture', 'lire')) {
include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
$board = new FactureFournisseur($db); $board = new FactureFournisseur($db);
$dashboardlines[$board->element] = $board->load_board($user); $dashboardlines[$board->element] = $board->load_board($user);

View File

@ -78,5 +78,7 @@ ALTER TABLE llx_ticket ADD email_date datetime after email_msgid;
INSERT INTO llx_const (name, entity, value, type, visible) VALUES ('MAIN_SECURITY_MAX_IMG_IN_HTML_CONTENT', 1, 1000, 'int', 0); INSERT INTO llx_const (name, entity, value, type, visible) VALUES ('MAIN_SECURITY_MAX_IMG_IN_HTML_CONTENT', 1, 1000, 'int', 0);
ALTER TABLE llx_adherent ADD COLUMN default_lang VARCHAR(6) DEFAULT NULL AFTER datefin;
-- Make sell-by or eat-by date mandatory -- Make sell-by or eat-by date mandatory
ALTER TABLE llx_product ADD COLUMN sell_or_eat_by_mandatory tinyint DEFAULT 0 NOT NULL AFTER tobatch; ALTER TABLE llx_product ADD COLUMN sell_or_eat_by_mandatory tinyint DEFAULT 0 NOT NULL AFTER tobatch;

View File

@ -71,6 +71,7 @@ create table llx_adherent
statut smallint NOT NULL DEFAULT 0, statut smallint NOT NULL DEFAULT 0,
public smallint NOT NULL DEFAULT 0, -- certain champ de la fiche sont ils public ou pas ? public smallint NOT NULL DEFAULT 0, -- certain champ de la fiche sont ils public ou pas ?
datefin datetime, -- end date of validity of the contribution / date de fin de validite de la cotisation datefin datetime, -- end date of validity of the contribution / date de fin de validite de la cotisation
default_lang varchar(6) DEFAULT NULL,
note_private text DEFAULT NULL, note_private text DEFAULT NULL,
note_public text DEFAULT NULL, note_public text DEFAULT NULL,
model_pdf varchar(255), model_pdf varchar(255),

View File

@ -125,18 +125,19 @@ class KnowledgeManagement extends DolibarrApi
* *
* Get a list of knowledgerecords * Get a list of knowledgerecords
* *
* @param string $sortfield Sort field * @param string $sortfield Sort field
* @param string $sortorder Sort order * @param string $sortorder Sort order
* @param int $limit Limit for list * @param int $limit Limit for list
* @param int $page Page number * @param int $page Page number
* @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.ref:like:'SO-%') and (t.date_creation:<:'20160101')" * @param int $category Use this param to filter list by category
* @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.ref:like:'SO-%') and (t.date_creation:<:'20160101')"
* @return array Array of order objects * @return array Array of order objects
* *
* @throws RestException * @throws RestException
* *
* @url GET /knowledgerecords/ * @url GET /knowledgerecords/
*/ */
public function index($sortfield = "t.rowid", $sortorder = 'ASC', $limit = 100, $page = 0, $sqlfilters = '') public function index($sortfield = "t.rowid", $sortorder = 'ASC', $limit = 100, $page = 0, $category = 0, $sqlfilters = '')
{ {
global $db, $conf; global $db, $conf;
@ -166,6 +167,9 @@ class KnowledgeManagement extends DolibarrApi
if ($restrictonsocid && (!DolibarrApiAccess::$user->rights->societe->client->voir && !$socid) || $search_sale > 0) { if ($restrictonsocid && (!DolibarrApiAccess::$user->rights->societe->client->voir && !$socid) || $search_sale > 0) {
$sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; // We need this table joined to the select in order to filter by sale $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; // We need this table joined to the select in order to filter by sale
} }
if ($category > 0) {
$sql .= ", ".$this->db->prefix()."categorie_knowledgemanagement as c";
}
$sql .= " WHERE 1 = 1"; $sql .= " WHERE 1 = 1";
// Example of use $mode // Example of use $mode
@ -188,6 +192,11 @@ class KnowledgeManagement extends DolibarrApi
if ($restrictonsocid && $search_sale > 0) { if ($restrictonsocid && $search_sale > 0) {
$sql .= " AND sc.fk_user = ".((int) $search_sale); $sql .= " AND sc.fk_user = ".((int) $search_sale);
} }
// Select products of given category
if ($category > 0) {
$sql .= " AND c.fk_categorie = ".((int) $category);
$sql .= " AND c.fk_knowledgemanagement = t.rowid";
}
if ($sqlfilters) { if ($sqlfilters) {
$errormessage = ''; $errormessage = '';
if (!DolibarrApi::_checkFilters($sqlfilters, $errormessage)) { if (!DolibarrApi::_checkFilters($sqlfilters, $errormessage)) {

View File

@ -468,6 +468,24 @@ class KnowledgeRecord extends CommonObject
$this->error .= $this->db->lasterror(); $this->error .= $this->db->lasterror();
$errorflag = -1; $errorflag = -1;
} }
// Delete all child tables
if (!$error) {
$elements = array('categorie_knowledgemanagement');
foreach ($elements as $table) {
if (!$error) {
$sql = "DELETE FROM ".MAIN_DB_PREFIX.$table;
$sql .= " WHERE fk_knowledgemanagement = ".(int) $this->id;
$result = $this->db->query($sql);
if (!$result) {
$error++;
$this->errors[] = $this->db->lasterror();
}
}
}
}
return $this->deleteCommon($user, $notrigger); return $this->deleteCommon($user, $notrigger);
//return $this->deleteCommon($user, $notrigger, 1); //return $this->deleteCommon($user, $notrigger, 1);
} }

View File

@ -2287,6 +2287,13 @@ DoesNotWorkWithAllThemes=Will not work with all themes
NoName=No name NoName=No name
ShowAdvancedOptions= Show advanced options ShowAdvancedOptions= Show advanced options
HideAdvancedoptions= Hide advanced options HideAdvancedoptions= Hide advanced options
CIDLookupURL=The module brings an URL that can be used by an external tool to get the name of a thirdparty or contact from its phone number. URL to use is:
OauthNotAvailableForAllAndHadToBeCreatedBefore=OAUTH2 authentication is not available for all hosts, and a token with the right permissions must have been created upstream with the OAUTH module
MAIN_MAIL_SMTPS_OAUTH_SERVICE=OAUTH2 authentication service
DontForgetCreateTokenOauthMod=A token with the right permissions must have been created upstream with the OAUTH module
MAIN_MAIL_SMTPS_AUTH_TYPE=Authentification method
UsePassword=Use a password
UseOauth=Use a OAUTH token
Images=Images Images=Images
MaxNumberOfImagesInGetPost=Max number of images allowed in GETPOST check MaxNumberOfImagesInGetPost=Max number of images allowed in GETPOST check
CIDLookupURL=The module brings an URL that can be used by an external tool to get the name of a thirdparty or contact from its phone number. URL to use is: CIDLookupURL=The module brings an URL that can be used by an external tool to get the name of a thirdparty or contact from its phone number. URL to use is:

View File

@ -328,3 +328,6 @@ FailedToGetFile=Failed to get files %s
ErrorFTPNodisconnect=Error to disconnect FTP/SFTP server ErrorFTPNodisconnect=Error to disconnect FTP/SFTP server
FileWasUpload=File <b>%s</b> was upload FileWasUpload=File <b>%s</b> was upload
FTPFailedToUploadFile=Failed to upload file <b>%s</b>. FTPFailedToUploadFile=Failed to upload file <b>%s</b>.
AddFolder=Create folder
FileWasCreateFolder=Folder <b>%s</b> was create
FTPFailedToCreateFolder=Failed to create folder <b>%s</b>.

View File

@ -2286,3 +2286,10 @@ NoName=Sans nom
ShowAdvancedOptions= Show advanced options ShowAdvancedOptions= Show advanced options
HideAdvancedoptions= Hide advanced options HideAdvancedoptions= Hide advanced options
CIDLookupURL=The module brings an URL that can be used by an external tool to get the name of a thirdparty or contact from its phone number. URL to use is: CIDLookupURL=The module brings an URL that can be used by an external tool to get the name of a thirdparty or contact from its phone number. URL to use is:
DoesNotWorkWithAllThemes=Ne fonctionne pas avec tous les thèmes
OauthNotAvailableForAllAndHadToBeCreatedBefore=L'authentification OAUTH2 n'est pas disponible pour tous les hôtes, de plus, un jeton avec les bonnes permissions doit avoir été créé en amont avec le module OAUTH
MAIN_MAIL_SMTPS_OAUTH_SERVICE=Service d'authentification OAUTH2
DontForgetCreateTokenOauthMod=Un jeton avec les bonnes permissions doit avoir été créé en amont avec le module OAUTH
MAIN_MAIL_SMTPS_AUTH_TYPE=Méthode d'authentication
UsePassword=Utiliser un mot de pass
UseOauth=Utiliser un jeton d'authentification OAUTH

View File

@ -101,7 +101,7 @@ class Mo extends CommonObject
'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>1, 'visible'=>-2, 'position'=>1, 'notnull'=>1, 'index'=>1, 'comment'=>"Id",), 'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>1, 'visible'=>-2, 'position'=>1, 'notnull'=>1, 'index'=>1, 'comment'=>"Id",),
'entity' => array('type'=>'integer', 'label'=>'Entity', 'enabled'=>1, 'visible'=>0, 'position'=>5, 'notnull'=>1, 'default'=>'1', 'index'=>1), 'entity' => array('type'=>'integer', 'label'=>'Entity', 'enabled'=>1, 'visible'=>0, 'position'=>5, 'notnull'=>1, 'default'=>'1', 'index'=>1),
'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>4, 'position'=>10, 'notnull'=>1, 'default'=>'(PROV)', 'index'=>1, 'searchall'=>1, 'comment'=>"Reference of object", 'showoncombobox'=>'1', 'noteditable'=>1), 'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>4, 'position'=>10, 'notnull'=>1, 'default'=>'(PROV)', 'index'=>1, 'searchall'=>1, 'comment'=>"Reference of object", 'showoncombobox'=>'1', 'noteditable'=>1),
'fk_bom' => array('type'=>'integer:Bom:bom/class/bom.class.php:0:t.status=1', 'filter'=>'active=1', 'label'=>'BOM', 'enabled'=>'$conf->bom->enabled', 'visible'=>1, 'position'=>33, 'notnull'=>-1, 'index'=>1, 'comment'=>"Original BOM", 'css'=>'minwidth100 maxwidth300', 'csslist'=>'nowraponall'), 'fk_bom' => array('type'=>'integer:Bom:bom/class/bom.class.php:0:t.status=1', 'filter'=>'active=1', 'label'=>'BOM', 'enabled'=>'$conf->bom->enabled', 'visible'=>1, 'position'=>33, 'notnull'=>-1, 'index'=>1, 'comment'=>"Original BOM", 'css'=>'minwidth100 maxwidth300', 'csslist'=>'nowraponall', 'picto'=>'bom'),
'mrptype' => array('type'=>'integer', 'label'=>'Type', 'enabled'=>1, 'visible'=>1, 'position'=>34, 'notnull'=>1, 'default'=>'0', 'arrayofkeyval'=>array(0=>'Manufacturing', 1=>'Disassemble'), 'css'=>'minwidth150', 'csslist'=>'minwidth150 center'), 'mrptype' => array('type'=>'integer', 'label'=>'Type', 'enabled'=>1, 'visible'=>1, 'position'=>34, 'notnull'=>1, 'default'=>'0', 'arrayofkeyval'=>array(0=>'Manufacturing', 1=>'Disassemble'), 'css'=>'minwidth150', 'csslist'=>'minwidth150 center'),
'fk_product' => array('type'=>'integer:Product:product/class/product.class.php:0', 'label'=>'Product', 'enabled'=>'$conf->product->enabled', 'visible'=>1, 'position'=>35, 'notnull'=>1, 'index'=>1, 'comment'=>"Product to produce", 'css'=>'maxwidth300', 'csslist'=>'tdoverflowmax100', 'picto'=>'product'), 'fk_product' => array('type'=>'integer:Product:product/class/product.class.php:0', 'label'=>'Product', 'enabled'=>'$conf->product->enabled', 'visible'=>1, 'position'=>35, 'notnull'=>1, 'index'=>1, 'comment'=>"Product to produce", 'css'=>'maxwidth300', 'csslist'=>'tdoverflowmax100', 'picto'=>'product'),
'qty' => array('type'=>'real', 'label'=>'QtyToProduce', 'enabled'=>1, 'visible'=>1, 'position'=>40, 'notnull'=>1, 'comment'=>"Qty to produce", 'css'=>'width75', 'default'=>1, 'isameasure'=>1), 'qty' => array('type'=>'real', 'label'=>'QtyToProduce', 'enabled'=>1, 'visible'=>1, 'position'=>40, 'notnull'=>1, 'comment'=>"Qty to produce", 'css'=>'width75', 'default'=>1, 'isameasure'=>1),
@ -1375,13 +1375,13 @@ class Mo extends CommonObject
print '<tr class="liste_titre">'; print '<tr class="liste_titre">';
// Product or sub-bom // Product or sub-bom
print '<td class="linecoldescription">'.$langs->trans('Description'); print '<td class="linecoldescription">'.$langs->trans('Ref');
if (!empty($conf->global->BOM_SUB_BOM)) { if (!empty($conf->global->BOM_SUB_BOM)) {
print ' &nbsp; <a id="show_all" href="#">'.img_picto('', 'folder-open', 'class="paddingright"').$langs->trans("ExpandAll").'</a>&nbsp;&nbsp;'; print ' &nbsp; <a id="show_all" href="#">'.img_picto('', 'folder-open', 'class="paddingright"').$langs->trans("ExpandAll").'</a>&nbsp;&nbsp;';
print '<a id="hide_all" href="#">'.img_picto('', 'folder', 'class="paddingright"').$langs->trans("UndoExpandAll").'</a>&nbsp;'; print '<a id="hide_all" href="#">'.img_picto('', 'folder', 'class="paddingright"').$langs->trans("UndoExpandAll").'</a>&nbsp;';
} }
print '</td>'; print '</td>';
print '<td>'.$langs->trans('Ref').'</td>'; // Qty
print '<td class="right">'.$langs->trans('Qty'); print '<td class="right">'.$langs->trans('Qty');
if ($this->bom->bomtype == 0) { if ($this->bom->bomtype == 0) {
print ' <span class="opacitymedium">('.$langs->trans("ForAQuantityOf", $this->bom->qty).')</span>'; print ' <span class="opacitymedium">('.$langs->trans("ForAQuantityOf", $this->bom->qty).')</span>';
@ -1395,7 +1395,7 @@ class Mo extends CommonObject
print '<td class="center">'.$langs->trans('DisableStockChange').'</td>'; print '<td class="center">'.$langs->trans('DisableStockChange').'</td>';
print '<td class="center">'.$langs->trans('MoChildGenerate').'</td>'; print '<td class="center">'.$langs->trans('MoChildGenerate').'</td>';
//print '<td class="center">'.$form->showCheckAddButtons('checkforselect', 1).'</td>'; //print '<td class="center">'.$form->showCheckAddButtons('checkforselect', 1).'</td>';
// print '<td class="center"></td>'; //print '<td class="center"></td>';
print '</tr>'; print '</tr>';
$i = 0; $i = 0;

View File

@ -257,6 +257,7 @@ if (empty($reshook)) {
// Process line to produce // Process line to produce
$pos = 0; $pos = 0;
foreach ($object->lines as $line) { foreach ($object->lines as $line) {
if ($line->role == 'toproduce') { if ($line->role == 'toproduce') {
$tmpproduct = new Product($db); $tmpproduct = new Product($db);
@ -430,6 +431,8 @@ $tmpstockmovement = new MouvementStock($db);
$help_url = 'EN:Module_Manufacturing_Orders|FR:Module_Ordres_de_Fabrication'; $help_url = 'EN:Module_Manufacturing_Orders|FR:Module_Ordres_de_Fabrication';
llxHeader('', $langs->trans('Mo'), $help_url, '', 0, 0, array('/mrp/js/lib_dispatch.js.php')); llxHeader('', $langs->trans('Mo'), $help_url, '', 0, 0, array('/mrp/js/lib_dispatch.js.php'));
$newToken = newToken();
// Part to show record // Part to show record
if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) { if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) {
$res = $object->fetch_thirdparty(); $res = $object->fetch_thirdparty();
@ -588,7 +591,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
if ($object->status == $object::STATUS_DRAFT) { if ($object->status == $object::STATUS_DRAFT) {
if ($permissiontoadd) { if ($permissiontoadd) {
if (empty($object->table_element_line) || (is_array($object->lines) && count($object->lines) > 0)) { if (empty($object->table_element_line) || (is_array($object->lines) && count($object->lines) > 0)) {
print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=validate">'.$langs->trans("Validate").'</a>'; print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=validate&token='.$newToken.'">'.$langs->trans("Validate").'</a>';
} else { } else {
$langs->load("errors"); $langs->load("errors");
print '<a class="butActionRefused" href="" title="'.$langs->trans("ErrorAddAtLeastOneLineFirst").'">'.$langs->trans("Validate").'</a>'; print '<a class="butActionRefused" href="" title="'.$langs->trans("ErrorAddAtLeastOneLineFirst").'">'.$langs->trans("Validate").'</a>';
@ -599,7 +602,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
// Consume or produce // Consume or produce
if ($object->status == Mo::STATUS_VALIDATED || $object->status == Mo::STATUS_INPROGRESS) { if ($object->status == Mo::STATUS_VALIDATED || $object->status == Mo::STATUS_INPROGRESS) {
if ($permissiontoproduce) { if ($permissiontoproduce) {
print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=consumeorproduce">'.$langs->trans('ConsumeOrProduce').'</a>'; print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=consumeorproduce&token='.$newToken.'">'.$langs->trans('ConsumeOrProduce').'</a>';
} else { } else {
print '<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("NotEnoughPermissions").'">'.$langs->trans('ConsumeOrProduce').'</a>'; print '<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("NotEnoughPermissions").'">'.$langs->trans('ConsumeOrProduce').'</a>';
} }
@ -610,7 +613,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
// ConsumeAndProduceAll // ConsumeAndProduceAll
if ($object->status == Mo::STATUS_VALIDATED || $object->status == Mo::STATUS_INPROGRESS) { if ($object->status == Mo::STATUS_VALIDATED || $object->status == Mo::STATUS_INPROGRESS) {
if ($permissiontoproduce) { if ($permissiontoproduce) {
print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=consumeandproduceall">'.$langs->trans('ConsumeAndProduceAll').'</a>'; print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=consumeandproduceall&token='.$newToken.'">'.$langs->trans('ConsumeAndProduceAll').'</a>';
} else { } else {
print '<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("NotEnoughPermissions").'">'.$langs->trans('ConsumeAndProduceAll').'</a>'; print '<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("NotEnoughPermissions").'">'.$langs->trans('ConsumeAndProduceAll').'</a>';
} }
@ -627,21 +630,21 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
$nbProduced += $lineproduced['qty']; $nbProduced += $lineproduced['qty'];
} }
if ($nbProduced > 0) { // If production has started, we can close it if ($nbProduced > 0) { // If production has started, we can close it
print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=confirm_produced&confirm=yes">'.$langs->trans("Close").'</a>'."\n"; print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=confirm_produced&confirm=yes&token='.$newToken.'">'.$langs->trans("Close").'</a>'."\n";
} else { } else {
print '<a class="butActionRefused" href="#" title="'.$langs->trans("GoOnTabProductionToProduceFirst", $langs->transnoentitiesnoconv("Production")).'">'.$langs->trans("Close").'</a>'."\n"; print '<a class="butActionRefused" href="#" title="'.$langs->trans("GoOnTabProductionToProduceFirst", $langs->transnoentitiesnoconv("Production")).'">'.$langs->trans("Close").'</a>'."\n";
} }
print '<a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=confirm_close&confirm=yes">'.$langs->trans("Cancel").'</a>'."\n"; print '<a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=confirm_close&confirm=yes&token='.$newToken.'">'.$langs->trans("Cancel").'</a>'."\n";
} }
if ($object->status == $object::STATUS_CANCELED) { if ($object->status == $object::STATUS_CANCELED) {
print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=confirm_reopen&confirm=yes">'.$langs->trans("Re-Open").'</a>'."\n"; print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=confirm_reopen&confirm=yes&token='.$newToken.'">'.$langs->trans("Re-Open").'</a>'."\n";
} }
if ($object->status == $object::STATUS_PRODUCED) { if ($object->status == $object::STATUS_PRODUCED) {
if ($permissiontoproduce) { if ($permissiontoproduce) {
print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=confirm_reopen">'.$langs->trans('ReOpen').'</a>'; print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=confirm_reopen&token='.$newToken.'">'.$langs->trans('ReOpen').'</a>';
} else { } else {
print '<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("NotEnoughPermissions").'">'.$langs->trans('ReOpen').'</a>'; print '<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("NotEnoughPermissions").'">'.$langs->trans('ReOpen').'</a>';
} }
@ -708,7 +711,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
print '<div class="clearboth"></div>'; print '<div class="clearboth"></div>';
$url = $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=addconsumeline&token='.newToken(); $url = $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=addconsumeline&token='.newToken();
$permissiontoaddaconsumeline = $object->status != $object::STATUS_PRODUCED && $object->status != $object::STATUS_CANCELED && $action != 'consumeorproduce' && $action != 'consumeandproduceall'; $permissiontoaddaconsumeline = $object->status != $object::STATUS_PRODUCED && $object->status != $object::STATUS_CANCELED;
$parameters = array('morecss'=>'reposition'); $parameters = array('morecss'=>'reposition');
$newcardbutton = ''; $newcardbutton = '';
@ -996,6 +999,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
$i = 1; $i = 1;
print '<!-- Enter line to consume -->'."\n"; print '<!-- Enter line to consume -->'."\n";
print '<tr name="batch_'.$line->id.'_'.$i.'">'; print '<tr name="batch_'.$line->id.'_'.$i.'">';
// Ref
print '<td><span class="opacitymedium">'.$langs->trans("ToConsume").'</span></td>'; print '<td><span class="opacitymedium">'.$langs->trans("ToConsume").'</span></td>';
$preselected = (GETPOSTISSET('qty-'.$line->id.'-'.$i) ? GETPOST('qty-'.$line->id.'-'.$i) : max(0, $line->qty - $alreadyconsumed)); $preselected = (GETPOSTISSET('qty-'.$line->id.'-'.$i) ? GETPOST('qty-'.$line->id.'-'.$i) : max(0, $line->qty - $alreadyconsumed));
if ($action == 'consumeorproduce' && !GETPOSTISSET('qty-'.$line->id.'-'.$i)) { if ($action == 'consumeorproduce' && !GETPOSTISSET('qty-'.$line->id.'-'.$i)) {
@ -1044,12 +1048,9 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
$preselected = (GETPOSTISSET('batch-'.$line->id.'-'.$i) ? GETPOST('batch-'.$line->id.'-'.$i) : ''); $preselected = (GETPOSTISSET('batch-'.$line->id.'-'.$i) ? GETPOST('batch-'.$line->id.'-'.$i) : '');
print '<input type="text" class="width50" name="batch-'.$line->id.'-'.$i.'" value="'.$preselected.'" list="batch-'.$line->id.'-'.$i.'">'; print '<input type="text" class="width50" name="batch-'.$line->id.'-'.$i.'" value="'.$preselected.'" list="batch-'.$line->id.'-'.$i.'">';
print $formproduct->selectLotDataList('batch-'.$line->id.'-'.$i, 0, $line->fk_product, '', ''); print $formproduct->selectLotDataList('batch-'.$line->id.'-'.$i, 0, $line->fk_product, '', '');
}
print '</td>';
print '<td>';
if ($tmpproduct->status_batch) {
$type = 'batch'; $type = 'batch';
print img_picto($langs->trans('AddStockLocationLine'), 'split.png', 'class="splitbutton" onClick="addDispatchLine('.$line->id.', \''.$type.'\', \'qtymissingconsume\')"'); print ' '.img_picto($langs->trans('AddStockLocationLine'), 'split.png', 'class="splitbutton" onClick="addDispatchLine('.((int) $line->id).', \''.dol_escape_js($type).'\', \'qtymissingconsume\')"');
} }
print '</td>'; print '</td>';
} }
@ -1094,10 +1095,12 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
$newcardbutton = ''; $newcardbutton = '';
$url = $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=addproduceline&token='.newToken(); $url = $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=addproduceline&token='.newToken();
$permissiontoaddaproductline = $object->status != $object::STATUS_PRODUCED && $object->status != $object::STATUS_CANCELED && $action != 'consumeorproduce' && $action != 'consumeandproduceall'; $permissiontoaddaproductline = $object->status != $object::STATUS_PRODUCED && $object->status != $object::STATUS_CANCELED;
$parameters = array('morecss'=>'reposition'); $parameters = array('morecss'=>'reposition');
if ($nblinetoproduce == 0 || $object->mrptype == 1) { if ($action != 'consumeorproduce' && $action != 'consumeandproduceall') {
$newcardbutton = dolGetButtonTitle($langs->trans('AddNewProduceLines'), '', 'fa fa-plus-circle size15x', $url, '', $permissiontoaddaproductline, $parameters); if ($nblinetoproduce == 0 || $object->mrptype == 1) {
$newcardbutton = dolGetButtonTitle($langs->trans('AddNewProduceLines'), '', 'fa fa-plus-circle size15x', $url, '', $permissiontoaddaproductline, $parameters);
}
} }
print load_fiche_titre($langs->trans('Production'), $newcardbutton, '', 0, '', ''); print load_fiche_titre($langs->trans('Production'), $newcardbutton, '', 0, '', '');
@ -1196,12 +1199,15 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
print '<td class="right">'.$line->qty.'</td>'; print '<td class="right">'.$line->qty.'</td>';
if ($permissiontoupdatecost) { if ($permissiontoupdatecost) {
// Defined $manufacturingcost // Defined $manufacturingcost
$manufacturingcost = $bomcost; $manufacturingcost = 0;
if (empty($manufacturingcost)) { if ($object->mrptype == 0) { // If MO is a "Manufacture" type (and not "Disassemble"
$manufacturingcost = price2num($tmpproduct->cost_price, 'MU'); $manufacturingcost = $bomcost;
} if (empty($manufacturingcost)) {
if (empty($manufacturingcost)) { $manufacturingcost = price2num($tmpproduct->cost_price, 'MU');
$manufacturingcost = price2num($tmpproduct->pmp, 'MU'); }
if (empty($manufacturingcost)) {
$manufacturingcost = price2num($tmpproduct->pmp, 'MU');
}
} }
print '<td class="right nowraponall">'; print '<td class="right nowraponall">';
@ -1300,19 +1306,22 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
print '<td class="right"><input type="text" class="width50 right" id="qtytoproduce-'.$line->id.'-'.$i.'" name="qtytoproduce-'.$line->id.'-'.$i.'" value="'.$preselected.'"></td>'; print '<td class="right"><input type="text" class="width50 right" id="qtytoproduce-'.$line->id.'-'.$i.'" name="qtytoproduce-'.$line->id.'-'.$i.'" value="'.$preselected.'"></td>';
if ($permissiontoupdatecost) { if ($permissiontoupdatecost) {
// Defined $manufacturingcost // Defined $manufacturingcost
$manufacturingcost = $bomcost; $manufacturingcost = 0;
if (empty($manufacturingcost)) { if ($object->mrptype == 0) { // If MO is a "Manufacture" type (and not "Disassemble"
$manufacturingcost = price2num($tmpproduct->cost_price, 'MU'); $manufacturingcost = $bomcost;
} if (empty($manufacturingcost)) {
if (empty($manufacturingcost)) { $manufacturingcost = price2num($tmpproduct->cost_price, 'MU');
$manufacturingcost = price2num($tmpproduct->pmp, 'MU'); }
if (empty($manufacturingcost)) {
$manufacturingcost = price2num($tmpproduct->pmp, 'MU');
}
} }
if ($tmpproduct->type == Product::TYPE_PRODUCT || !empty($conf->global->STOCK_SUPPORTS_SERVICES)) { if ($tmpproduct->type == Product::TYPE_PRODUCT || !empty($conf->global->STOCK_SUPPORTS_SERVICES)) {
$preselected = (GETPOSTISSET('pricetoproduce-'.$line->id.'-'.$i) ? GETPOST('pricetoproduce-'.$line->id.'-'.$i) : price($manufacturingcost)); $preselected = (GETPOSTISSET('pricetoproduce-'.$line->id.'-'.$i) ? GETPOST('pricetoproduce-'.$line->id.'-'.$i) : ($manufacturingcost ? price($manufacturingcost) : ''));
print '<td class="right"><input type="text" class="width50 right" name="pricetoproduce-'.$line->id.'-'.$i.'" value="'.$preselected.'"></td>'; print '<td class="right"><input type="text" class="width50 right" name="pricetoproduce-'.$line->id.'-'.$i.'" value="'.$preselected.'"></td>';
} else { } else {
print '<td><input type="hidden" class="width50 right" name="pricetoproduce-'.$line->id.'-'.$i.'" value="'.$manufacturingcost.'"></td>'; print '<td><input type="hidden" class="width50 right" name="pricetoproduce-'.$line->id.'-'.$i.'" value="'.($manufacturingcost ? $manufacturingcost : '').'"></td>';
} }
} }
print '<td></td>'; print '<td></td>';

View File

@ -44,6 +44,7 @@ $res = $tmpbom->fetch($line->fk_bom_child);
<!-- BEGIN PHP TEMPLATE originproductline.tpl.php --> <!-- BEGIN PHP TEMPLATE originproductline.tpl.php -->
<?php <?php
print '<tr class="oddeven'.(empty($this->tpl['strike']) ? '' : ' strikefordisabled').'">'; print '<tr class="oddeven'.(empty($this->tpl['strike']) ? '' : ' strikefordisabled').'">';
// Ref or label
print '<td>'; print '<td>';
if ($res) { if ($res) {
print $tmpproduct->getNomUrl(1); print $tmpproduct->getNomUrl(1);
@ -58,7 +59,7 @@ if ($res) {
print $this->tpl['label']; print $this->tpl['label'];
} }
print '</td>'; print '</td>';
//print '<td>'.$this->tpl['label'].'</td>'; // Qty
print '<td class="right">'.$this->tpl['qty'].(($this->tpl['efficiency'] > 0 && $this->tpl['efficiency'] < 1) ? ' / '.$form->textwithpicto($this->tpl['efficiency'], $langs->trans("ValueOfMeansLoss")).' = '.$qtytoconsumeforline : '').'</td>'; print '<td class="right">'.$this->tpl['qty'].(($this->tpl['efficiency'] > 0 && $this->tpl['efficiency'] < 1) ? ' / '.$form->textwithpicto($this->tpl['efficiency'], $langs->trans("ValueOfMeansLoss")).' = '.$qtytoconsumeforline : '').'</td>';
print '<td class="center">'.(empty($this->tpl['stock']) ? 0 : price2num($this->tpl['stock'], 'MS')); print '<td class="center">'.(empty($this->tpl['stock']) ? 0 : price2num($this->tpl['stock'], 'MS'));
if ($this->tpl['seuil_stock_alerte'] != '' && ($this->tpl['stock'] < $this->tpl['seuil_stock_alerte'])) { if ($this->tpl['seuil_stock_alerte'] != '' && ($this->tpl['stock'] < $this->tpl['seuil_stock_alerte'])) {
@ -78,18 +79,19 @@ $selected = 1;
if (!empty($selectedLines) && !in_array($this->tpl['id'], $selectedLines)) { if (!empty($selectedLines) && !in_array($this->tpl['id'], $selectedLines)) {
$selected = 0; $selected = 0;
} }
print '<td class="center">';
//print '<input id="cb'.$this->tpl['id'].'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$this->tpl['id'].'"'.($selected?' checked="checked"':'').'>';
print '</td>';
if ($tmpbom->id) { if ($tmpbom->id > 0) {
print '<td class="center">'; print '<td class="center">';
print '<input type="checkbox" name="bomlineid[]" value="' . $line->id . '">'; print '<input type="checkbox" name="bomlineid[]" value="' . $line->id . '">';
print '</td>'; print '</td>';
} else { } else {
print '<td class="center">&nbsp;</td>'; print '<td class="center"></td>';
} }
//print '<td class="center">';
//print '<input id="cb'.$this->tpl['id'].'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$this->tpl['id'].'"'.($selected?' checked="checked"':'').'>';
//print '</td>';
print '</tr>'."\n"; print '</tr>'."\n";
// Select of all the sub-BOM lines // Select of all the sub-BOM lines

View File

@ -16,7 +16,7 @@
* Copyright (C) 2016-2022 Charlene Benke <charlene@patas-monkey.com> * Copyright (C) 2016-2022 Charlene Benke <charlene@patas-monkey.com>
* Copyright (C) 2016 Meziane Sof <virtualsof@yahoo.fr> * Copyright (C) 2016 Meziane Sof <virtualsof@yahoo.fr>
* Copyright (C) 2017 Josep Lluís Amador <joseplluis@lliuretic.cat> * Copyright (C) 2017 Josep Lluís Amador <joseplluis@lliuretic.cat>
* Copyright (C) 2019-2021 Frédéric France <frederic.france@netlogic.fr> * Copyright (C) 2019-2022 Frédéric France <frederic.france@netlogic.fr>
* Copyright (C) 2019-2020 Thibault FOUCART <support@ptibogxiv.net> * Copyright (C) 2019-2020 Thibault FOUCART <support@ptibogxiv.net>
* Copyright (C) 2020 Pierre Ardoin <mapiolca@me.com> * Copyright (C) 2020 Pierre Ardoin <mapiolca@me.com>
* *
@ -1973,7 +1973,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
print '<tr><td class="tdtop">'.$langs->trans("Description").'</td><td>'; print '<tr><td class="tdtop">'.$langs->trans("Description").'</td><td>';
// We use dolibarr_details as type of DolEditor here, because we must not accept images as description is included into PDF and not accepted by TCPDF. // We use dolibarr_details as type of DolEditor here, because we must not accept images as description is included into PDF and not accepted by TCPDF.
$doleditor = new DolEditor('desc', $object->description, '', 160, 'dolibarr_details', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_PRODUCTDESC'), ROWS_4, '90%'); $doleditor = new DolEditor('desc', GETPOSTISSET('desc') ? GETPOST('desc', 'restricthtml') : $object->description, '', 160, 'dolibarr_details', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_PRODUCTDESC'), ROWS_4, '90%');
$doleditor->Create(); $doleditor->Create();
print "</td></tr>"; print "</td></tr>";
@ -1983,7 +1983,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
if (empty($conf->global->PRODUCT_DISABLE_PUBLIC_URL)) { if (empty($conf->global->PRODUCT_DISABLE_PUBLIC_URL)) {
print '<tr><td>'.$langs->trans("PublicUrl").'</td><td>'; print '<tr><td>'.$langs->trans("PublicUrl").'</td><td>';
print img_picto('', 'globe', 'class="pictofixedwidth"'); print img_picto('', 'globe', 'class="pictofixedwidth"');
print '<input type="text" name="url" class="quatrevingtpercent" value="'.$object->url.'">'; print '<input type="text" name="url" class="quatrevingtpercent" value="'.(GETPOSTISSET('url') ? GETPOST('url') : $object->url).'">';
print '</td></tr>'; print '</td></tr>';
} }

View File

@ -253,7 +253,7 @@ class Products extends DolibarrApi
if (!$ids_only) { if (!$ids_only) {
$product_static = new Product($this->db); $product_static = new Product($this->db);
if ($product_static->fetch($obj->rowid)) { if ($product_static->fetch($obj->rowid)) {
if ($includestockdata && DolibarrApiAccess::$user->rights->stock->lire) { if (!empty($includestockdata) && DolibarrApiAccess::$user->rights->stock->lire) {
$product_static->load_stock(); $product_static->load_stock();
if (is_array($product_static->stock_warehouse)) { if (is_array($product_static->stock_warehouse)) {
@ -1644,10 +1644,10 @@ class Products extends DolibarrApi
$combinations[$key]->attributes = $prodc2vp->fetchByFkCombination((int) $combination->id); $combinations[$key]->attributes = $prodc2vp->fetchByFkCombination((int) $combination->id);
$combinations[$key] = $this->_cleanObjectDatas($combinations[$key]); $combinations[$key] = $this->_cleanObjectDatas($combinations[$key]);
if ($includestock==1 && DolibarrApiAccess::$user->rights->stock->lire) { if (!empty($includestock) && DolibarrApiAccess::$user->rights->stock->lire) {
$productModel = new Product($this->db); $productModel = new Product($this->db);
$productModel->fetch((int) $combination->fk_product_child); $productModel->fetch((int) $combination->fk_product_child);
$productModel->load_stock(); $productModel->load_stock($includestock);
$combinations[$key]->stock_warehouse = $this->_cleanObjectDatas($productModel)->stock_warehouse; $combinations[$key]->stock_warehouse = $this->_cleanObjectDatas($productModel)->stock_warehouse;
} }
} }
@ -2040,8 +2040,8 @@ class Products extends DolibarrApi
throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
} }
if ($includestockdata && DolibarrApiAccess::$user->rights->stock->lire) { if (!empty($includestockdata) && DolibarrApiAccess::$user->rights->stock->lire) {
$this->product->load_stock(); $this->product->load_stock($includestockdata);
if (is_array($this->product->stock_warehouse)) { if (is_array($this->product->stock_warehouse)) {
foreach ($this->product->stock_warehouse as $keytmp => $valtmp) { foreach ($this->product->stock_warehouse as $keytmp => $valtmp) {

View File

@ -3038,12 +3038,13 @@ class Product extends CommonObject
/** /**
* Charge tableau des stats commande fournisseur pour le produit/service * Charge tableau des stats commande fournisseur pour le produit/service
* *
* @param int $socid Id societe pour filtrer sur une societe * @param int $socid Id societe pour filtrer sur une societe
* @param string $filtrestatut Id des statuts pour filtrer sur des statuts * @param string $filtrestatut Id des statuts pour filtrer sur des statuts
* @param int $forVirtualStock Ignore rights filter for virtual stock calculation. * @param int $forVirtualStock Ignore rights filter for virtual stock calculation.
* @return int Array of stats in $this->stats_commande_fournisseur, <0 if ko or >0 if ok * @param int $dateofvirtualstock Date of virtual stock
* @return int Array of stats in $this->stats_commande_fournisseur, <0 if ko or >0 if ok
*/ */
public function load_stats_commande_fournisseur($socid = 0, $filtrestatut = '', $forVirtualStock = 0) public function load_stats_commande_fournisseur($socid = 0, $filtrestatut = '', $forVirtualStock = 0, $dateofvirtualstock = null)
{ {
// phpcs:enable // phpcs:enable
global $conf, $user, $hookmanager, $action; global $conf, $user, $hookmanager, $action;
@ -3069,6 +3070,9 @@ class Product extends CommonObject
if ($filtrestatut != '') { if ($filtrestatut != '') {
$sql .= " AND c.fk_statut in (".$this->db->sanitize($filtrestatut).")"; // Peut valoir 0 $sql .= " AND c.fk_statut in (".$this->db->sanitize($filtrestatut).")"; // Peut valoir 0
} }
if (!empty($dateofvirtualstock)) {
$sql .= " AND c.date_livraison <= '".$this->db->idate($dateofvirtualstock)."'";
}
$result = $this->db->query($sql); $result = $this->db->query($sql);
if ($result) { if ($result) {
@ -3181,12 +3185,13 @@ class Product extends CommonObject
/** /**
* Charge tableau des stats réception fournisseur pour le produit/service * Charge tableau des stats réception fournisseur pour le produit/service
* *
* @param int $socid Id societe pour filtrer sur une societe * @param int $socid Id societe pour filtrer sur une societe
* @param string $filtrestatut Id statut pour filtrer sur un statut * @param string $filtrestatut Id statut pour filtrer sur un statut
* @param int $forVirtualStock Ignore rights filter for virtual stock calculation. * @param int $forVirtualStock Ignore rights filter for virtual stock calculation.
* @param int $dateofvirtualstock Date of virtual stock
* @return int Array of stats in $this->stats_reception, <0 if ko or >0 if ok * @return int Array of stats in $this->stats_reception, <0 if ko or >0 if ok
*/ */
public function load_stats_reception($socid = 0, $filtrestatut = '', $forVirtualStock = 0) public function load_stats_reception($socid = 0, $filtrestatut = '', $forVirtualStock = 0, $dateofvirtualstock = null)
{ {
// phpcs:enable // phpcs:enable
global $conf, $user, $hookmanager, $action; global $conf, $user, $hookmanager, $action;
@ -3212,6 +3217,9 @@ class Product extends CommonObject
if ($filtrestatut <> '') { if ($filtrestatut <> '') {
$sql .= " AND cf.fk_statut IN (".$this->db->sanitize($filtrestatut).")"; $sql .= " AND cf.fk_statut IN (".$this->db->sanitize($filtrestatut).")";
} }
if (!empty($dateofvirtualstock)) {
$sql .= " AND fd.datec <= '".$this->db->idate($dateofvirtualstock)."'";
}
$result = $this->db->query($sql); $result = $this->db->query($sql);
if ($result) { if ($result) {
@ -3238,12 +3246,13 @@ class Product extends CommonObject
/** /**
* Charge tableau des stats production pour le produit/service * Charge tableau des stats production pour le produit/service
* *
* @param int $socid Id societe pour filtrer sur une societe * @param int $socid Id societe pour filtrer sur une societe
* @param string $filtrestatut Id statut pour filtrer sur un statut * @param string $filtrestatut Id statut pour filtrer sur un statut
* @param int $forVirtualStock Ignore rights filter for virtual stock calculation. * @param int $forVirtualStock Ignore rights filter for virtual stock calculation.
* @param int $dateofvirtualstock Date of virtual stock
* @return integer Array of stats in $this->stats_mrptoproduce (nb=nb of order, qty=qty ordered), <0 if ko or >0 if ok * @return integer Array of stats in $this->stats_mrptoproduce (nb=nb of order, qty=qty ordered), <0 if ko or >0 if ok
*/ */
public function load_stats_inproduction($socid = 0, $filtrestatut = '', $forVirtualStock = 0) public function load_stats_inproduction($socid = 0, $filtrestatut = '', $forVirtualStock = 0, $dateofvirtualstock = null)
{ {
// phpcs:enable // phpcs:enable
global $conf, $user, $hookmanager, $action; global $conf, $user, $hookmanager, $action;
@ -3268,6 +3277,9 @@ class Product extends CommonObject
if ($filtrestatut <> '') { if ($filtrestatut <> '') {
$sql .= " AND m.status IN (".$this->db->sanitize($filtrestatut).")"; $sql .= " AND m.status IN (".$this->db->sanitize($filtrestatut).")";
} }
if (!empty($dateofvirtualstock)) {
$sql .= " AND m.date_valid <= '".$this->db->idate($dateofvirtualstock)."'"; // better date to code ? end of production ?
}
$sql .= " GROUP BY role"; $sql .= " GROUP BY role";
$this->stats_mrptoconsume['customers'] = 0; $this->stats_mrptoconsume['customers'] = 0;
@ -5037,7 +5049,7 @@ class Product extends CommonObject
$result .= (img_object(($notooltip ? '' : $label), 'service', ($notooltip ? 'class="paddingright"' : 'class="paddingright classfortooltip"'), 0, 0, $notooltip ? 0 : 1)); $result .= (img_object(($notooltip ? '' : $label), 'service', ($notooltip ? 'class="paddingright"' : 'class="paddingright classfortooltip"'), 0, 0, $notooltip ? 0 : 1));
} }
} }
$result .= $newref; $result .= dol_escape_htmltag($newref);
$result .= $linkend; $result .= $linkend;
if ($withpicto != 2) { if ($withpicto != 2) {
$result .= (($add_label && $this->label) ? $sep.dol_trunc($this->label, ($add_label > 1 ? $add_label : 0)) : ''); $result .= (($add_label && $this->label) ? $sep.dol_trunc($this->label, ($add_label > 1 ? $add_label : 0)) : '');
@ -5346,10 +5358,11 @@ class Product extends CommonObject
* @param string $option '' = Load all stock info, also from closed and internal warehouses, 'nobatch', 'novirtual' * @param string $option '' = Load all stock info, also from closed and internal warehouses, 'nobatch', 'novirtual'
* You can also filter on 'warehouseclosed', 'warehouseopen', 'warehouseinternal' * You can also filter on 'warehouseclosed', 'warehouseopen', 'warehouseinternal'
* @param int $includedraftpoforvirtual Include draft status of PO for virtual stock calculation * @param int $includedraftpoforvirtual Include draft status of PO for virtual stock calculation
* @param int $dateofvirtualstock Date of virtual stock
* @return int < 0 if KO, > 0 if OK * @return int < 0 if KO, > 0 if OK
* @see load_virtual_stock(), loadBatchInfo() * @see load_virtual_stock(), loadBatchInfo()
*/ */
public function load_stock($option = '', $includedraftpoforvirtual = null) public function load_stock($option = '', $includedraftpoforvirtual = null, $dateofvirtualstock = null)
{ {
// phpcs:enable // phpcs:enable
global $conf; global $conf;
@ -5407,7 +5420,7 @@ class Product extends CommonObject
$this->db->free($result); $this->db->free($result);
if (!preg_match('/novirtual/', $option)) { if (!preg_match('/novirtual/', $option)) {
$this->load_virtual_stock($includedraftpoforvirtual); // This also load all arrays stats_xxx... $this->load_virtual_stock($includedraftpoforvirtual, $dateofvirtualstock); // This also load all arrays stats_xxx...
} }
return 1; return 1;
@ -5424,10 +5437,11 @@ class Product extends CommonObject
* This function need a lot of load. If you use it on list, use a cache to execute it one for each product id. * This function need a lot of load. If you use it on list, use a cache to execute it one for each product id.
* *
* @param int $includedraftpoforvirtual Include draft status and not yet approved Purchase Orders for virtual stock calculation * @param int $includedraftpoforvirtual Include draft status and not yet approved Purchase Orders for virtual stock calculation
* @param int $dateofvirtualstock Date of virtual stock
* @return int < 0 if KO, > 0 if OK * @return int < 0 if KO, > 0 if OK
* @see load_stock(), loadBatchInfo() * @see load_stock(), loadBatchInfo()
*/ */
public function load_virtual_stock($includedraftpoforvirtual = null) public function load_virtual_stock($includedraftpoforvirtual = null, $dateofvirtualstock = null)
{ {
// phpcs:enable // phpcs:enable
global $conf, $hookmanager, $action; global $conf, $hookmanager, $action;
@ -5466,7 +5480,7 @@ class Product extends CommonObject
if (isset($includedraftpoforvirtual)) { if (isset($includedraftpoforvirtual)) {
$filterStatus = '0,1,2,'.$filterStatus; // 1,2 may have already been inside $filterStatus but it is better to have twice than missing $filterStatus does not include them $filterStatus = '0,1,2,'.$filterStatus; // 1,2 may have already been inside $filterStatus but it is better to have twice than missing $filterStatus does not include them
} }
$result = $this->load_stats_commande_fournisseur(0, $filterStatus, 1); $result = $this->load_stats_commande_fournisseur(0, $filterStatus, 1, $dateofvirtualstock);
if ($result < 0) { if ($result < 0) {
dol_print_error($this->db, $this->error); dol_print_error($this->db, $this->error);
} }
@ -5478,7 +5492,7 @@ class Product extends CommonObject
if (isset($includedraftpoforvirtual)) { if (isset($includedraftpoforvirtual)) {
$filterStatus = '0,'.$filterStatus; $filterStatus = '0,'.$filterStatus;
} }
$result = $this->load_stats_reception(0, $filterStatus, 1); $result = $this->load_stats_reception(0, $filterStatus, 1, $dateofvirtualstock);
if ($result < 0) { if ($result < 0) {
dol_print_error($this->db, $this->error); dol_print_error($this->db, $this->error);
} }
@ -5490,14 +5504,14 @@ class Product extends CommonObject
if (isset($includedraftpoforvirtual)) { if (isset($includedraftpoforvirtual)) {
$filterStatus = '0,'.$filterStatus; $filterStatus = '0,'.$filterStatus;
} }
$result = $this->load_stats_reception(0, $filterStatus, 1); // Use same tables than when module reception is not used. $result = $this->load_stats_reception(0, $filterStatus, 1, $dateofvirtualstock); // Use same tables than when module reception is not used.
if ($result < 0) { if ($result < 0) {
dol_print_error($this->db, $this->error); dol_print_error($this->db, $this->error);
} }
$stock_reception_fournisseur = $this->stats_reception['qty']; $stock_reception_fournisseur = $this->stats_reception['qty'];
} }
if (!empty($conf->mrp->enabled)) { if (!empty($conf->mrp->enabled)) {
$result = $this->load_stats_inproduction(0, '1,2', 1); $result = $this->load_stats_inproduction(0, '1,2', 1, $dateofvirtualstock);
if ($result < 0) { if ($result < 0) {
dol_print_error($this->db, $this->error); dol_print_error($this->db, $this->error);
} }
@ -6196,8 +6210,6 @@ class Product extends CommonObject
} }
} }
/** /**
* Class to manage products or services. * Class to manage products or services.
* Do not use 'Service' as class name since it is already used by APIs. * Do not use 'Service' as class name since it is already used by APIs.

View File

@ -471,6 +471,7 @@ if ($id > 0 || $ref) {
print load_fiche_titre($langs->trans("AddSupplierPrice")); print load_fiche_titre($langs->trans("AddSupplierPrice"));
} }
print "<!-- form to add a supplier price -->\n";
print '<form action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'" method="POST">'; print '<form action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'" method="POST">';
print '<input type="hidden" name="token" value="'.newToken().'">'; print '<input type="hidden" name="token" value="'.newToken().'">';
print '<input type="hidden" name="action" value="save_price">'; print '<input type="hidden" name="action" value="save_price">';
@ -480,7 +481,7 @@ if ($id > 0 || $ref) {
print '<table class="border centpercent">'; print '<table class="border centpercent">';
// Supplier // Supplier
print '<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans("Supplier").'</td><td>'; print '<tr><td class="titlefield fieldrequired">'.$langs->trans("Supplier").'</td><td>';
if ($rowid) { if ($rowid) {
$supplier = new Fournisseur($db); $supplier = new Fournisseur($db);
$supplier->fetch($socid); $supplier->fetch($socid);
@ -636,7 +637,7 @@ if ($id > 0 || $ref) {
$currencycodetouse = $conf->currency; $currencycodetouse = $conf->currency;
} }
print $form->selectMultiCurrency($currencycodetouse, "multicurrency_code", 1); print $form->selectMultiCurrency($currencycodetouse, "multicurrency_code", 1);
print ' &nbsp; '.$langs->trans("CurrencyRate").' '; print ' &nbsp; &nbsp; '.$langs->trans("CurrencyRate").' ';
print '<input class="flat" name="multicurrency_tx" size="4" value="'.vatrate(GETPOST('multicurrency_tx') ? GETPOST('multicurrency_tx') : (isset($object->fourn_multicurrency_tx) ? $object->fourn_multicurrency_tx : '')).'">'; print '<input class="flat" name="multicurrency_tx" size="4" value="'.vatrate(GETPOST('multicurrency_tx') ? GETPOST('multicurrency_tx') : (isset($object->fourn_multicurrency_tx) ? $object->fourn_multicurrency_tx : '')).'">';
print '</td>'; print '</td>';
print '</tr>'; print '</tr>';

View File

@ -336,11 +336,11 @@ if ($action == 'importCSV' && !empty($user->rights->stock->mouvement->creer)) {
continue; continue;
} }
//var_dump($data); //var_dump($data);
$tmp_id_sw = (int) $data[$i][0]['val']; $tmp_id_sw = $data[$i][0]['val'];
$tmp_id_tw = (int) $data[$i][1]['val']; $tmp_id_tw = $data[$i][1]['val'];
$tmp_id_product = (int) $data[$i][2]['val']; $tmp_id_product = $data[$i][2]['val'];
$tmp_qty = price2num((float) $data[$i][3]['val'], 'MS'); $tmp_qty = $data[$i][3]['val'];
$tmp_batch = dol_escape_htmltag($data[$i][4]['val']); $tmp_batch = $data[$i][4]['val'];
if (!is_numeric($tmp_id_product)) { if (!is_numeric($tmp_id_product)) {
$result = fetchref($productstatic, $tmp_id_product); $result = fetchref($productstatic, $tmp_id_product);
@ -604,11 +604,11 @@ print '</td>';
if (isModEnabled('productbatch')) { if (isModEnabled('productbatch')) {
print '<td>'; print '<td>';
print img_picto($langs->trans("LotSerial"), 'lot', 'class="paddingright"'); print img_picto($langs->trans("LotSerial"), 'lot', 'class="paddingright"');
print '<input type="text" name="batch" class="flat maxwidth50" value="'.$batch.'">'; print '<input type="text" name="batch" class="flat maxwidth50" value="'.dol_escape_htmltag($batch).'">';
print '</td>'; print '</td>';
} }
// Qty // Qty
print '<td class="center"><input type="text" class="flat maxwidth50" name="qty" value="'.$qty.'"></td>'; print '<td class="center"><input type="text" class="flat maxwidth50" name="qty" value="'.price2num((float) $qty, 'MS').'"></td>';
// Button to add line // Button to add line
print '<td class="right"><input type="submit" class="button" name="addline" value="'.dol_escape_htmltag($titletoadd).'"></td>'; print '<td class="right"><input type="submit" class="button" name="addline" value="'.dol_escape_htmltag($titletoadd).'"></td>';
@ -641,14 +641,14 @@ foreach ($listofdata as $key => $val) {
print $warehousestatict->getNomUrl(1); print $warehousestatict->getNomUrl(1);
print '</td>'; print '</td>';
print '<td>'; print '<td>';
print $productstatic->getNomUrl(1).' - '.$productstatic->label; print $productstatic->getNomUrl(1).' - '.dol_escape_htmltag($productstatic->label);
print '</td>'; print '</td>';
if (isModEnabled('productbatch')) { if (isModEnabled('productbatch')) {
print '<td>'; print '<td>';
print $val['batch']; print dol_escape_htmltag($val['batch']);
print '</td>'; print '</td>';
} }
print '<td class="center">'.$val['qty'].'</td>'; print '<td class="center">'.price2num((float) $val['qty'], 'MS').'</td>';
print '<td class="right"><a href="'.$_SERVER["PHP_SELF"].'?action=delline&token='.newToken().'&idline='.$val['id'].'">'.img_delete($langs->trans("Remove")).'</a></td>'; print '<td class="right"><a href="'.$_SERVER["PHP_SELF"].'?action=delline&token='.newToken().'&idline='.$val['id'].'">'.img_delete($langs->trans("Remove")).'</a></td>';
print '</tr>'; print '</tr>';
} }

View File

@ -518,13 +518,9 @@ while ($i < ($limit ? min($num, $limit) : $num)) {
} }
if ($mode == 'future') { if ($mode == 'future') {
$prod->load_stock('warehouseopen, warehouseinternal', 0); // This call also ->load_virtual_stock() $prod->load_stock('warehouseopen, warehouseinternal', 0, $dateendofday);
$stock = $prod->stock_theorique;
//$result = $prod->load_stats_reception(0, '4'); $prod->load_stock('warehouseopen, warehouseinternal', 0);
//print $prod->stats_commande_fournisseur['qty'].'<br>'."\n";
//print $prod->stats_reception['qty'];
$stock = '<span class="opacitymedium">'.$langs->trans("FeatureNotYetAvailable").'</span>';
$virtualstock = $prod->stock_theorique; $virtualstock = $prod->stock_theorique;
} else { } else {
if ($fk_warehouse > 0) { if ($fk_warehouse > 0) {

View File

@ -106,7 +106,7 @@ if ($object->element == 'stock') {
print '<td class="fieldrequired">'.$langs->trans("NumberOfUnit").'</td>'; print '<td class="fieldrequired">'.$langs->trans("NumberOfUnit").'</td>';
print '<td>'; print '<td>';
if ($object->element == 'product' || $object->element == 'stock') { if ($object->element == 'product' || $object->element == 'stock') {
print '<select name="mouvement" id="mouvement" class="minwidth100 valignmiddle">'; print '<select name="mouvement" id="mouvement" class="minwidth125 valignmiddle">';
print '<option value="0">'.$langs->trans("Add").'</option>'; print '<option value="0">'.$langs->trans("Add").'</option>';
print '<option value="1"'.(GETPOST('mouvement') ? ' selected="selected"' : '').'>'.$langs->trans("Delete").'</option>'; print '<option value="1"'.(GETPOST('mouvement') ? ' selected="selected"' : '').'>'.$langs->trans("Delete").'</option>';
print '</select>'; print '</select>';
@ -134,7 +134,7 @@ if (!empty($conf->productbatch->enabled) &&
) { ) {
print '<tr>'; print '<tr>';
print '<td'.($object->element == 'stock' ? '' : ' class="fieldrequired"').'>'.$langs->trans("batch_number").'</td><td colspan="3">'; print '<td'.($object->element == 'stock' ? '' : ' class="fieldrequired"').'>'.$langs->trans("batch_number").'</td><td colspan="3">';
print '<input type="text" name="batch_number" size="40" value="'.GETPOST("batch_number").'">'; print '<input type="text" name="batch_number" class="minwidth300" value="'.GETPOST("batch_number").'">';
print '</td>'; print '</td>';
print '</tr>'; print '</tr>';
print '<tr>'; print '<tr>';
@ -161,7 +161,7 @@ if (!empty($conf->project->enabled)) {
print '<td>'.$langs->trans('Project').'</td>'; print '<td>'.$langs->trans('Project').'</td>';
print '<td>'; print '<td>';
print img_picto('', 'project'); print img_picto('', 'project');
$formproject->select_projects(-1, '', 'projectid', 0, 0, 1, 0, 0, 0, 0, '', 0, 0, 'maxwidth300'); $formproject->select_projects(-1, '', 'projectid', 0, 0, 1, 0, 0, 0, 0, '', 0, 0, 'maxwidth300 widthcentpercentminusx');
print '</td>'; print '</td>';
} }
print '</tr>'; print '</tr>';
@ -171,7 +171,7 @@ $valformovementlabel = ((GETPOST("label") && (GETPOST('label') != $langs->trans(
print '<tr>'; print '<tr>';
print '<td>'.$langs->trans("MovementLabel").'</td>'; print '<td>'.$langs->trans("MovementLabel").'</td>';
print '<td>'; print '<td>';
print '<input type="text" name="label" class="minwidth300" value="'.$valformovementlabel.'">'; print '<input type="text" name="label" class="minwidth400" value="'.dol_escape_htmltag($valformovementlabel).'">';
print '</td>'; print '</td>';
print '<td>'.$langs->trans("InventoryCode").'</td>'; print '<td>'.$langs->trans("InventoryCode").'</td>';
print '<td>'; print '<td>';

View File

@ -75,7 +75,7 @@ if ($object->element == 'product') {
print img_picto('', 'stock'); print img_picto('', 'stock');
$selected = (GETPOST("dwid") ?GETPOST("dwid", 'int') : (GETPOST('id_entrepot') ?GETPOST('id_entrepot', 'int') : ($object->element == 'product' && $object->fk_default_warehouse ? $object->fk_default_warehouse : 'ifone'))); $selected = (GETPOST("dwid") ?GETPOST("dwid", 'int') : (GETPOST('id_entrepot') ?GETPOST('id_entrepot', 'int') : ($object->element == 'product' && $object->fk_default_warehouse ? $object->fk_default_warehouse : 'ifone')));
$warehousestatus = 'warehouseopen,warehouseinternal'; $warehousestatus = 'warehouseopen,warehouseinternal';
print $formproduct->selectWarehouses($selected, 'id_entrepot', $warehousestatus, 1); print $formproduct->selectWarehouses($selected, 'id_entrepot', $warehousestatus, 1, 0, 0, '', 0, 0, array(), 'minwidth75 maxwidth300 widthcentpercentminusx');
print '</td>'; print '</td>';
} }
if ($object->element == 'stock') { if ($object->element == 'stock') {
@ -87,7 +87,7 @@ if ($object->element == 'stock') {
} }
print '<td class="fieldrequired">'.$langs->trans("WarehouseTarget").'</td><td>'; print '<td class="fieldrequired">'.$langs->trans("WarehouseTarget").'</td><td>';
print img_picto('', 'stock').$formproduct->selectWarehouses(GETPOST('id_entrepot_destination'), 'id_entrepot_destination', 'warehouseopen,warehouseinternal', 1); print img_picto('', 'stock').$formproduct->selectWarehouses(GETPOST('id_entrepot_destination'), 'id_entrepot_destination', 'warehouseopen,warehouseinternal', 1, 0, 0, '', 0, 0, array(), 'minwidth75 maxwidth300 widthcentpercentminusx');
print '</td></tr>'; print '</td></tr>';
print '<tr><td class="fieldrequired">'.$langs->trans("NumberOfUnit").'</td><td colspan="3"><input type="text" name="nbpiece" class="center maxwidth75" value="'.dol_escape_htmltag(GETPOST("nbpiece")).'"></td>'; print '<tr><td class="fieldrequired">'.$langs->trans("NumberOfUnit").'</td><td colspan="3"><input type="text" name="nbpiece" class="center maxwidth75" value="'.dol_escape_htmltag(GETPOST("nbpiece")).'"></td>';
print '</tr>'; print '</tr>';
@ -104,7 +104,7 @@ if (!empty($conf->productbatch->enabled) &&
print '<input type="text" name="batch_number_bis" size="40" disabled="disabled" value="'.(GETPOST('batch_number') ?GETPOST('batch_number') : $pdluo->batch).'">'; print '<input type="text" name="batch_number_bis" size="40" disabled="disabled" value="'.(GETPOST('batch_number') ?GETPOST('batch_number') : $pdluo->batch).'">';
print '<input type="hidden" name="batch_number" value="'.(GETPOST('batch_number') ?GETPOST('batch_number') : $pdluo->batch).'">'; print '<input type="hidden" name="batch_number" value="'.(GETPOST('batch_number') ?GETPOST('batch_number') : $pdluo->batch).'">';
} else { } else {
print '<input type="text" name="batch_number" size="40" value="'.(GETPOST('batch_number') ?GETPOST('batch_number') : $pdluo->batch).'">'; print '<input type="text" name="batch_number" class="minwidth300" value="'.(GETPOST('batch_number') ? GETPOST('batch_number') : $pdluo->batch).'">';
} }
print '</td>'; print '</td>';
print '</tr>'; print '</tr>';
@ -128,7 +128,7 @@ $valformovementlabel = (GETPOST("label") ? GETPOST("label") : $langs->trans("Mov
print '<tr>'; print '<tr>';
print '<td>'.$langs->trans("MovementLabel").'</td>'; print '<td>'.$langs->trans("MovementLabel").'</td>';
print '<td>'; print '<td>';
print '<input type="text" name="label" class="minwidth300" value="'.$valformovementlabel.'">'; print '<input type="text" name="label" class="minwidth300" value="'.dol_escape_htmltag($valformovementlabel).'">';
print '</td>'; print '</td>';
print '<td>'.$langs->trans("InventoryCode").'</td>'; print '<td>'.$langs->trans("InventoryCode").'</td>';
print '<td>'; print '<td>';

View File

@ -373,6 +373,7 @@ if ($ispaymentok) {
} }
if (empty($user->rights->adherent)) { if (empty($user->rights->adherent)) {
$user->rights->adherent = new stdClass(); $user->rights->adherent = new stdClass();
$user->rights->adherent->cotisation = new stdClass();
} }
$user->rights->societe->creer = 1; $user->rights->societe->creer = 1;
$user->rights->facture->creer = 1; $user->rights->facture->creer = 1;

View File

@ -4,7 +4,7 @@
* Copyright (C) 2014 Marcos García <marcosgdf@gmail.com> * Copyright (C) 2014 Marcos García <marcosgdf@gmail.com>
* Copyright (C) 2016 Charlie Benke <charlie@patas-monkey.com> * Copyright (C) 2016 Charlie Benke <charlie@patas-monkey.com>
* Copyright (C) 2018-2021 Philippe Grand <philippe.grand@atoo-net.com> * Copyright (C) 2018-2021 Philippe Grand <philippe.grand@atoo-net.com>
* Copyright (C) 2018 Frédéric France <frederic.france@netlogic.fr> * Copyright (C) 2018-2022 Frédéric France <frederic.france@netlogic.fr>
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -22,12 +22,12 @@
*/ */
/** /**
* \file htdocs/core/modules/recruitment/doc/doc_generic_recruitmentjobposition_odt.modules.php * \file htdocs/recruitment/core/modules/recruitment/doc/doc_generic_recruitmentjobposition_odt.modules.php
* \ingroup recruitment * \ingroup recruitment
* \brief File of class to build ODT documents for recruitmentjobpositions * \brief File of class to build ODT documents for recruitmentjobpositions
*/ */
dol_include_once('/recruitment/core/modules/recruitment/modules_recruitmentjobposition.php'); require_once DOL_DOCUMENT_ROOT.'/recruitment/core/modules/recruitment/modules_recruitmentjobposition.php';
require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
@ -234,7 +234,7 @@ class doc_generic_recruitmentjobposition_odt extends ModelePDFRecruitmentJobPosi
$outputlangs->loadLangs(array("main", "dict", "companies", "bills")); $outputlangs->loadLangs(array("main", "dict", "companies", "bills"));
if ($conf->commande->dir_output) { if ($conf->recruitment->dir_output) {
// If $object is id instead of object // If $object is id instead of object
if (!is_object($object)) { if (!is_object($object)) {
$id = $object; $id = $object;
@ -246,7 +246,7 @@ class doc_generic_recruitmentjobposition_odt extends ModelePDFRecruitmentJobPosi
} }
} }
$dir = $conf->commande->multidir_output[isset($object->entity) ? $object->entity : 1]; $dir = $conf->recruitment->multidir_output[isset($object->entity) ? $object->entity : 1].'/recruitmentjobposition/';
$objectref = dol_sanitizeFileName($object->ref); $objectref = dol_sanitizeFileName($object->ref);
if (!preg_match('/specimen/i', $objectref)) { if (!preg_match('/specimen/i', $objectref)) {
$dir .= "/".$objectref; $dir .= "/".$objectref;

View File

@ -21,41 +21,21 @@
* \brief Page to create/edit/view recruitmentjobposition * \brief Page to create/edit/view recruitmentjobposition
*/ */
//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
// Load Dolibarr environment // Load Dolibarr environment
require_once '../main.inc.php'; require_once '../main.inc.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
dol_include_once('/recruitment/class/recruitmentjobposition.class.php'); require_once DOL_DOCUMENT_ROOT.'/recruitment/class/recruitmentjobposition.class.php';
dol_include_once('/recruitment/lib/recruitment_recruitmentjobposition.lib.php'); require_once DOL_DOCUMENT_ROOT.'/recruitment/lib/recruitment_recruitmentjobposition.lib.php';
// Load translation files required by the page // Load translation files required by the page
$langs->loadLangs(array("recruitment", "other")); $langs->loadLangs(array("recruitment", "other"));
// Get parameters // Get parameters
$id = GETPOST('id', 'int'); $id = GETPOST('id', 'int');
$ref = GETPOST('ref', 'alpha'); $ref = GETPOST('ref', 'alpha');
$action = GETPOST('action', 'aZ09'); $action = GETPOST('action', 'aZ09');
$confirm = GETPOST('confirm', 'alpha'); $confirm = GETPOST('confirm', 'alpha');
$cancel = GETPOST('cancel', 'aZ09'); $cancel = GETPOST('cancel', 'aZ09');

View File

@ -28,8 +28,8 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
dol_include_once('/recruitment/class/recruitmentjobposition.class.php'); require_once DOL_DOCUMENT_ROOT.'/recruitment/class/recruitmentjobposition.class.php';
dol_include_once('/recruitment/lib/recruitment_recruitmentjobposition.lib.php'); require_once DOL_DOCUMENT_ROOT.'/recruitment/lib/recruitment_recruitmentjobposition.lib.php';
// Load translation files required by the page // Load translation files required by the page
$langs->loadLangs(array("recruitment", "companies", "other", "mails")); $langs->loadLangs(array("recruitment", "companies", "other", "mails"));

View File

@ -655,6 +655,10 @@ if ($conf->global->TAKEPOS_ENABLE_SUMUP) {
} }
} }
$parameters = array();
$reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $invoice, $action); // Note that $action and $object may have been modified by hook
if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
$class = ($i == 3) ? "calcbutton3" : "calcbutton2"; $class = ($i == 3) ? "calcbutton3" : "calcbutton2";
foreach ($action_buttons as $button) { foreach ($action_buttons as $button) {
$newclass = $class.($button["class"] ? " ".$button["class"] : ""); $newclass = $class.($button["class"] ? " ".$button["class"] : "");

View File

@ -1642,6 +1642,7 @@ if ($action == 'create' || $action == 'adduserldap') {
//$s=picto_from_langcode($object->default_lang); //$s=picto_from_langcode($object->default_lang);
//print ($s?$s.' ':''); //print ($s?$s.' ':'');
$labellang = ($object->lang ? $langs->trans('Language_'.$object->lang) : ''); $labellang = ($object->lang ? $langs->trans('Language_'.$object->lang) : '');
print picto_from_langcode($object->lang, 'class="paddingrightonly saturatemedium opacitylow"');
print $labellang; print $labellang;
print '</td></tr>'; print '</td></tr>';
} }

View File

@ -2073,6 +2073,8 @@ class User extends CommonObject
$adh->phone = $this->office_phone; $adh->phone = $this->office_phone;
$adh->phone_mobile = $this->user_mobile; $adh->phone_mobile = $this->user_mobile;
$adh->default_lang = $this->lang;
$adh->user_id = $this->id; $adh->user_id = $this->id;
$adh->user_login = $this->login; $adh->user_login = $this->login;
@ -2117,6 +2119,8 @@ class User extends CommonObject
$tmpobj->phone_mobile = $this->user_mobile; $tmpobj->phone_mobile = $this->user_mobile;
$tmpobj->fax = $this->office_fax; $tmpobj->fax = $this->office_fax;
$tmpobj->default_lang = $this->lang;
$tmpobj->address = $this->address; $tmpobj->address = $this->address;
$tmpobj->town = $this->town; $tmpobj->town = $this->town;
$tmpobj->zip = $this->zip; $tmpobj->zip = $this->zip;

View File

@ -2741,8 +2741,12 @@ if (!GETPOST('hide_websitemenu')) {
print '<input type="submit" class="button bordertransp"'.$disabled.' value="'.dol_escape_htmltag($langs->trans("CloneSite")).'" name="createfromclone">'; print '<input type="submit" class="button bordertransp"'.$disabled.' value="'.dol_escape_htmltag($langs->trans("CloneSite")).'" name="createfromclone">';
//print '<input type="submit" class="buttonDelete bordertransp" name="deletesite" value="'.$langs->trans("Delete").'"'.($atleastonepage ? ' disabled="disabled"' : '').'>'; // Delete website
print '<input type="submit" class="buttonDelete bordertransp" name="deletesite" value="'.$langs->trans("Delete").'">'; if ($website->status == $website::STATUS_VALIDATED) {
print '<input type="submit" class="buttonDelete bordertransp" name="deletesite" value="'.$langs->trans("Delete").'" disabled="disabled" title="'.dol_escape_htmltag($langs->trans("WebsiteMustBeDisabled")).'">';
} else {
print '<input type="submit" class="buttonDelete bordertransp" name="deletesite" value="'.$langs->trans("Delete").'"'.($atleastonepage ? ' disabled="disabled"' : '').'>';
}
// Regenerate all pages // Regenerate all pages
print '<a href="'.$_SERVER["PHP_SELF"].'?action=regeneratesite&token='.newToken().'&website='.urlencode($website->ref).'" class="button bordertransp"'.$disabled.' title="'.dol_escape_htmltag($langs->trans("RegenerateWebsiteContent")).'"><span class="far fa-hdd"></span></a>'; print '<a href="'.$_SERVER["PHP_SELF"].'?action=regeneratesite&token='.newToken().'&website='.urlencode($website->ref).'" class="button bordertransp"'.$disabled.' title="'.dol_escape_htmltag($langs->trans("RegenerateWebsiteContent")).'"><span class="far fa-hdd"></span></a>';