diff --git a/README.md b/README.md
index 2cfe4138d62..54fdf1e958b 100644
--- a/README.md
+++ b/README.md
@@ -154,18 +154,18 @@ See the [ChangeLog](https://github.com/Dolibarr/dolibarr/blob/develop/ChangeLog)
### Other application/modules
-- Electronic Document Management (EDM)
+- Electronic Document Management (EDM)
- Bookmarks management
- Reporting
- Data export/import
-- Barcodes
+- Barcodes
- Margin calculations
- LDAP connectivity
- ClickToDial integration
- Mass emailing
- RSS integration
- Skype integration
-- Social platforms linking
+- Social platforms linking
- Payment platforms integration (PayPal, Stripe, Paybox...)
- Email-Collector
@@ -179,14 +179,11 @@ See the [ChangeLog](https://github.com/Dolibarr/dolibarr/blob/develop/ChangeLog)
- Multi-Users and groups with finely grained rights
- Multi-Currency
- Multi-Company (by adding of an external module)
-
- Very user friendly and easy to use
- customizable Dashboard
- Highly customizable: enable only the modules you need, add user personalized fields, choose your skin, several menu managers (can be used by internal users as a back-office with a particular menu, or by external users as a front-office with another one)
-
- APIs (REST, SOAP)
- Code that is easy to understand, maintain and develop (PHP with no heavy framework; trigger and hook architecture)
-
- Support a lot of country specific features:
- Spanish Tax RE and ISPF
- French NPR VAT rate (VAT called "Non Perçue Récupérable" for DOM-TOM)
@@ -197,7 +194,7 @@ See the [ChangeLog](https://github.com/Dolibarr/dolibarr/blob/develop/ChangeLog)
- Compatible with European GDPR rules
- ...
- Flexible PDF & ODT generation for invoices, proposals, orders...
-- …
+- ...
### System Environment / Requirements
diff --git a/SECURITY.md b/SECURITY.md
index 61f4a392db8..427b1cc7ae2 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -54,12 +54,12 @@ ONLY vulnerabilities discovered, when the following setup on test platform is us
* $dolibarr_main_prod must be set to 1 into conf.php
* $dolibarr_nocsrfcheck must be kept to the value 0 into conf.php (this is the default value)
* $dolibarr_main_force_https must be set to something else than 0.
-* The constant MAIN_SECURITY_CSRF_WITH_TOKEN must be set to 2 into backoffice menu Home - Setup - Other (this protection should be set to 2 soon by default)
+* The constant MAIN_SECURITY_CSRF_WITH_TOKEN must be set to 3 into backoffice menu Home - Setup - Other (this protection should be set to 3 soon by default)
* The module DebugBar and ModuleBuilder must NOT be enabled (by default, these modules are not enabled. They are developer tools)
* ONLY security reports on modules provided by default and with the "stable" status are valid (troubles into "experimental", "developement" or external modules are not valid vulnerabilities).
* The root of web server must link to htdocs and the documents directory must be outside of the web server root (this is the default when using the default installer but may differs with external installer).
* The web server setup must be done so only the documents directory is in write mode. The root directory called htdocs must be readonly.
-* CSRF attacks are accepted when using a POST URL, but when using GET URL, they are validated only for creating, updating or deleting data resctricted from pages restricted to admin users.
+* CSRF attacks are accepted but double check that you have set MAIN_SECURITY_CSRF_WITH_TOKEN to value 3.
* Ability for a high level user to edit web site pages into the CMS by including HTML or Javascript is an expected feature. Vulnerabilities into the website module are validated only if HTML or Javascript injection can be done by a non allowed user.
Scope is the web application (back office) and the APIs.
diff --git a/htdocs/accountancy/admin/account.php b/htdocs/accountancy/admin/account.php
index 930e76c7690..c9849f9f54f 100644
--- a/htdocs/accountancy/admin/account.php
+++ b/htdocs/accountancy/admin/account.php
@@ -195,7 +195,7 @@ if (empty($reshook)) {
} elseif ($action == 'enable' && $permissiontoadd) {
if ($accounting->fetch($id)) {
$mode = GETPOST('mode', 'int');
- $result = $accounting->account_activate($id, $mode);
+ $result = $accounting->accountActivate($id, $mode);
}
$action = 'update';
if ($result < 0) {
diff --git a/htdocs/accountancy/admin/card.php b/htdocs/accountancy/admin/card.php
index cd48526e62b..4d69eae7db8 100644
--- a/htdocs/accountancy/admin/card.php
+++ b/htdocs/accountancy/admin/card.php
@@ -75,7 +75,7 @@ if ($action == 'add' && $user->rights->accounting->chartofaccount) {
setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Label")), null, 'errors');
$action = 'create';
} else {
- $sql = 'SELECT pcg_version FROM ' . MAIN_DB_PREFIX . 'accounting_system WHERE rowid='.((int) $conf->global->CHARTOFACCOUNTS);
+ $sql = "SELECT pcg_version FROM " . MAIN_DB_PREFIX . "accounting_system WHERE rowid = ".((int) $conf->global->CHARTOFACCOUNTS);
dol_syslog('accountancy/admin/card.php:: $sql=' . $sql);
$result = $db->query($sql);
@@ -138,7 +138,7 @@ if ($action == 'add' && $user->rights->accounting->chartofaccount) {
} else {
$result = $object->fetch($id);
- $sql = 'SELECT pcg_version FROM '.MAIN_DB_PREFIX.'accounting_system WHERE rowid='.((int) $conf->global->CHARTOFACCOUNTS);
+ $sql = "SELECT pcg_version FROM ".MAIN_DB_PREFIX."accounting_system WHERE rowid=".((int) $conf->global->CHARTOFACCOUNTS);
dol_syslog('accountancy/admin/card.php:: $sql=' . $sql);
$result2 = $db->query($sql);
@@ -260,7 +260,7 @@ if ($action == 'create') {
print ' ';
// autosuggest from existing account types if found
print '';
- $sql = 'SELECT DISTINCT pcg_type FROM ' . MAIN_DB_PREFIX . 'accounting_account';
+ $sql = "SELECT DISTINCT pcg_type FROM " . MAIN_DB_PREFIX . "accounting_account";
$sql .= " WHERE fk_pcg_version = '" . $db->escape($accountsystem->ref) . "'";
$sql .= ' AND entity in ('.getEntity('accounting_account', 0).')'; // Always limit to current entity. No sharing in accountancy.
$sql .= ' LIMIT 50000'; // just as a sanity check
diff --git a/htdocs/accountancy/admin/productaccount.php b/htdocs/accountancy/admin/productaccount.php
index 9596cd96af8..a842c294937 100644
--- a/htdocs/accountancy/admin/productaccount.php
+++ b/htdocs/accountancy/admin/productaccount.php
@@ -186,12 +186,28 @@ if ($action == 'update') {
$msg .= ''.$langs->trans("ErrorDB").' : '.$langs->trans("Product").' '.$productid.' '.$langs->trans("NotVentilatedinAccount").' : id='.$accounting_account_id.' '.$sql.' ';
$ko++;
} else {
- $db->begin();
-
+ $sql = '';
if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) {
- $sql = "INSERT INTO ".MAIN_DB_PREFIX."product_perentity (fk_product, entity, '".$db->escape($accountancy_field_name)."')";
- $sql .= " VALUES (".((int) $productid).", ".((int) $conf->entity).", '".$db->escape($accounting->account_number)."')";
- $sql .= " ON DUPLICATE KEY UPDATE ".$accountancy_field_name." = '".$db->escape($accounting->account_number)."'";
+ $sql_exists = "SELECT rowid FROM " . MAIN_DB_PREFIX . "product_perentity";
+ $sql_exists .= " WHERE fk_product = " . ((int) $productid) . " AND entity = " . ((int) $conf->entity);
+ $resql_exists = $db->query($sql_exists);
+ if (!$resql_exists) {
+ $msg .= ''.$langs->trans("ErrorDB").' : '.$langs->trans("Product").' '.$productid.' '.$langs->trans("NotVentilatedinAccount").' : id='.$accounting_account_id.' '.$resql_exists.' ';
+ $ko++;
+ } else {
+ $nb_exists = $db->num_rows($resql_exists);
+ if ($nb_exists <= 0) {
+ // insert
+ $sql = "INSERT INTO " . MAIN_DB_PREFIX . "product_perentity (fk_product, entity, '" . $db->escape($accountancy_field_name) . "')";
+ $sql .= " VALUES (" . ((int) $productid) . ", " . ((int) $conf->entity) . ", '" . $db->escape($accounting->account_number) . "')";
+ } else {
+ $obj_exists = $db->fetch_object($resql_exists);
+ // update
+ $sql = "UPDATE " . MAIN_DB_PREFIX . "product_perentity";
+ $sql .= " SET " . $accountancy_field_name . " = '" . $db->escape($accounting->account_number) . "'";
+ $sql .= " WHERE rowid = " . ((int) $obj_exists->rowid);
+ }
+ }
} else {
$sql = " UPDATE ".MAIN_DB_PREFIX."product";
$sql .= " SET ".$accountancy_field_name." = '".$db->escape($accounting->account_number)."'";
@@ -199,6 +215,9 @@ if ($action == 'update') {
}
dol_syslog("/accountancy/admin/productaccount.php", LOG_DEBUG);
+
+ $db->begin();
+
if ($db->query($sql)) {
$ok++;
$db->commit();
diff --git a/htdocs/accountancy/class/accountingaccount.class.php b/htdocs/accountancy/class/accountingaccount.class.php
index fc6acffb46f..ed3c69c18bc 100644
--- a/htdocs/accountancy/class/accountingaccount.class.php
+++ b/htdocs/accountancy/class/accountingaccount.class.php
@@ -26,6 +26,9 @@
* \brief File of class to manage accounting accounts
*/
+require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
+require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
+require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
/**
* Class to manage accounting accounts
*/
@@ -140,6 +143,11 @@ class AccountingAccount extends CommonObject
*/
public $reconcilable;
+ /**
+ * @var array cache array
+ */
+ private $accountingaccount_codetotid_cache = array();
+
/**
* Constructor
*
@@ -225,8 +233,8 @@ class AccountingAccount extends CommonObject
/**
* Insert new accounting account in chart of accounts
*
- * @param User $user User making action
- * @param int $notrigger Disable triggers
+ * @param User $user User making action
+ * @param int $notrigger Disable triggers
* @return int <0 if KO, >0 if OK
*/
public function create($user, $notrigger = 0)
@@ -259,7 +267,7 @@ class AccountingAccount extends CommonObject
// Put here code to add control on parameters values
// Insert request
- $sql = "INSERT INTO ".MAIN_DB_PREFIX."accounting_account(";
+ $sql = "INSERT INTO " . MAIN_DB_PREFIX . "accounting_account(";
$sql .= "datec";
$sql .= ", entity";
$sql .= ", fk_pcg_version";
@@ -293,11 +301,11 @@ class AccountingAccount extends CommonObject
$resql = $this->db->query($sql);
if (!$resql) {
$error++;
- $this->errors[] = "Error ".$this->db->lasterror();
+ $this->errors[] = "Error " . $this->db->lasterror();
}
if (!$error) {
- $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."accounting_account");
+ $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . "accounting_account");
// Uncomment this and change MYOBJECT to your own tag if you
// want this action to call a trigger.
@@ -313,8 +321,8 @@ class AccountingAccount extends CommonObject
// Commit or rollback
if ($error) {
foreach ($this->errors as $errmsg) {
- dol_syslog(get_class($this)."::create ".$errmsg, LOG_ERR);
- $this->error .= ($this->error ? ', '.$errmsg : $errmsg);
+ dol_syslog(get_class($this) . "::create " . $errmsg, LOG_ERR);
+ $this->error .= ($this->error ? ', ' . $errmsg : $errmsg);
}
$this->db->rollback();
return -1 * $error;
@@ -327,7 +335,7 @@ class AccountingAccount extends CommonObject
/**
* Update record
*
- * @param User $user Use making update
+ * @param User $user Use making update
* @return int <0 if KO, >0 if OK
*/
public function update($user)
@@ -339,18 +347,18 @@ class AccountingAccount extends CommonObject
$this->db->begin();
- $sql = "UPDATE ".MAIN_DB_PREFIX."accounting_account ";
- $sql .= " SET fk_pcg_version = ".($this->fk_pcg_version ? "'".$this->db->escape($this->fk_pcg_version)."'" : "null");
- $sql .= " , pcg_type = ".($this->pcg_type ? "'".$this->db->escape($this->pcg_type)."'" : "null");
- $sql .= " , account_number = '".$this->db->escape($this->account_number)."'";
- $sql .= " , account_parent = ".(int) $this->account_parent;
- $sql .= " , label = ".($this->label ? "'".$this->db->escape($this->label)."'" : "''");
- $sql .= " , labelshort = ".($this->labelshort ? "'".$this->db->escape($this->labelshort)."'" : "''");
- $sql .= " , fk_accounting_category = ".(empty($this->account_category) ? 0 : (int) $this->account_category);
- $sql .= " , fk_user_modif = ".((int) $user->id);
- $sql .= " , active = ".(int) $this->active;
- $sql .= " , reconcilable = ".(int) $this->reconcilable;
- $sql .= " WHERE rowid = ".((int) $this->id);
+ $sql = "UPDATE " . MAIN_DB_PREFIX . "accounting_account ";
+ $sql .= " SET fk_pcg_version = " . ($this->fk_pcg_version ? "'" . $this->db->escape($this->fk_pcg_version) . "'" : "null");
+ $sql .= " , pcg_type = " . ($this->pcg_type ? "'" . $this->db->escape($this->pcg_type) . "'" : "null");
+ $sql .= " , account_number = '" . $this->db->escape($this->account_number) . "'";
+ $sql .= " , account_parent = " . (int) $this->account_parent;
+ $sql .= " , label = " . ($this->label ? "'" . $this->db->escape($this->label) . "'" : "''");
+ $sql .= " , labelshort = " . ($this->labelshort ? "'" . $this->db->escape($this->labelshort) . "'" : "''");
+ $sql .= " , fk_accounting_category = " . (empty($this->account_category) ? 0 : (int) $this->account_category);
+ $sql .= " , fk_user_modif = " . ((int) $user->id);
+ $sql .= " , active = " . (int) $this->active;
+ $sql .= " , reconcilable = " . (int) $this->reconcilable;
+ $sql .= " WHERE rowid = " . ((int) $this->id);
dol_syslog(get_class($this)."::update", LOG_DEBUG);
$result = $this->db->query($sql);
@@ -413,22 +421,22 @@ class AccountingAccount extends CommonObject
$this->db->begin();
if (!$error) {
- $sql = "DELETE FROM ".MAIN_DB_PREFIX."accounting_account";
- $sql .= " WHERE rowid=".((int) $this->id);
+ $sql = "DELETE FROM " . MAIN_DB_PREFIX . "accounting_account";
+ $sql .= " WHERE rowid=" . ((int) $this->id);
- dol_syslog(get_class($this)."::delete sql=".$sql);
+ dol_syslog(get_class($this) . "::delete sql=" . $sql);
$resql = $this->db->query($sql);
if (!$resql) {
$error++;
- $this->errors[] = "Error ".$this->db->lasterror();
+ $this->errors[] = "Error " . $this->db->lasterror();
}
}
// Commit or rollback
if ($error) {
foreach ($this->errors as $errmsg) {
- dol_syslog(get_class($this)."::delete ".$errmsg, LOG_ERR);
- $this->error .= ($this->error ? ', '.$errmsg : $errmsg);
+ dol_syslog(get_class($this) . "::delete " . $errmsg, LOG_ERR);
+ $this->error .= ($this->error ? ', ' . $errmsg : $errmsg);
}
$this->db->rollback();
return -1 * $error;
@@ -444,20 +452,20 @@ class AccountingAccount extends CommonObject
/**
* Return clicable name (with picto eventually)
*
- * @param int $withpicto 0=No picto, 1=Include picto into link, 2=Only picto
- * @param int $withlabel 0=No label, 1=Include label of account
- * @param int $nourl 1=Disable url
- * @param string $moretitle Add more text to title tooltip
- * @param int $notooltip 1=Disable tooltip
- * @param int $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking
- * @param int $withcompletelabel 0=Short label (field short label), 1=Complete label (field label)
- * @param string $option 'ledger', 'journals', 'accountcard'
- * @return string String with URL
+ * @param int $withpicto 0=No picto, 1=Include picto into link, 2=Only picto
+ * @param int $withlabel 0=No label, 1=Include label of account
+ * @param int $nourl 1=Disable url
+ * @param string $moretitle Add more text to title tooltip
+ * @param int $notooltip 1=Disable tooltip
+ * @param int $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking
+ * @param int $withcompletelabel 0=Short label (field short label), 1=Complete label (field label)
+ * @param string $option 'ledger', 'journals', 'accountcard'
+ * @return string String with URL
*/
public function getNomUrl($withpicto = 0, $withlabel = 0, $nourl = 0, $moretitle = '', $notooltip = 0, $save_lastsearch_value = -1, $withcompletelabel = 0, $option = '')
{
global $langs, $conf;
- require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
+ require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php';
if (!empty($conf->dol_no_mouse_hover)) {
$notooltip = 1; // Force disable tooltips
@@ -465,15 +473,16 @@ class AccountingAccount extends CommonObject
$result = '';
- $url = ''; $labelurl = '';
+ $url = '';
+ $labelurl = '';
if (empty($option) || $option == 'ledger') {
- $url = DOL_URL_ROOT.'/accountancy/bookkeeping/listbyaccount.php?search_accountancy_code_start='.urlencode($this->account_number).'&search_accountancy_code_end='.urlencode($this->account_number);
+ $url = DOL_URL_ROOT . '/accountancy/bookkeeping/listbyaccount.php?search_accountancy_code_start=' . urlencode($this->account_number) . '&search_accountancy_code_end=' . urlencode($this->account_number);
$labelurl = $langs->trans("ShowAccountingAccountInLedger");
} elseif ($option == 'journals') {
- $url = DOL_URL_ROOT.'/accountancy/bookkeeping/list.php?search_accountancy_code_start='.urlencode($this->account_number).'&search_accountancy_code_end='.urlencode($this->account_number);
+ $url = DOL_URL_ROOT . '/accountancy/bookkeeping/list.php?search_accountancy_code_start=' . urlencode($this->account_number) . '&search_accountancy_code_end=' . urlencode($this->account_number);
$labelurl = $langs->trans("ShowAccountingAccountInJournals");
} elseif ($option == 'accountcard') {
- $url = DOL_URL_ROOT.'/accountancy/admin/card.php?id='.urlencode($this->id);
+ $url = DOL_URL_ROOT . '/accountancy/admin/card.php?id=' . urlencode($this->id);
$labelurl = $langs->trans("ShowAccountingAccount");
}
@@ -495,29 +504,29 @@ class AccountingAccount extends CommonObject
$labeltoshow = $this->labelshort;
}
- $label = ''.$labelurl.' ';
+ $label = '' . $labelurl . ' ';
if (!empty($this->account_number)) {
- $label .= ''.$langs->trans('AccountAccounting').': '.length_accountg($this->account_number);
+ $label .= '' . $langs->trans('AccountAccounting') . ': ' . length_accountg($this->account_number);
}
if (!empty($labeltoshow)) {
- $label .= ''.$langs->trans('Label').': '.$labeltoshow;
+ $label .= '' . $langs->trans('Label') . ': ' . $labeltoshow;
}
if ($moretitle) {
- $label .= ' - '.$moretitle;
+ $label .= ' - ' . $moretitle;
}
$linkclose = '';
if (empty($notooltip)) {
if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
$label = $labelurl;
- $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
+ $linkclose .= ' alt="' . dol_escape_htmltag($label, 1) . '"';
}
- $linkclose .= ' title="'.dol_escape_htmltag($label, 1).'"';
+ $linkclose .= ' title="' . dol_escape_htmltag($label, 1) . '"';
$linkclose .= ' class="classfortooltip"';
}
- $linkstart = '';
+ $linkstart = ' ';
$linkend = ' ';
if ($nourl) {
@@ -528,17 +537,17 @@ class AccountingAccount extends CommonObject
$label_link = length_accountg($this->account_number);
if ($withlabel) {
- $label_link .= ' - '.($nourl ? '' : '').$labeltoshow.($nourl ? ' ' : '');
+ $label_link .= ' - ' . ($nourl ? '' : '') . $labeltoshow . ($nourl ? ' ' : '');
}
if ($withpicto) {
- $result .= ($linkstart.img_object(($notooltip ? '' : $label), $picto, ($notooltip ? '' : 'class="classfortooltip"'), 0, 0, $notooltip ? 0 : 1).$linkend);
+ $result .= ($linkstart . img_object(($notooltip ? '' : $label), $picto, ($notooltip ? '' : 'class="classfortooltip"'), 0, 0, $notooltip ? 0 : 1) . $linkend);
}
if ($withpicto && $withpicto != 2) {
$result .= ' ';
}
if ($withpicto != 2) {
- $result .= $linkstart.$label_link.$linkend;
+ $result .= $linkstart . $label_link . $linkend;
}
return $result;
}
@@ -552,10 +561,10 @@ class AccountingAccount extends CommonObject
public function info($id)
{
$sql = 'SELECT a.rowid, a.datec, a.fk_user_author, a.fk_user_modif, a.tms';
- $sql .= ' FROM '.MAIN_DB_PREFIX.'accounting_account as a';
- $sql .= ' WHERE a.rowid = '.((int) $id);
+ $sql .= ' FROM ' . MAIN_DB_PREFIX . 'accounting_account as a';
+ $sql .= ' WHERE a.rowid = ' . ((int) $id);
- dol_syslog(get_class($this).'::info sql='.$sql);
+ dol_syslog(get_class($this) . '::info sql=' . $sql);
$result = $this->db->query($sql);
if ($result) {
@@ -584,8 +593,8 @@ class AccountingAccount extends CommonObject
/**
* Deactivate an account (for status active or status reconcilable)
*
- * @param int $id Id
- * @param int $mode 0=field active, 1=field reconcilable
+ * @param int $id Id
+ * @param int $mode 0=field active, 1=field reconcilable
* @return int <0 if KO, >0 if OK
*/
public function accountDeactivate($id, $mode = 0)
@@ -620,15 +629,15 @@ class AccountingAccount extends CommonObject
}
}
- // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
+
/**
* Account activated
*
- * @param int $id Id
- * @param int $mode 0=field active, 1=field reconcilable
+ * @param int $id Id
+ * @param int $mode 0=field active, 1=field reconcilable
* @return int <0 if KO, >0 if OK
*/
- public function account_activate($id, $mode = 0)
+ public function accountActivate($id, $mode = 0)
{
// phpcs:enable
$this->db->begin();
@@ -654,12 +663,11 @@ class AccountingAccount extends CommonObject
}
}
-
/**
* Retourne le libelle du statut d'un user (actif, inactif)
*
- * @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto
- * @return string Label of status
+ * @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto
+ * @return string Label of status
*/
public function getLibStatut($mode = 0)
{
@@ -670,9 +678,9 @@ class AccountingAccount extends CommonObject
/**
* Renvoi le libelle d'un statut donne
*
- * @param int $status Id status
- * @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto
- * @return string Label of status
+ * @param int $status Id status
+ * @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto
+ * @return string Label of status
*/
public function LibStatut($status, $mode = 0)
{
@@ -694,9 +702,9 @@ class AccountingAccount extends CommonObject
}
} elseif ($mode == 2) {
if ($status == 1) {
- return img_picto($langs->trans('Enabled'), 'statut4').' '.$langs->trans('Enabled');
+ return img_picto($langs->trans('Enabled'), 'statut4') . ' ' . $langs->trans('Enabled');
} elseif ($status == 0) {
- return img_picto($langs->trans('Disabled'), 'statut5').' '.$langs->trans('Disabled');
+ return img_picto($langs->trans('Disabled'), 'statut5') . ' ' . $langs->trans('Disabled');
}
} elseif ($mode == 3) {
if ($status == 1) {
@@ -706,15 +714,173 @@ class AccountingAccount extends CommonObject
}
} elseif ($mode == 4) {
if ($status == 1) {
- return img_picto($langs->trans('Enabled'), 'statut4').' '.$langs->trans('Enabled');
+ return img_picto($langs->trans('Enabled'), 'statut4') . ' ' . $langs->trans('Enabled');
} elseif ($status == 0) {
- return img_picto($langs->trans('Disabled'), 'statut5').' '.$langs->trans('Disabled');
+ return img_picto($langs->trans('Disabled'), 'statut5') . ' ' . $langs->trans('Disabled');
}
} elseif ($mode == 5) {
if ($status == 1) {
- return $langs->trans('Enabled').' '.img_picto($langs->trans('Enabled'), 'statut4');
+ return $langs->trans('Enabled') . ' ' . img_picto($langs->trans('Enabled'), 'statut4');
} elseif ($status == 0) {
- return $langs->trans('Disabled').' '.img_picto($langs->trans('Disabled'), 'statut5');
+ return $langs->trans('Disabled') . ' ' . img_picto($langs->trans('Disabled'), 'statut5');
+ }
+ }
+ }
+
+ // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
+
+ /**
+ * Return Suggest accounting accounts to bind
+ *
+ * @param Societe $buyer Societe Object Buyers
+ * @param $seller Company Object seller
+ * @param Product $product Product object sell or buy
+ * @param Facture $facture Facture
+ * @param FactureLigne $factureDet Facture Det
+ * @param array $accountingAccount array of Account account
+ *
+ * @return array Accounting accounts suggested
+ */
+ public function getAccountingCodeToBind(Societe $buyer, $seller, Product $product, Facture $facture, FactureLigne $factureDet, $accountingAccount = array())
+ {
+ global $conf;
+ global $hookmanager;
+
+ // Instantiate hooks for external modules
+ $hookmanager->initHooks(array('accoutancyBindingCalculation'));
+
+ // Execute hook accoutancyBindingCalculation
+ $parameters = array('buyer' => $buyer, 'seller' => $seller, 'product' => $product, 'facture' => $facture, 'factureDet' => $factureDet ,'accountingAccount'=>$accountingAccount);
+ $reshook = $hookmanager->executeHooks('accoutancyBindingCalculation', $parameters); // Note that $action and $object may have been modified by some hooks
+
+ if (empty($reshook)) {
+ require_once DOL_DOCUMENT_ROOT . '/core/lib/company.lib.php';
+ $isBuyerInEEC = isInEEC($buyer);
+ $isSellerInEEC = isInEEC($seller);
+ $code_sell_l = '';
+ $code_sell_p = '';
+ $code_sell_t = '';
+ $suggestedid = '';
+
+ // Level 1: Search suggested default account for product/service
+ $suggestedaccountingaccountbydefaultfor = '';
+ if ($factureDet->product_type == 1) {
+ if ($buyer->country_code == $seller->country_code || empty($buyer->country_code)) { // If buyer in same country than seller (if not defined, we assume it is same country)
+ $code_sell_l = (!empty($conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT : '');
+ $suggestedaccountingaccountbydefaultfor = '';
+ } else {
+ if ($isSellerInEEC && $isBuyerInEEC && $factureDet->tva_tx != 0) { // European intravat sale, but with a VAT
+ $code_sell_l = (!empty($conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT : '');
+ $suggestedaccountingaccountbydefaultfor = 'eecwithvat';
+ } elseif ($isSellerInEEC && $isBuyerInEEC && empty($buyer->tva_intra)) { // European intravat sale, without VAT intra community number
+ $code_sell_l = (!empty($conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT : '');
+ $suggestedaccountingaccountbydefaultfor = 'eecwithoutvatnumber';
+ } elseif ($isSellerInEEC && $isBuyerInEEC) { // European intravat sale
+ $code_sell_l = (!empty($conf->global->ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT : '');
+ $suggestedaccountingaccountbydefaultfor = 'eec';
+ } else { // Foreign sale
+ $code_sell_l = (!empty($conf->global->ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT : '');
+ $suggestedaccountingaccountbydefaultfor = 'export';
+ }
+ }
+ } elseif ($factureDet->product_type == 0) {
+ if ($buyer->country_code == $seller->country_code || empty($buyer->country_code)) { // If buyer in same country than seller (if not defined, we assume it is same country)
+ $code_sell_l = (!empty($conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT : '');
+ $suggestedaccountingaccountbydefaultfor = '';
+ } else {
+ if ($isSellerInEEC && $isBuyerInEEC && $factureDet->tva_tx != 0) { // European intravat sale, but with a VAT
+ $code_sell_l = (!empty($conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT : '');
+ $suggestedaccountingaccountbydefaultfor = 'eecwithvat';
+ } elseif ($isSellerInEEC && $isBuyerInEEC && empty($buyer->tva_intra)) { // European intravat sale, without VAT intra community number
+ $code_sell_l = (!empty($conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT : '');
+ $suggestedaccountingaccountbydefaultfor = 'eecwithoutvatnumber';
+ } elseif ($isSellerInEEC && $isBuyerInEEC) { // European intravat sale
+ $code_sell_l = (!empty($conf->global->ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT : '');
+ $suggestedaccountingaccountbydefaultfor = 'eec';
+ } else {
+ $code_sell_l = (!empty($conf->global->ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT : '');
+ $suggestedaccountingaccountbydefaultfor = 'export';
+ }
+ }
+ }
+ if ($code_sell_l == -1) {
+ $code_sell_l = '';
+ }
+
+ // Level 2: Search suggested account for product/service (similar code exists in page index.php to make automatic binding)
+ $suggestedaccountingaccountfor = '';
+ if ((($buyer->country_code == $seller->country_code) || empty($buyer->country_code)) && !empty($product->accountancy_code_sell)) { // If buyer in same country than seller (if not defined, we assume it is same country)
+ $code_sell_p = $product->accountancy_code_sell;
+ $suggestedid = $accountingAccount['dom'];
+ $suggestedaccountingaccountfor = 'prodserv';
+ } else {
+ if ($isSellerInEEC && $isBuyerInEEC && $factureDet->tva_tx != 0 && !empty($product->accountancy_code_sell)) { // European intravat sale, but with VAT
+ $code_sell_p = $product->accountancy_code_sell;
+ $suggestedid = $accountingAccount['dom'];
+ $suggestedaccountingaccountfor = 'eecwithvat';
+ } elseif ($isSellerInEEC && $isBuyerInEEC && empty($buyer->tva_intra) && !empty($product->accountancy_code_sell)) { // European intravat sale, without VAT intra community number
+ $code_sell_p = $product->accountancy_code_sell;
+ $suggestedid = $accountingAccount['dom']; // There is a doubt for this case. Is it an error on vat or we just forgot to fill vat number ?
+ $suggestedaccountingaccountfor = 'eecwithoutvatnumber';
+ } elseif ($isSellerInEEC && $isBuyerInEEC && !empty($product->accountancy_code_sell_intra)) { // European intravat sale
+ $code_sell_p = $product->accountancy_code_sell_intra;
+ $suggestedid = $accountingAccount['intra'];
+ $suggestedaccountingaccountfor = 'eec';
+ } elseif (!empty($product->accountancy_code_sell_export)) { // Foreign sale
+ $code_sell_p = $product->accountancy_code_sell_export;
+ $suggestedid = $accountingAccount['export'];
+ $suggestedaccountingaccountfor = 'export';
+ }
+ }
+
+ // Level 3: Search suggested account for this thirdparty (similar code exists in page index.php to make automatic binding)
+ if (!empty($conf->global->ACCOUNTANCY_USE_PRODUCT_ACCOUNT_ON_THIRDPARTY)) {
+ if (!empty($buyer->code_compta)) {
+ $code_sell_t = $buyer->code_compta;
+ $suggestedid = $accountingAccount['thirdparty'];
+ $suggestedaccountingaccountfor = 'thridparty';
+ }
+ }
+
+ // Manage Deposit
+ if ($factureDet->desc == "(DEPOSIT)") {
+ $accountdeposittoventilated = new self($this->db);
+ $result = $accountdeposittoventilated->fetch('', $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT, 1);
+ if ($result < 0) {
+ return -1;
+ }
+
+ $code_sell_l = $accountdeposittoventilated->ref;
+ $suggestedid = $accountdeposittoventilated->rowid;
+ $suggestedaccountingaccountfor = 'deposit';
+ }
+
+ if (empty($suggestedid) && empty($code_sell_p) && !empty($code_sell_l) && empty($conf->global->ACCOUNTANCY_DO_NOT_AUTOFILL_ACCOUNT_WITH_GENERIC)) {
+ if (empty($this->accountingaccount_codetotid_cache[$code_sell_l])) {
+ $tmpaccount = new self($this->db);
+ $result = $tmpaccount->fetch(0, $code_sell_l, 1);
+ if ($result < 0) {
+ return -1;
+ }
+ if ($tmpaccount->id > 0) {
+ $suggestedid = $tmpaccount->id;
+ }
+ $this->accountingaccount_codetotid_cache[$code_sell_l] = $tmpaccount->id;
+ } else {
+ $suggestedid = $this->accountingaccount_codetotid_cache[$code_sell_l];
+ }
+ }
+ return array(
+ 'suggestedaccountingaccountbydefaultfor' => $suggestedaccountingaccountbydefaultfor,
+ 'suggestedaccountingaccountfor' => $suggestedaccountingaccountfor,
+ 'suggestedid' => $suggestedid,
+ 'code_sell_l' => $code_sell_l,
+ 'code_sell_p' => $code_sell_p,
+ 'code_sell_t' => $code_sell_t,
+ );
+ } else {
+ if (is_array($hookmanager->resArray) && !empty($hookmanager->resArray)) {
+ return $hookmanager->resArray;
}
}
}
diff --git a/htdocs/accountancy/customer/index.php b/htdocs/accountancy/customer/index.php
index 89c206df380..7c3cc2cf0e2 100644
--- a/htdocs/accountancy/customer/index.php
+++ b/htdocs/accountancy/customer/index.php
@@ -31,6 +31,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
+require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php';
// Load translation files required by the page
$langs->loadLangs(array("compta", "bills", "other", "accountancy"));
@@ -46,6 +47,7 @@ if (!$user->rights->accounting->bind->write) {
accessforbidden();
}
+$accountingAccount = new AccountingAccount($db);
$month_start = ($conf->global->SOCIETE_FISCAL_MONTH_START ? ($conf->global->SOCIETE_FISCAL_MONTH_START) : 1);
if (GETPOST("year", 'int')) {
@@ -172,35 +174,75 @@ if ($action == 'validatehistory') {
$isSellerInEEC = isInEEC($mysoc);
+ $thirdpartystatic = new Societe($db);
+ $facture_static = new Facture($db);
+ $facture_static_det = new FactureLigne($db);
+ $product_static = new Product($db);
+
$i = 0;
while ($i < min($num_lines, 10000)) { // No more than 10000 at once
$objp = $db->fetch_object($result);
- $isBuyerInEEC = isInEEC($objp); // This make a database request but there is a cache into $conf->cache['country_code_in_EEC']
+ $thirdpartystatic->id = $objp->socid;
+ $thirdpartystatic->name = $objp->name;
+ $thirdpartystatic->client = $objp->client;
+ $thirdpartystatic->fournisseur = $objp->fournisseur;
+ $thirdpartystatic->code_client = $objp->code_client;
+ $thirdpartystatic->code_compta_client = $objp->code_compta_client;
+ $thirdpartystatic->code_fournisseur = $objp->code_fournisseur;
+ $thirdpartystatic->code_compta_fournisseur = $objp->code_compta_fournisseur;
+ $thirdpartystatic->email = $objp->email;
+ $thirdpartystatic->country_code = $objp->country_code;
+ $thirdpartystatic->tva_intra = $objp->tva_intra;
+ $thirdpartystatic->code_compta = $objp->company_code_sell;
- // Level 2: Search suggested account for product/service (similar code exists in page list.php to make manual binding)
- $suggestedaccountingaccountfor = '';
- if (($objp->country_code == $mysoc->country_code) || empty($objp->country_code)) { // If buyer in same country than seller (if not defined, we assume it is same country)
- $objp->code_sell_p = $objp->code_sell;
- $objp->aarowid_suggest = $objp->aarowid;
- $suggestedaccountingaccountfor = '';
+ $product_static->ref = $objp->product_ref;
+ $product_static->id = $objp->product_id;
+ $product_static->type = $objp->type;
+ $product_static->label = $objp->product_label;
+ $product_static->status = $objp->status;
+ $product_static->status_buy = $objp->status_buy;
+ $product_static->accountancy_code_sell = $objp->code_sell;
+ $product_static->accountancy_code_sell_intra = $objp->code_sell_intra;
+ $product_static->accountancy_code_sell_export = $objp->code_sell_export;
+ $product_static->accountancy_code_buy = $objp->code_buy;
+ $product_static->accountancy_code_buy_intra = $objp->code_buy_intra;
+ $product_static->accountancy_code_buy_export = $objp->code_buy_export;
+ $product_static->tva_tx = $objp->tva_tx_prod;
+ $product_static->tva_tx = $objp->tva_tx_prod;
+
+ $facture_static->ref = $objp->ref;
+ $facture_static->id = $objp->facid;
+ $facture_static->type = $objp->ftype;
+ $facture_static->datef = $objp->datef;
+
+ $facture_static_det->id = $objp->rowid;
+ $facture_static_det->total_ht = $objp->total_ht;
+ $facture_static_det->tva_tx = $objp->tva_tx_line;
+ $facture_static_det->vat_src_code = $objp->vat_src_code;
+ $facture_static_det->product_type = $objp->type_l;
+ $facture_static_det->desc = $objp->description;
+
+ $accoutinAccountArray = array(
+ 'dom'=>$objp->aarowid,
+ 'intra'=>$objp->aarowid_intra,
+ 'export'=>$objp->aarowid_export,
+ 'thirdparty' =>$objp->aarowid_thirdparty);
+
+ $code_sell_p_notset = '';
+ $code_sell_t_notset = '';
+
+ $return=$accountingAccount->getAccountingCodeToBind($thirdpartystatic, $mysoc, $product_static, $facture_static, $facture_static_det, $accoutinAccountArray);
+ if (!is_array($return) && $return<0) {
+ setEventMessage($accountingAccount->error, 'errors');
} else {
- if ($isSellerInEEC && $isBuyerInEEC && $objp->tva_tx_line != 0) { // European intravat sale, but with VAT
- $objp->code_sell_p = $objp->code_sell;
- $objp->aarowid_suggest = $objp->aarowid;
- $suggestedaccountingaccountfor = 'eecwithvat';
- } elseif ($isSellerInEEC && $isBuyerInEEC && empty($objp->tva_intra)) { // European intravat sale, without VAT intra community number
- $objp->code_sell_p = $objp->code_sell;
- $objp->aarowid_suggest = 0; // There is a doubt, no automatic binding
- $suggestedaccountingaccountfor = 'eecwithoutvatnumber';
- } elseif ($isSellerInEEC && $isBuyerInEEC) { // European intravat sale
- $objp->code_sell_p = $objp->code_sell_intra;
- $objp->aarowid_suggest = $objp->aarowid_intra;
- $suggestedaccountingaccountfor = 'eec';
- } else { // Foreign sale
- $objp->code_sell_p = $objp->code_sell_export;
- $objp->aarowid_suggest = $objp->aarowid_export;
- $suggestedaccountingaccountfor = 'export';
+ $suggestedid=$return['suggestedid'];
+ $suggestedaccountingaccountfor=$return['suggestedaccountingaccountfor'];
+
+ if (!empty($suggestedid) && $suggestedaccountingaccountfor<>'') {
+ $suggestedid=$return['suggestedid'];
+ } else {
+ $suggestedid=0;
}
}
@@ -215,8 +257,8 @@ if ($action == 'validatehistory') {
if ($objp->aarowid_suggest > 0) {
$sqlupdate = "UPDATE ".MAIN_DB_PREFIX."facturedet";
- $sqlupdate .= " SET fk_code_ventilation = ".((int) $objp->aarowid_suggest);
- $sqlupdate .= " WHERE fk_code_ventilation <= 0 AND product_type <= 2 AND rowid = ".((int) $objp->rowid);
+ $sqlupdate .= " SET fk_code_ventilation = ".((int) $suggestedid);
+ $sqlupdate .= " WHERE fk_code_ventilation <= 0 AND product_type <= 2 AND rowid = ".((int) $facture_static_det->id);
$resqlupdate = $db->query($sqlupdate);
if (!$resqlupdate) {
diff --git a/htdocs/accountancy/customer/list.php b/htdocs/accountancy/customer/list.php
index 35e02d5b007..a730a8a9af6 100644
--- a/htdocs/accountancy/customer/list.php
+++ b/htdocs/accountancy/customer/list.php
@@ -45,6 +45,7 @@ $massaction = GETPOST('massaction', 'alpha');
$show_files = GETPOST('show_files', 'int');
$confirm = GETPOST('confirm', 'alpha');
$toselect = GETPOST('toselect', 'array');
+$optioncss = GETPOST('optioncss', 'alpha');
// Select Box
$mesCasesCochees = GETPOST('toselect', 'array');
@@ -96,6 +97,7 @@ if (!$sortorder) {
$hookmanager->initHooks(array('accountancycustomerlist'));
$formaccounting = new FormAccounting($db);
+$accountingAccount = new AccountingAccount($db);
$chartaccountcode = dol_getIdFromCode($db, $conf->global->CHARTOFACCOUNTS, 'accounting_system', 'rowid', 'pcg_version');
@@ -510,17 +512,17 @@ if ($result) {
$thirdpartystatic = new Societe($db);
$facture_static = new Facture($db);
+ $facture_static_det = new FactureLigne($db);
$product_static = new Product($db);
- $isSellerInEEC = isInEEC($mysoc);
$accountingaccount_codetotid_cache = array();
while ($i < min($num_lines, $limit)) {
$objp = $db->fetch_object($result);
- $objp->code_sell_l = '';
- $objp->code_sell_p = '';
+ $code_sell_l = '';
+ $code_sell_p = '';
$thirdpartystatic->id = $objp->socid;
$thirdpartystatic->name = $objp->name;
@@ -532,6 +534,8 @@ if ($result) {
$thirdpartystatic->code_compta_fournisseur = $objp->code_compta_fournisseur;
$thirdpartystatic->email = $objp->email;
$thirdpartystatic->country_code = $objp->country_code;
+ $thirdpartystatic->tva_intra = $objp->tva_intra;
+ $thirdpartystatic->code_compta = $objp->company_code_sell;
$product_static->ref = $objp->product_ref;
$product_static->id = $objp->product_id;
@@ -545,146 +549,84 @@ if ($result) {
$product_static->accountancy_code_buy = $objp->code_buy;
$product_static->accountancy_code_buy_intra = $objp->code_buy_intra;
$product_static->accountancy_code_buy_export = $objp->code_buy_export;
+ $product_static->tva_tx = $objp->tva_tx_prod;
+ $product_static->tva_tx = $objp->tva_tx_prod;
$facture_static->ref = $objp->ref;
$facture_static->id = $objp->facid;
$facture_static->type = $objp->ftype;
+ $facture_static->datef = $objp->datef;
+
+ $facture_static_det->id = $objp->rowid;
+ $facture_static_det->total_ht = $objp->total_ht;
+ $facture_static_det->tva_tx = $objp->tva_tx_line;
+ $facture_static_det->vat_src_code = $objp->vat_src_code;
+ $facture_static_det->product_type = $objp->type_l;
+ $facture_static_det->desc = $objp->description;
+
+ $accoutinAccountArray = array(
+ 'dom'=>$objp->aarowid,
+ 'intra'=>$objp->aarowid_intra,
+ 'export'=>$objp->aarowid_export,
+ 'thirdparty' =>$objp->aarowid_thirdparty);
$code_sell_p_notset = '';
$code_sell_t_notset = '';
- $objp->aarowid_suggest = ''; // Will be set later
- $isBuyerInEEC = isInEEC($objp);
-
- // Level 1: Search suggested default account for product/service
- $suggestedaccountingaccountbydefaultfor = '';
- if ($objp->type_l == 1) {
- if ($objp->country_code == $mysoc->country_code || empty($objp->country_code)) { // If buyer in same country than seller (if not defined, we assume it is same country)
- $objp->code_sell_l = (!empty($conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT : '');
- $suggestedaccountingaccountbydefaultfor = '';
- } else {
- if ($isSellerInEEC && $isBuyerInEEC && $objp->tva_tx_line != 0) { // European intravat sale, but with a VAT
- $objp->code_sell_l = (!empty($conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT : '');
- $suggestedaccountingaccountbydefaultfor = 'eecwithvat';
- } elseif ($isSellerInEEC && $isBuyerInEEC && empty($objp->tva_intra)) { // European intravat sale, without VAT intra community number
- $objp->code_sell_l = (!empty($conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT : '');
- $suggestedaccountingaccountbydefaultfor = 'eecwithoutvatnumber';
- } elseif ($isSellerInEEC && $isBuyerInEEC) { // European intravat sale
- $objp->code_sell_l = (!empty($conf->global->ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT : '');
- $suggestedaccountingaccountbydefaultfor = 'eec';
- } else { // Foreign sale
- $objp->code_sell_l = (!empty($conf->global->ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT : '');
- $suggestedaccountingaccountbydefaultfor = 'export';
- }
- }
- } elseif ($objp->type_l == 0) {
- if ($objp->country_code == $mysoc->country_code || empty($objp->country_code)) { // If buyer in same country than seller (if not defined, we assume it is same country)
- $objp->code_sell_l = (!empty($conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT : '');
- $suggestedaccountingaccountbydefaultfor = '';
- } else {
- if ($isSellerInEEC && $isBuyerInEEC && $objp->tva_tx_line != 0) { // European intravat sale, but with a VAT
- $objp->code_sell_l = (!empty($conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT : '');
- $suggestedaccountingaccountbydefaultfor = 'eecwithvat';
- } elseif ($isSellerInEEC && $isBuyerInEEC && empty($objp->tva_intra)) { // European intravat sale, without VAT intra community number
- $objp->code_sell_l = (!empty($conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT : '');
- $suggestedaccountingaccountbydefaultfor = 'eecwithoutvatnumber';
- } elseif ($isSellerInEEC && $isBuyerInEEC) { // European intravat sale
- $objp->code_sell_l = (!empty($conf->global->ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT : '');
- $suggestedaccountingaccountbydefaultfor = 'eec';
- } else {
- $objp->code_sell_l = (!empty($conf->global->ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT : '');
- $suggestedaccountingaccountbydefaultfor = 'export';
- }
- }
- }
- if ($objp->code_sell_l == -1) {
- $objp->code_sell_l = '';
- }
-
- // Level 2: Search suggested account for product/service (similar code exists in page index.php to make automatic binding)
- $suggestedaccountingaccountfor = '';
- if (($objp->country_code == $mysoc->country_code) || empty($objp->country_code)) { // If buyer in same country than seller (if not defined, we assume it is same country)
- $objp->code_sell_p = $objp->code_sell;
- $objp->aarowid_suggest = $objp->aarowid;
- $suggestedaccountingaccountfor = '';
+ $return=$accountingAccount->getAccountingCodeToBind($thirdpartystatic, $mysoc, $product_static, $facture_static, $facture_static_det, $accoutinAccountArray);
+ if (!is_array($return) && $return<0) {
+ setEventMessage($accountingAccount->error, 'errors');
} else {
- if ($isSellerInEEC && $isBuyerInEEC && $objp->tva_tx_line != 0) { // European intravat sale, but with VAT
- $objp->code_sell_p = $objp->code_sell;
- $objp->aarowid_suggest = $objp->aarowid;
- $suggestedaccountingaccountfor = 'eecwithvat';
- } elseif ($isSellerInEEC && $isBuyerInEEC && empty($objp->tva_intra)) { // European intravat sale, without VAT intra community number
- $objp->code_sell_p = $objp->code_sell;
- $objp->aarowid_suggest = $objp->aarowid; // There is a doubt for this case. Is it an error on vat or we just forgot to fill vat number ?
- $suggestedaccountingaccountfor = 'eecwithoutvatnumber';
- } elseif ($isSellerInEEC && $isBuyerInEEC) { // European intravat sale
- $objp->code_sell_p = $objp->code_sell_intra;
- $objp->aarowid_suggest = $objp->aarowid_intra;
- $suggestedaccountingaccountfor = 'eec';
- } else { // Foreign sale
- $objp->code_sell_p = $objp->code_sell_export;
- $objp->aarowid_suggest = $objp->aarowid_export;
- $suggestedaccountingaccountfor = 'export';
- }
+ $suggestedid=$return['suggestedid'];
+ $suggestedaccountingaccountfor=$return['suggestedaccountingaccountfor'];
+ $suggestedaccountingaccountbydefaultfor=$return['suggestedaccountingaccountbydefaultfor'];
+ $code_sell_l=$return['code_sell_l'];
+ $code_sell_p=$return['code_sell_p'];
+ $code_sell_t=$return['code_sell_t'];
}
+ //var_dump($return);
- // Level 3: Search suggested account for this thirdparty (similar code exists in page index.php to make automatic binding)
- if (!empty($conf->global->ACCOUNTANCY_USE_PRODUCT_ACCOUNT_ON_THIRDPARTY)) {
- if (!empty($objp->company_code_sell)) {
- $objp->code_sell_t = $objp->company_code_sell;
- $objp->aarowid_suggest = $objp->aarowid_thirdparty;
- $suggestedaccountingaccountfor = '';
- }
- }
-
- // Manage Deposit
- if ($objp->description == "(DEPOSIT)") {
- $accountdeposittoventilated = new AccountingAccount($db);
- $accountdeposittoventilated->fetch('', $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT, 1);
- $objp->code_sell_l = $accountdeposittoventilated->ref;
- $objp->aarowid_suggest = $accountdeposittoventilated->rowid;
- }
-
- if (!empty($objp->code_sell_p)) {
+ if (!empty($code_sell_p)) {
// Value was defined previously
} else {
$code_sell_p_notset = 'color:orange';
}
- if (empty($objp->code_sell_l) && empty($objp->code_sell_p)) {
+ if (empty($code_sell_l) && empty($code_sell_p)) {
$code_sell_p_notset = 'color:red';
}
if ($suggestedaccountingaccountfor == 'eecwithoutvatnumber' && empty($code_sell_p_notset)) {
$code_sell_p_notset = 'color:orange';
}
- // $objp->code_sell_l is now default code of product/service
- // $objp->code_sell_p is now code of product/service
- // $objp->code_sell_t is now code of thirdparty
+ // $code_sell_l is now default code of product/service
+ // $code_sell_p is now code of product/service
+ // $code_sell_t is now code of thirdparty
print '';
// Line id
- print ''.$objp->rowid.' ';
+ print ''.$facture_static_det->id.' ';
// Ref Invoice
print ''.$facture_static->getNomUrl(1).' ';
- print ''.dol_print_date($db->jdate($objp->datef), 'day').' ';
+ print ''.dol_print_date($db->jdate($facture_static->datef), 'day').' ';
// Ref Product
print '';
if ($product_static->id > 0) {
print $product_static->getNomUrl(1);
}
- if ($objp->product_label) {
- print ''.$objp->product_label.' ';
+ if ($product_static->label) {
+ print ''.$product_static->label.' ';
}
print ' ';
// Description
print '';
- $text = dolGetFirstLineOfText(dol_string_nohtmltag($objp->description));
+ $text = dolGetFirstLineOfText(dol_string_nohtmltag($facture_static_det->desc));
$trunclength = empty($conf->global->ACCOUNTING_LENGTH_DESCRIPTION) ? 32 : $conf->global->ACCOUNTING_LENGTH_DESCRIPTION;
- print $form->textwithtooltip(dol_trunc($text, $trunclength), $objp->description);
+ print $form->textwithtooltip(dol_trunc($text, $trunclength), $facture_static_det->desc);
print ' ';
print '';
@@ -692,11 +634,12 @@ if ($result) {
print ' ';
// Vat rate
- if ($objp->vat_tx_l != $objp->vat_tx_p) {
+ $code_vat_differ='';
+ if ($product_static->tva_tx !== $facture_static_det->tva_tx) {
$code_vat_differ = 'font-weight:bold; text-decoration:blink; color:red';
}
print '';
- print vatrate($objp->tva_tx_line.($objp->vat_src_code ? ' ('.$objp->vat_src_code.')' : ''));
+ print vatrate($facture_static_det->tva_tx.($facture_static_det->vat_src_code ? ' ('.$facture_static_det->vat_src_code.')' : ''));
print ' ';
// Thirdparty
@@ -713,18 +656,18 @@ if ($result) {
// Found accounts
print '';
- $s = '1. '.(($objp->type_l == 1) ? $langs->trans("DefaultForService") : $langs->trans("DefaultForProduct")).': ';
+ $s = '1. '.(($facture_static_det->product_type == 1) ? $langs->trans("DefaultForService") : $langs->trans("DefaultForProduct")).': ';
$shelp = '';
if ($suggestedaccountingaccountbydefaultfor == 'eec') {
$shelp .= $langs->trans("SaleEEC");
} elseif ($suggestedaccountingaccountbydefaultfor == 'export') {
$shelp .= $langs->trans("SaleExport");
}
- $s .= ($objp->code_sell_l > 0 ? length_accountg($objp->code_sell_l) : ''.$langs->trans("NotDefined").' ');
+ $s .= ($code_sell_l > 0 ? length_accountg($code_sell_l) : ''.$langs->trans("NotDefined").' ');
print $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1);
- if ($objp->product_id > 0) {
+ if ($product_static->id > 0) {
print ' ';
- $s = '2. '.(($objp->type_l == 1) ? $langs->trans("ThisService") : $langs->trans("ThisProduct")).': ';
+ $s = '2. '.(($facture_static_det->product_type == 1) ? $langs->trans("ThisService") : $langs->trans("ThisProduct")).': ';
$shelp = ''; $ttype = 'help';
if ($suggestedaccountingaccountfor == 'eec') {
$shelp = $langs->trans("SaleEEC");
@@ -736,7 +679,7 @@ if ($result) {
} elseif ($suggestedaccountingaccountfor == 'export') {
$shelp = $langs->trans("SaleExport");
}
- $s .= (empty($objp->code_sell_p) ? ''.$langs->trans("NotDefined").' ' : length_accountg($objp->code_sell_p));
+ $s .= (empty($code_sell_p) ? ''.$langs->trans("NotDefined").' ' : length_accountg($code_sell_p));
print $form->textwithpicto($s, $shelp, 1, $ttype, '', 0, 2, '', 1);
} else {
print ' ';
@@ -747,38 +690,26 @@ if ($result) {
}
if (!empty($conf->global->ACCOUNTANCY_USE_PRODUCT_ACCOUNT_ON_THIRDPARTY)) {
print ' ';
- $s = '3. '.(($objp->type_l == 1) ? $langs->trans("ServiceForThisThirdparty") : $langs->trans("ProductForThisThirdparty")).': ';
+ $s = '3. '.(($facture_static_det->product_type == 1) ? $langs->trans("ServiceForThisThirdparty") : $langs->trans("ProductForThisThirdparty")).': ';
$shelp = '';
- $s .= ($objp->code_sell_t > 0 ? length_accountg($objp->code_sell_t) : ''.$langs->trans("NotDefined").' ');
+ $s .= ($code_sell_t > 0 ? length_accountg($code_sell_t) : ''.$langs->trans("NotDefined").' ');
print $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1);
}
print ' ';
// Suggested accounting account
print '';
- $suggestedid = $objp->aarowid_suggest;
- if (empty($suggestedid) && empty($objp->code_sell_p) && !empty($objp->code_sell_l) && empty($conf->global->ACCOUNTANCY_DO_NOT_AUTOFILL_ACCOUNT_WITH_GENERIC)) {
- if (empty($accountingaccount_codetotid_cache[$objp->code_sell_l])) {
- $tmpaccount = new AccountingAccount($db);
- $tmpaccount->fetch(0, $objp->code_sell_l, 1);
- if ($tmpaccount->id > 0) {
- $suggestedid = $tmpaccount->id;
- }
- $accountingaccount_codetotid_cache[$objp->code_sell_l] = $tmpaccount->id;
- } else {
- $suggestedid = $accountingaccount_codetotid_cache[$objp->code_sell_l];
- }
- }
- print $formaccounting->select_account($suggestedid, 'codeventil'.$objp->rowid, 1, array(), 0, 0, 'codeventil maxwidth200 maxwidthonsmartphone', 'cachewithshowemptyone');
+ print $formaccounting->select_account($suggestedid, 'codeventil'.$facture_static_det->id, 1, array(), 0, 0, 'codeventil maxwidth200 maxwidthonsmartphone', 'cachewithshowemptyone');
print ' ';
// Column with checkbox
print '';
- $ischecked = $objp->aarowid_suggest;
- if ($suggestedaccountingaccountfor == 'eecwithoutvatnumber') {
+ if (!empty($suggestedid) && $suggestedaccountingaccountfor<>'') {
+ $ischecked=1;
+ } elseif ($suggestedaccountingaccountfor == 'eecwithoutvatnumber') {
$ischecked = 0;
}
- print ' ';
+ print ' ';
print ' ';
print ' ';
diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php
index d05135e7a67..4367241dbd7 100644
--- a/htdocs/accountancy/journal/bankjournal.php
+++ b/htdocs/accountancy/journal/bankjournal.php
@@ -362,7 +362,7 @@ if ($result) {
// Retrieve the accounting code of the social contribution of the payment from link of payment.
// Note: We have the social contribution id, it can be faster to get accounting code from social contribution id.
- $sqlmid = 'SELECT cchgsoc.accountancy_code';
+ $sqlmid = "SELECT cchgsoc.accountancy_code";
$sqlmid .= " FROM ".MAIN_DB_PREFIX."c_chargesociales cchgsoc";
$sqlmid .= " INNER JOIN ".MAIN_DB_PREFIX."chargesociales as chgsoc ON chgsoc.fk_type = cchgsoc.id";
$sqlmid .= " INNER JOIN ".MAIN_DB_PREFIX."paiementcharge as paycharg ON paycharg.fk_charge = chgsoc.rowid";
@@ -1019,7 +1019,7 @@ if (empty($action) || $action == 'view') {
// Test that setup is complete (we are in accounting, so test on entity is always on $conf->entity only, no sharing allowed)
- $sql = 'SELECT COUNT(rowid) as nb FROM '.MAIN_DB_PREFIX.'bank_account WHERE entity = '.$conf->entity.' AND fk_accountancy_journal IS NULL AND clos=0';
+ $sql = "SELECT COUNT(rowid) as nb FROM ".MAIN_DB_PREFIX."bank_account WHERE entity = ".((int) $conf->entity)." AND fk_accountancy_journal IS NULL AND clos=0";
$resql = $db->query($sql);
if ($resql) {
$obj = $db->fetch_object($resql);
diff --git a/htdocs/adherents/subscription.php b/htdocs/adherents/subscription.php
index 26a45271801..c51fa86cec6 100644
--- a/htdocs/adherents/subscription.php
+++ b/htdocs/adherents/subscription.php
@@ -670,7 +670,7 @@ if ($rowid > 0) {
print '';
if ($object->statut > 0) {
- print '
";
+ print '
";
} else {
print '
';
}
diff --git a/htdocs/adherents/type.php b/htdocs/adherents/type.php
index 6a294b0256a..97307ffe23f 100644
--- a/htdocs/adherents/type.php
+++ b/htdocs/adherents/type.php
@@ -318,6 +318,19 @@ if (!$rowid && $action != 'create' && $action != 'edit') {
print "";
$i++;
}
+
+ // If no record found
+ if ($num == 0) {
+ /*$colspan = 1;
+ foreach ($arrayfields as $key => $val) {
+ if (!empty($val['checked'])) {
+ $colspan++;
+ }
+ }*/
+ $colspan = 8;
+ print '
'.$langs->trans("NoRecordFound").' ';
+ }
+
print "";
print '
';
diff --git a/htdocs/admin/boxes.php b/htdocs/admin/boxes.php
index 2e4226e89d5..afcba2ef23d 100644
--- a/htdocs/admin/boxes.php
+++ b/htdocs/admin/boxes.php
@@ -360,7 +360,7 @@ foreach ($boxtoadd as $box) {
print ''."\n";
}
if (!count($boxtoadd) && count($boxactivated)) {
- print ''.$langs->trans("AllWidgetsWereEnabled").' ';
+ print ''.$langs->trans("AllWidgetsWereEnabled").' ';
}
print ''."\n";
print '';
diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php
index 02a3cb07ffa..af18ce541a9 100644
--- a/htdocs/admin/dict.php
+++ b/htdocs/admin/dict.php
@@ -1178,6 +1178,8 @@ if ($id) {
$sql .= natural_search("r.code_region", $search_code);
} elseif ($search_code != '' && $id == 7) {
$sql .= natural_search("a.code", $search_code);
+ } elseif ($search_code != '' && $id == 10) {
+ $sql .= natural_search("t.code", $search_code);
} elseif ($search_code != '' && $id != 9) {
$sql .= natural_search("code", $search_code);
}
diff --git a/htdocs/admin/dolistore/class/PSWebServiceLibrary.class.php b/htdocs/admin/dolistore/class/PSWebServiceLibrary.class.php
index adaf82d6964..5a23133923e 100644
--- a/htdocs/admin/dolistore/class/PSWebServiceLibrary.class.php
+++ b/htdocs/admin/dolistore/class/PSWebServiceLibrary.class.php
@@ -232,7 +232,7 @@ class PrestaShopWebservice
if ($response != '') {
libxml_clear_errors();
libxml_use_internal_errors(true);
- $xml = simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA);
+ $xml = simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA|LIBXML_NONET);
if (libxml_get_errors()) {
$msg = var_export(libxml_get_errors(), true);
libxml_clear_errors();
diff --git a/htdocs/admin/eventorganization_confbooth_extrafields.php b/htdocs/admin/eventorganization_confbooth_extrafields.php
index 6e19bde8268..991ed3f824a 100644
--- a/htdocs/admin/eventorganization_confbooth_extrafields.php
+++ b/htdocs/admin/eventorganization_confbooth_extrafields.php
@@ -16,7 +16,7 @@
*/
/**
- * \file htdocs/admin/eventorganization_extrafields.php
+ * \file htdocs/admin/eventorganization_confbooth_extrafields.php
* \ingroup bom
* \brief Page to setup extra fields of EventOrganization
*/
diff --git a/htdocs/admin/eventorganization_confboothattendee_extrafields.php b/htdocs/admin/eventorganization_confboothattendee_extrafields.php
index 6b201e6b923..0b50c483d69 100644
--- a/htdocs/admin/eventorganization_confboothattendee_extrafields.php
+++ b/htdocs/admin/eventorganization_confboothattendee_extrafields.php
@@ -21,7 +21,7 @@
*/
/**
- * \file admin/conferenceorboothattendee_extrafields.php
+ * \file htdocs/admin/eventorganization_confboothattendee_extrafields.php
* \ingroup eventorganization
* \brief Page to setup extra fields of conferenceorboothattendee
*/
diff --git a/htdocs/admin/expensereport.php b/htdocs/admin/expensereport.php
index f7c9a84c5d1..f063c113af5 100644
--- a/htdocs/admin/expensereport.php
+++ b/htdocs/admin/expensereport.php
@@ -145,7 +145,13 @@ if ($action == 'updateMask') {
$draft = GETPOST('EXPENSEREPORT_DRAFT_WATERMARK', 'alpha');
$res2 = dolibarr_set_const($db, "EXPENSEREPORT_DRAFT_WATERMARK", trim($draft), 'chaine', 0, '', $conf->entity);
- if (!$res1 > 0 || !$res2 > 0) {
+ $dates = GETPOST('EXPENSEREPORT_PREFILL_DATES_WITH_CURRENT_MONTH', 'int');
+ $res3 = dolibarr_set_const($db, 'EXPENSEREPORT_PREFILL_DATES_WITH_CURRENT_MONTH', intval($dates), 'chaine', 0, '', $conf->entity);
+
+ $amounts = GETPOST('EXPENSEREPORT_FORCE_LINE_AMOUNTS_INCLUDING_TAXES_ONLY', 'int');
+ $res4 = dolibarr_set_const($db, 'EXPENSEREPORT_FORCE_LINE_AMOUNTS_INCLUDING_TAXES_ONLY', intval($amounts), 'chaine', 0, '', $conf->entity);
+
+ if (!($res1 > 0) || !($res2 > 0) || !($res3 > 0) || !($res4 >0)) {
$error++;
}
@@ -458,6 +464,18 @@ print $form->textwithpicto($langs->trans("WatermarkOnDraftExpenseReports"), $htm
print ' ';
print ''."\n";
+print '';
+print $langs->trans('PrefillExpenseReportDatesWithCurrentMonth');
+print ' ';
+print $form->selectyesno('EXPENSEREPORT_PREFILL_DATES_WITH_CURRENT_MONTH', empty($conf->global->EXPENSEREPORT_PREFILL_DATES_WITH_CURRENT_MONTH) ? 0 : 1, 1);
+print ' ';
+
+print '';
+print $langs->trans('ForceExpenseReportsLineAmountsIncludingTaxesOnly');
+print ' ';
+print $form->selectyesno('EXPENSEREPORT_FORCE_LINE_AMOUNTS_INCLUDING_TAXES_ONLY', empty($conf->global->EXPENSEREPORT_FORCE_LINE_AMOUNTS_INCLUDING_TAXES_ONLY) ? 0 : 1, 1);
+print ' ';
+
print '';
print $form->buttonsSaveCancel("Save", '');
diff --git a/htdocs/admin/knowledgemanagement.php b/htdocs/admin/knowledgemanagement.php
index 10f308b2b2c..8d93c16741a 100644
--- a/htdocs/admin/knowledgemanagement.php
+++ b/htdocs/admin/knowledgemanagement.php
@@ -17,7 +17,7 @@
*/
/**
- * \file knowledgemanagement/admin/setup.php
+ * \file htdocs/admin/knowledgemanagement.php
* \ingroup knowledgemanagement
* \brief KnowledgeManagement setup page.
*/
@@ -65,9 +65,7 @@ if (!$user->admin) {
* Actions
*/
-if ((float) DOL_VERSION >= 6) {
- include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php';
-}
+include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php';
if ($action == 'updateMask') {
$maskconstorder = GETPOST('maskconstorder', 'alpha');
diff --git a/htdocs/admin/menus/edit.php b/htdocs/admin/menus/edit.php
index aaadde965a2..65906b83f3c 100644
--- a/htdocs/admin/menus/edit.php
+++ b/htdocs/admin/menus/edit.php
@@ -281,7 +281,7 @@ if ($action == 'create') {
print load_fiche_titre($langs->trans("NewMenu"), '', 'title_setup');
- print '';
+ print ' ';
if ($optioncss != '') {
print ' ';
}
- print ' ';
print ' ';
print ' ';
print ' ';
@@ -217,7 +221,7 @@ if ($result) {
$i++;
}
} else {
- print ''.$langs->trans("None").' ';
+ print ''.$langs->trans("None").' ';
}
print "";
diff --git a/htdocs/compta/prelevement/rejets.php b/htdocs/compta/prelevement/rejets.php
index ed8c704bcfa..029d5dd8598 100644
--- a/htdocs/compta/prelevement/rejets.php
+++ b/htdocs/compta/prelevement/rejets.php
@@ -33,13 +33,6 @@ require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
// Load translation files required by the page
$langs->loadLangs(array('banks', 'categories', 'withdrawals', 'companies'));
-// Security check
-$socid = GETPOST('socid', 'int');
-if ($user->socid) {
- $socid = $user->socid;
-}
-$result = restrictedArea($user, 'prelevement', '', '', 'bons');
-
$type = GETPOST('type', 'aZ09');
// Get supervariables
@@ -54,6 +47,17 @@ $offset = $limit * $page;
$pageprev = $page - 1;
$pagenext = $page + 1;
+// Security check
+$socid = GETPOST('socid', 'int');
+if ($user->socid) {
+ $socid = $user->socid;
+}
+if ($type == 'bank-transfer') {
+ $result = restrictedArea($user, 'paymentbybanktransfer', '', '', '');
+} else {
+ $result = restrictedArea($user, 'prelevement', '', '', 'bons');
+}
+
/*
* View
@@ -140,7 +144,7 @@ if ($result) {
$i++;
}
} else {
- print ''.$langs->trans("None").' ';
+ print ''.$langs->trans("None").' ';
}
print "";
diff --git a/htdocs/compta/prelevement/stats.php b/htdocs/compta/prelevement/stats.php
index ae1dd54a13c..9c30db6e08a 100644
--- a/htdocs/compta/prelevement/stats.php
+++ b/htdocs/compta/prelevement/stats.php
@@ -31,14 +31,18 @@ require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
// Load translation files required by the page
$langs->loadLangs(array('banks', 'categories', 'withdrawals', 'companies'));
+$type = GETPOST('type', 'aZ09');
+
// Security check
$socid = GETPOST('socid', 'int');
if ($user->socid) {
$socid = $user->socid;
}
-$result = restrictedArea($user, 'prelevement', '', '', 'bons');
-
-$type = GETPOST('type', 'aZ09');
+if ($type == 'bank-transfer') {
+ $result = restrictedArea($user, 'paymentbybanktransfer', '', '', '');
+} else {
+ $result = restrictedArea($user, 'prelevement', '', '', 'bons');
+}
/*
diff --git a/htdocs/contact/consumption.php b/htdocs/contact/consumption.php
index 974bfb15e77..bb610baa4b0 100644
--- a/htdocs/contact/consumption.php
+++ b/htdocs/contact/consumption.php
@@ -645,7 +645,7 @@ if ($sql_select) {
print_liste_field_titre('Quantity', $_SERVER['PHP_SELF'], 'prod_qty', '', $param, '', $sortfield, $sortorder, 'right ');
print "\n";
- print ''.$langs->trans("SelectElementAndClick", $langs->transnoentitiesnoconv("Search")).' ';
+ print ''.$langs->trans("SelectElementAndClick", $langs->transnoentitiesnoconv("Search")).' ';
print "";
} else {
@@ -653,7 +653,7 @@ if ($sql_select) {
print ''."\n";
- print ''.$langs->trans("FeatureNotYetAvailable").' ';
+ print ''.$langs->trans("FeatureNotYetAvailable").' ';
print "
";
}
diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php
index 66d84874d76..7e19ec13e22 100644
--- a/htdocs/contrat/list.php
+++ b/htdocs/contrat/list.php
@@ -431,40 +431,40 @@ if ($search_ref_supplier != '') {
if ($search_op2df != '') {
$param .= '&search_op2df='.urlencode($search_op2df);
}
-if ($search_date_startday) {
+if ($search_date_startday > 0) {
$param .= '&search_date_startday='.urlencode($search_date_startday);
}
-if ($search_date_startmonth) {
+if ($search_date_startmonth > 0) {
$param .= '&search_date_startmonth='.urlencode($search_date_startmonth);
}
-if ($search_date_startyear) {
+if ($search_date_startyear > 0) {
$param .= '&search_date_startyear='.urlencode($search_date_startyear);
}
-if ($search_date_endday) {
+if ($search_date_endday > 0) {
$param .= '&search_date_endday='.urlencode($search_date_endday);
}
-if ($search_date_endmonth) {
+if ($search_date_endmonth > 0) {
$param .= '&search_date_endmonth='.urlencode($search_date_endmonth);
}
-if ($search_date_endyear) {
+if ($search_date_endyear > 0) {
$param .= '&search_date_endyear='.urlencode($search_date_endyear);
}
-if ($search_dfyear != '') {
+if ($search_dfyear > 0) {
$param .= '&search_dfyear='.urlencode($search_dfyear);
}
-if ($search_dfmonth != '') {
+if ($search_dfmonth > 0) {
$param .= '&search_dfmonth='.urlencode($search_dfmonth);
}
-if ($search_sale != '') {
+if ($search_sale > 0) {
$param .= '&search_sale='.urlencode($search_sale);
}
-if ($search_user != '') {
+if ($search_user > 0) {
$param .= '&search_user='.urlencode($search_user);
}
-if ($search_type_thirdparty != '' && $search_type_thirdparty > 0) {
+if ($search_type_thirdparty > 0) {
$param .= '&search_type_thirdparty='.urlencode($search_type_thirdparty);
}
-if ($search_product_category != '') {
+if ($search_product_category > 0) {
$param .= '&search_product_category='.urlencode($search_product_category);
}
if ($show_files) {
diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php
index d10cd2d2f02..00bfe865aaa 100644
--- a/htdocs/core/actions_massactions.inc.php
+++ b/htdocs/core/actions_massactions.inc.php
@@ -357,7 +357,7 @@ if (!$error && $massaction == 'confirm_presend') {
$tmp = explode(',', $conf->global->MAIN_INFO_SOCIETE_MAIL_ALIASES);
$from = trim($tmp[($reg[1] - 1)]);
} elseif (preg_match('/senderprofile_(\d+)_(\d+)/', $fromtype, $reg)) {
- $sql = 'SELECT rowid, label, email FROM '.MAIN_DB_PREFIX.'c_email_senderprofile WHERE rowid = '.(int) $reg[1];
+ $sql = "SELECT rowid, label, email FROM ".MAIN_DB_PREFIX."c_email_senderprofile WHERE rowid = ".(int) $reg[1];
$resql = $db->query($sql);
$obj = $db->fetch_object($resql);
if ($obj) {
diff --git a/htdocs/core/ajax/row.php b/htdocs/core/ajax/row.php
index 6047d8d289c..52cc23faf8f 100644
--- a/htdocs/core/ajax/row.php
+++ b/htdocs/core/ajax/row.php
@@ -99,6 +99,8 @@ if (GETPOST('roworder', 'alpha', 3) && GETPOST('table_element_line', 'aZ09', 3)
$perm = 1;
} elseif ($table_element_line == 'ecm_files' && $fk_element == 'fk_ticket' && !empty($user->rights->ticket->write)) {
$perm = 1;
+ } elseif ($table_element_line == 'product_association' && $fk_element == 'fk_product' && !empty($user->rights->produit->creer)) {
+ $perm = 1;
} elseif ($table_element_line == 'projet_task' && $fk_element == 'fk_projet' && $user->rights->projet->creer) {
$perm = 1;
} else {
diff --git a/htdocs/core/boxes/box_validated_projects.php b/htdocs/core/boxes/box_validated_projects.php
index d756e1461ea..3f2b2cdc221 100644
--- a/htdocs/core/boxes/box_validated_projects.php
+++ b/htdocs/core/boxes/box_validated_projects.php
@@ -157,7 +157,7 @@ class box_validated_projects extends ModeleBoxes
);
if ($objp->fk_soc > 0) {
- $sql = 'SELECT rowid, nom as name FROM '.MAIN_DB_PREFIX.'societe WHERE rowid = '.((int) $objp->fk_soc);
+ $sql = "SELECT rowid, nom as name FROM ".MAIN_DB_PREFIX."societe WHERE rowid = ".((int) $objp->fk_soc);
$resql = $this->db->query($sql);
//$socstatic = new Societe($this->db);
$obj2 = $this->db->fetch_object($resql);
diff --git a/htdocs/core/class/commonincoterm.class.php b/htdocs/core/class/commonincoterm.class.php
index 11af43c2914..d0485acc5a9 100644
--- a/htdocs/core/class/commonincoterm.class.php
+++ b/htdocs/core/class/commonincoterm.class.php
@@ -60,7 +60,7 @@ trait CommonIncoterm
$this->label_incoterms = '';
if (!empty($this->fk_incoterms)) {
- $sql = 'SELECT code FROM '.MAIN_DB_PREFIX.'c_incoterms WHERE rowid = '.(int) $this->fk_incoterms;
+ $sql = "SELECT code FROM ".MAIN_DB_PREFIX."c_incoterms WHERE rowid = ".(int) $this->fk_incoterms;
$result = $this->db->query($sql);
if ($result) {
$res = $this->db->fetch_object($result);
@@ -80,7 +80,7 @@ trait CommonIncoterm
*/
public function getIncotermsForPDF()
{
- $sql = 'SELECT code FROM '.MAIN_DB_PREFIX.'c_incoterms WHERE rowid = '.(int) $this->fk_incoterms;
+ $sql = "SELECT code FROM ".MAIN_DB_PREFIX."c_incoterms WHERE rowid = ".(int) $this->fk_incoterms;
$resql = $this->db->query($sql);
if ($resql) {
$num = $this->db->num_rows($resql);
@@ -107,7 +107,7 @@ trait CommonIncoterm
{
if ($this->id && $this->table_element) {
$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
- $sql .= " SET fk_incoterms = ".($id_incoterm > 0 ? $id_incoterm : "null");
+ $sql .= " SET fk_incoterms = ".($id_incoterm > 0 ? ((int) $id_incoterm) : "null");
$sql .= ", location_incoterms = ".($id_incoterm > 0 ? "'".$this->db->escape($location)."'" : "null");
$sql .= " WHERE rowid = ".((int) $this->id);
dol_syslog(get_class($this).'::setIncoterms', LOG_DEBUG);
@@ -116,7 +116,7 @@ trait CommonIncoterm
$this->fk_incoterms = $id_incoterm;
$this->location_incoterms = $location;
- $sql = 'SELECT libelle as label_incotermsFROM '.MAIN_DB_PREFIX.'c_incoterms WHERE rowid = '.(int) $this->fk_incoterms;
+ $sql = "SELECT libelle as label_incoterms FROM ".MAIN_DB_PREFIX."c_incoterms WHERE rowid = ".(int) $this->fk_incoterms;
$res = $this->db->query($sql);
if ($res) {
$obj = $this->db->fetch_object($res);
diff --git a/htdocs/core/class/commoninvoice.class.php b/htdocs/core/class/commoninvoice.class.php
index dfabfd24ebe..3b98d3f3356 100644
--- a/htdocs/core/class/commoninvoice.class.php
+++ b/htdocs/core/class/commoninvoice.class.php
@@ -226,8 +226,8 @@ abstract class CommonInvoice extends CommonObject
$idarray = array();
$sql = 'SELECT rowid';
- $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element;
- $sql .= ' WHERE fk_facture_source = '.((int) $this->id);
+ $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element;
+ $sql .= " WHERE fk_facture_source = ".((int) $this->id);
$sql .= ' AND type = 2';
$resql = $this->db->query($sql);
if ($resql) {
@@ -253,8 +253,8 @@ abstract class CommonInvoice extends CommonObject
public function getIdReplacingInvoice($option = '')
{
$sql = 'SELECT rowid';
- $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element;
- $sql .= ' WHERE fk_facture_source = '.((int) $this->id);
+ $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element;
+ $sql .= " WHERE fk_facture_source = ".((int) $this->id);
$sql .= ' AND type < 2';
if ($option == 'validated') {
$sql .= ' AND fk_statut = 1';
@@ -306,8 +306,8 @@ abstract class CommonInvoice extends CommonObject
$sharedentity = 'facture_fourn';
}
- $sql = 'SELECT p.ref, pf.amount, pf.multicurrency_amount, p.fk_paiement, p.datep, p.num_paiement as num, t.code'.$field3;
- $sql .= ' FROM '.MAIN_DB_PREFIX.$table.' as pf, '.MAIN_DB_PREFIX.$table2.' as p, '.MAIN_DB_PREFIX.'c_paiement as t';
+ $sql = "SELECT p.ref, pf.amount, pf.multicurrency_amount, p.fk_paiement, p.datep, p.num_paiement as num, t.code".$field3;
+ $sql .= " FROM ".MAIN_DB_PREFIX.$table." as pf, ".MAIN_DB_PREFIX.$table2." as p, ".MAIN_DB_PREFIX."c_paiement as t";
$sql .= " WHERE pf.".$field." = ".((int) $this->id);
$sql .= " AND pf.".$field2." = p.rowid";
$sql .= ' AND p.fk_paiement = t.id';
@@ -335,12 +335,12 @@ abstract class CommonInvoice extends CommonObject
//look for credit notes and discounts and deposits
$sql = '';
if ($this->element == 'facture' || $this->element == 'invoice') {
- $sql = 'SELECT rc.amount_ttc as amount, rc.multicurrency_amount_ttc as multicurrency_amount, rc.datec as date, f.ref as ref, rc.description as type';
+ $sql = "SELECT rc.amount_ttc as amount, rc.multicurrency_amount_ttc as multicurrency_amount, rc.datec as date, f.ref as ref, rc.description as type";
$sql .= ' FROM '.MAIN_DB_PREFIX.'societe_remise_except as rc, '.MAIN_DB_PREFIX.'facture as f';
$sql .= ' WHERE rc.fk_facture_source=f.rowid AND rc.fk_facture = '.((int) $this->id);
$sql .= ' AND (f.type = 2 OR f.type = 0 OR f.type = 3)'; // Find discount coming from credit note or excess received or deposits (payments from deposits are always null except if FACTURE_DEPOSITS_ARE_JUST_PAYMENTS is set)
} elseif ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier') {
- $sql = 'SELECT rc.amount_ttc as amount, rc.multicurrency_amount_ttc as multicurrency_amount, rc.datec as date, f.ref as ref, rc.description as type';
+ $sql = "SELECT rc.amount_ttc as amount, rc.multicurrency_amount_ttc as multicurrency_amount, rc.datec as date, f.ref as ref, rc.description as type";
$sql .= ' FROM '.MAIN_DB_PREFIX.'societe_remise_except as rc, '.MAIN_DB_PREFIX.'facture_fourn as f';
$sql .= ' WHERE rc.fk_invoice_supplier_source=f.rowid AND rc.fk_invoice_supplier = '.((int) $this->id);
$sql .= ' AND (f.type = 2 OR f.type = 0 OR f.type = 3)'; // Find discount coming from credit note or excess received or deposits (payments from deposits are always null except if FACTURE_DEPOSITS_ARE_JUST_PAYMENTS is set)
@@ -734,7 +734,7 @@ abstract class CommonInvoice extends CommonObject
$sql .= 'fk_facture, ';
}
$sql .= ' amount, date_demande, fk_user_demande, code_banque, code_guichet, number, cle_rib, sourcetype, entity)';
- $sql .= ' VALUES ('.((int) $this->id);
+ $sql .= " VALUES (".((int) $this->id);
$sql .= ", ".((float) price2num($amount));
$sql .= ", '".$this->db->idate($now)."'";
$sql .= ", ".((int) $fuser->id);
diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php
index 2a7c0c87353..438e9f77389 100644
--- a/htdocs/core/class/commonobject.class.php
+++ b/htdocs/core/class/commonobject.class.php
@@ -1671,7 +1671,7 @@ abstract class CommonObject
return 0;
}
- $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element.' WHERE '.$this->table_ref_field.' LIKE "'.$this->db->escape($ref).'" LIMIT 1';
+ $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX.$this->table_element." WHERE ".$this->table_ref_field." LIKE '".$this->db->escape($ref)."' LIMIT 1";
$query = $this->db->query($sql);
@@ -2911,7 +2911,7 @@ abstract class CommonObject
// Count number of lines to reorder (according to choice $renum)
$nl = 0;
- $sql = 'SELECT count(rowid) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
+ $sql = "SELECT count(rowid) FROM ".MAIN_DB_PREFIX.$this->table_element_line;
$sql .= " WHERE ".$this->fk_element." = ".((int) $this->id);
if (!$renum) {
$sql .= ' AND rang = 0';
@@ -2933,7 +2933,7 @@ abstract class CommonObject
$rows = array();
// We first search all lines that are parent lines (for multilevel details lines)
- $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
+ $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX.$this->table_element_line;
$sql .= " WHERE ".$this->fk_element." = ".((int) $this->id);
if ($fk_parent_line) {
$sql .= ' AND fk_parent_line IS NULL';
@@ -2981,7 +2981,7 @@ abstract class CommonObject
{
$rows = array();
- $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
+ $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX.$this->table_element_line;
$sql .= " WHERE ".$this->fk_element." = ".((int) $this->id);
$sql .= ' AND fk_parent_line = '.((int) $id);
$sql .= ' ORDER BY rang ASC';
@@ -3049,7 +3049,7 @@ abstract class CommonObject
*
* @param int $rowid Id of line
* @param int $rang Position
- * @return void
+ * @return int <0 if KO, >0 if OK
*/
public function updateRangOfLine($rowid, $rang)
{
@@ -3065,10 +3065,13 @@ abstract class CommonObject
dol_syslog(get_class($this)."::updateRangOfLine", LOG_DEBUG);
if (!$this->db->query($sql)) {
dol_print_error($this->db);
+ return -1;
+ } else {
+ $parameters=array('rowid'=>$rowid, 'rang'=>$rang, 'fieldposition' => $fieldposition);
+ $action='';
+ $reshook = $hookmanager->executeHooks('afterRankOfLineUpdate', $parameters, $this, $action);
+ return 1;
}
- $parameters=array('rowid'=>$rowid, 'rang'=>$rang, 'fieldposition' => $fieldposition);
- $action='';
- $reshook = $hookmanager->executeHooks('afterRankOfLineUpdate', $parameters, $this, $action);
}
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
@@ -3156,8 +3159,8 @@ abstract class CommonObject
*/
public function getRangOfLine($rowid)
{
- $sql = 'SELECT rang FROM '.MAIN_DB_PREFIX.$this->table_element_line;
- $sql .= ' WHERE rowid ='.((int) $rowid);
+ $sql = "SELECT rang FROM ".MAIN_DB_PREFIX.$this->table_element_line;
+ $sql .= " WHERE rowid = ".((int) $rowid);
dol_syslog(get_class($this)."::getRangOfLine", LOG_DEBUG);
$resql = $this->db->query($sql);
@@ -3175,9 +3178,9 @@ abstract class CommonObject
*/
public function getIdOfLine($rang)
{
- $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
+ $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX.$this->table_element_line;
$sql .= " WHERE ".$this->fk_element." = ".((int) $this->id);
- $sql .= ' AND rang = '.((int) $rang);
+ $sql .= " AND rang = ".((int) $rang);
$resql = $this->db->query($sql);
if ($resql) {
$row = $this->db->fetch_row($resql);
@@ -3204,7 +3207,7 @@ abstract class CommonObject
if ($fk_parent_line) {
$sql = "SELECT max(".$positionfield.") FROM ".MAIN_DB_PREFIX.$this->table_element_line;
$sql .= " WHERE ".$this->fk_element." = ".((int) $this->id);
- $sql .= ' AND fk_parent_line = '.((int) $fk_parent_line);
+ $sql .= " AND fk_parent_line = ".((int) $fk_parent_line);
dol_syslog(get_class($this)."::line_max", LOG_DEBUG);
$resql = $this->db->query($sql);
@@ -3420,7 +3423,7 @@ abstract class CommonObject
$sql .= ', situation_percent';
}
$sql .= ', multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
- $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element_line;
+ $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element_line;
$sql .= " WHERE ".$this->fk_element." = ".((int) $this->id);
if ($exclspec) {
$product_field = 'product_type';
@@ -3580,7 +3583,7 @@ abstract class CommonObject
}
if (empty($nodatabaseupdate)) {
- $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element.' SET';
+ $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element.' SET';
$sql .= " ".$fieldht." = ".((float) price2num($this->total_ht)).",";
$sql .= " ".$fieldtva." = ".((float) price2num($this->total_tva)).",";
$sql .= " ".$fieldlocaltax1." = ".((float) price2num($this->total_localtax1)).",";
@@ -4275,8 +4278,8 @@ abstract class CommonObject
*/
public function getSpecialCode($lineid)
{
- $sql = 'SELECT special_code FROM '.MAIN_DB_PREFIX.$this->table_element_line;
- $sql .= ' WHERE rowid = '.((int) $lineid);
+ $sql = "SELECT special_code FROM ".MAIN_DB_PREFIX.$this->table_element_line;
+ $sql .= " WHERE rowid = ".((int) $lineid);
$resql = $this->db->query($sql);
if ($resql) {
$row = $this->db->fetch_row($resql);
@@ -5332,7 +5335,7 @@ abstract class CommonObject
$ecmfile->gen_or_uploaded = 'generated';
$ecmfile->description = ''; // indexed content
$ecmfile->keywords = ''; // keyword content
- $ecmfile->src_object_type = $this->table_element;
+ $ecmfile->src_object_type = $this->table_element.(empty($this->module) ? '' : '@'.$this->module);
$ecmfile->src_object_id = $this->id;
$result = $ecmfile->create($user);
@@ -6695,8 +6698,8 @@ abstract class CommonObject
}
$sqlwhere = '';
- $sql = 'SELECT '.$keyList;
- $sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
+ $sql = "SELECT ".$keyList;
+ $sql .= " FROM ".MAIN_DB_PREFIX.$InfoFieldList[0];
if (!empty($InfoFieldList[4])) {
// can use SELECT request
if (strpos($InfoFieldList[4], '$SEL$') !== false) {
@@ -6847,7 +6850,7 @@ abstract class CommonObject
}
$sqlwhere = '';
- $sql = 'SELECT '.$keyList;
+ $sql = "SELECT ".$keyList;
$sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
if (!empty($InfoFieldList[4])) {
// can use SELECT request
@@ -7208,7 +7211,7 @@ abstract class CommonObject
$keyList .= implode(', ', $fields_label);
}
- $sql = 'SELECT '.$keyList;
+ $sql = "SELECT ".$keyList;
$sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
if (strpos($InfoFieldList[4], 'extra') !== false) {
$sql .= ' as main';
@@ -7291,7 +7294,7 @@ abstract class CommonObject
$keyList .= implode(', ', $fields_label);
}
- $sql = 'SELECT '.$keyList;
+ $sql = "SELECT ".$keyList;
$sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
if (strpos($InfoFieldList[4], 'extra') !== false) {
$sql .= ' as main';
@@ -8228,7 +8231,7 @@ abstract class CommonObject
$return .= ' ';
// On propose la generation de la vignette si elle n'existe pas et si la taille est superieure aux limites
if ($photo_vignette && (image_format_supported($photo) > 0) && ($this->imgWidth > $maxWidth || $this->imgHeight > $maxHeight)) {
- $return .= 'id.'&action=addthumb&file='.urlencode($pdir.$viewfilename).'">'.img_picto($langs->trans('GenerateThumb'), 'refresh').' ';
+ $return .= 'id.'&action=addthumb&token='.newToken().'&file='.urlencode($pdir.$viewfilename).'">'.img_picto($langs->trans('GenerateThumb'), 'refresh').' ';
}
// Special cas for product
if ($modulepart == 'product' && ($user->rights->produit->creer || $user->rights->service->creer)) {
@@ -8690,7 +8693,7 @@ abstract class CommonObject
// If field is an implicit foreign key field
if (preg_match('/^integer:/i', $this->fields[$key]['type']) && empty($values[$key])) {
if (isset($this->fields[$key]['default'])) {
- $values[$key] = $this->fields[$key]['default'];
+ $values[$key] = ((int) $this->fields[$key]['default']);
} else {
$values[$key] = 'null';
}
@@ -8707,9 +8710,9 @@ abstract class CommonObject
$this->db->begin();
if (!$error) {
- $sql = 'INSERT INTO '.MAIN_DB_PREFIX.$this->table_element;
- $sql .= ' ('.implode(", ", $keys).')';
- $sql .= ' VALUES ('.implode(", ", $values).')';
+ $sql = "INSERT INTO ".MAIN_DB_PREFIX.$this->table_element;
+ $sql .= " (".implode(", ", $keys).')';
+ $sql .= " VALUES (".implode(", ", $values).")"; // $values can contains 'abc' or 123
$res = $this->db->query($sql);
if ($res === false) {
@@ -8725,7 +8728,7 @@ abstract class CommonObject
// If we have a field ref with a default value of (PROV)
if (!$error) {
if (key_exists('ref', $this->fields) && $this->fields['ref']['notnull'] > 0 && key_exists('default', $this->fields['ref']) && $this->fields['ref']['default'] == '(PROV)') {
- $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET ref = '(PROV".$this->id.")' WHERE (ref = '(PROV)' OR ref = '') AND rowid = ".((int) $this->id);
+ $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET ref = '(PROV".((int) $this->id).")' WHERE (ref = '(PROV)' OR ref = '') AND rowid = ".((int) $this->id);
$resqlupdate = $this->db->query($sql);
if ($resqlupdate === false) {
@@ -9413,6 +9416,11 @@ abstract class CommonObject
*/
public function setCategoriesCommon($categories, $type_categ = '', $remove_existing = true)
{
+ // Handle single category
+ if (!is_array($categories)) {
+ $categories = array($categories);
+ }
+
dol_syslog(get_class($this)."::setCategoriesCommon Oject Id:".$this->id.' type_categ:'.$type_categ.' nb tag add:'.count($categories), LOG_DEBUG);
require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
@@ -9422,11 +9430,6 @@ abstract class CommonObject
return -1;
}
- // Handle single category
- if (!is_array($categories)) {
- $categories = array($categories);
- }
-
// Get current categories
$c = new Categorie($this->db);
$existing = $c->containing($this->id, $type_categ, 'id');
diff --git a/htdocs/core/class/conf.class.php b/htdocs/core/class/conf.class.php
index ec145f89f43..5ec3a4cfbc0 100644
--- a/htdocs/core/class/conf.class.php
+++ b/htdocs/core/class/conf.class.php
@@ -826,9 +826,13 @@ class Conf
$this->global->MAIN_MODULE_DOLISTORE_API_KEY = 'dolistorecatalogpublickey1234567';
}
- // If we are in develop mode, we activate the option MAIN_SECURITY_CSRF_WITH_TOKEN to 1 if not already defined.
- if (!isset($this->global->MAIN_SECURITY_CSRF_WITH_TOKEN) && $this->global->MAIN_FEATURES_LEVEL >= 2) {
+ // Enable by default the CSRF protection by token.
+ if (!isset($this->global->MAIN_SECURITY_CSRF_WITH_TOKEN)) {
+ // Value 1 makes CSRF check for all POST parameters only
+ // Value 2 makes also CSRF check for GET requests with action = a sensitive requests like action=del, action=remove...
+ // Value 3 makes also CSRF check for all GET requests with a param action or massaction
$this->global->MAIN_SECURITY_CSRF_WITH_TOKEN = 1;
+ // Note: Set MAIN_SECURITY_CSRF_TOKEN_RENEWAL_ON_EACH_CALL=1 to have a renewal of token at each page call instead of each session (not recommended)
}
if (defined('MAIN_ANTIVIRUS_COMMAND')) {
diff --git a/htdocs/core/class/dolgraph.class.php b/htdocs/core/class/dolgraph.class.php
index a1725526898..e4a91d903df 100644
--- a/htdocs/core/class/dolgraph.class.php
+++ b/htdocs/core/class/dolgraph.class.php
@@ -741,7 +741,7 @@ class DolGraph
/**
* Build a graph using JFlot library. Input when calling this method should be:
* $this->data = array(array(0=>'labelxA',1=>yA), array('labelxB',yB));
- * $this->data = array(array(0=>'labelxA',1=>yA1,...,n=>yAn), array('labelxB',yB1,...yBn)); // or when there is n series to show for each x
+ * $this->data = array(array(0=>'labelxA',1=>yA1,...,n=>yAn), array('labelxB',yB1,...yBn)); // when there is n series to show for each x
* $this->data = array(array('label'=>'labelxA','data'=>yA), array('labelxB',yB)); // Syntax deprecated
* $this->legend= array("Val1",...,"Valn"); // list of n series name
* $this->type = array('bars',...'lines','linesnopoint'); or array('pie') or array('polar')
@@ -1028,7 +1028,7 @@ class DolGraph
/**
* Build a graph using Chart library. Input when calling this method should be:
* $this->data = array(array(0=>'labelxA',1=>yA), array('labelxB',yB));
- * $this->data = array(array(0=>'labelxA',1=>yA1,...,n=>yAn), array('labelxB',yB1,...yBn)); // or when there is n series to show for each x
+ * $this->data = array(array(0=>'labelxA',1=>yA1,...,n=>yAn), array('labelxB',yB1,...yBn)); // when there is n series to show for each x
* $this->data = array(array('label'=>'labelxA','data'=>yA), array('labelxB',yB)); // Syntax deprecated
* $this->legend= array("Val1",...,"Valn"); // list of n series name
* $this->type = array('bars',...'lines', 'linesnopoint'); or array('pie') or array('polar') or array('piesemicircle');
@@ -1303,6 +1303,8 @@ class DolGraph
$this->stringtoshow .= 'var options = { maintainAspectRatio: false, aspectRatio: 2.5, ';
if (empty($showlegend)) {
$this->stringtoshow .= 'legend: { display: false }, ';
+ } else {
+ $this->stringtoshow .= 'legend: { position: \'' . ($showlegend == 2 ? 'right' : 'top') . '\' },';
}
$this->stringtoshow .= 'scales: { xAxes: [{ ';
if ($this->hideXValues) {
diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php
index 5710d47644b..4ec87d75974 100644
--- a/htdocs/core/class/extrafields.class.php
+++ b/htdocs/core/class/extrafields.class.php
@@ -1252,7 +1252,7 @@ class ExtraFields
}
$sqlwhere = '';
- $sql = 'SELECT '.$keyList;
+ $sql = "SELECT ".$keyList;
$sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
if (!empty($InfoFieldList[4])) {
// can use curent entity filter
@@ -1420,7 +1420,7 @@ class ExtraFields
}
$sqlwhere = '';
- $sql = 'SELECT '.$keyList;
+ $sql = "SELECT ".$keyList;
$sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
if (!empty($InfoFieldList[4])) {
// can use SELECT request
@@ -1716,7 +1716,7 @@ class ExtraFields
}
}
- $sql = 'SELECT '.$keyList;
+ $sql = "SELECT ".$keyList;
$sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
if (!empty($InfoFieldList[4]) && strpos($InfoFieldList[4], 'extra') !== false) {
$sql .= ' as main';
@@ -1820,8 +1820,8 @@ class ExtraFields
}
}
- $sql = 'SELECT '.$keyList;
- $sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
+ $sql = "SELECT ".$keyList;
+ $sql .= " FROM ".MAIN_DB_PREFIX.$InfoFieldList[0];
if (strpos($InfoFieldList[4], 'extra') !== false) {
$sql .= ' as main';
}
diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php
index 98ea68e5542..f1d66377181 100644
--- a/htdocs/core/class/html.form.class.php
+++ b/htdocs/core/class/html.form.class.php
@@ -791,7 +791,7 @@ class Form
// Warning: if you set submit button to disabled, post using 'Enter' will no more work if there is no another input submit. So we add a hidden button
$ret .= ' '; // Hidden button BEFORE so it is the one used when we submit with ENTER.
- $ret .= ' use_javascript_ajax) ? '' : ' style="display: none"').' class="button'.(empty($conf->use_javascript_ajax) ? '' : ' hideobject').' '.$name.' '.$name.'confirmed" value="'.dol_escape_htmltag($langs->trans("Confirm")).'">';
+ $ret .= ' use_javascript_ajax) ? '' : ' style="display: none"').' class="button small'.(empty($conf->use_javascript_ajax) ? '' : ' hideobject').' '.$name.' '.$name.'confirmed" value="'.dol_escape_htmltag($langs->trans("Confirm")).'">';
$ret .= '';
if (!empty($conf->use_javascript_ajax)) {
@@ -1680,11 +1680,6 @@ class Form
if ($resql) {
$num = $this->db->num_rows($resql);
- if ($conf->use_javascript_ajax && !$forcecombo && !$options_only) {
- include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
- $out .= ajax_combobox($htmlid, $events, getDolGlobalString("CONTACT_USE_SEARCH_TO_SELECT"));
- }
-
if ($htmlname != 'none' && !$options_only) {
$out .= '';
}
@@ -1815,6 +1810,11 @@ class Form
$out .= ' ';
}
+ if ($conf->use_javascript_ajax && !$forcecombo && !$options_only) {
+ include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
+ $out .= ajax_combobox($htmlid, $events, getDolGlobalString("CONTACT_USE_SEARCH_TO_SELECT"));
+ }
+
$this->num = $num;
return $out;
} else {
@@ -8833,8 +8833,8 @@ class Form
public function showFilterButtons()
{
$out = '';
- $out .= ' ';
- $out .= ' ';
+ $out .= ' ';
+ $out .= ' ';
$out .= '
';
return $out;
diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php
index 975738b3809..d558571d5b8 100644
--- a/htdocs/core/class/html.formfile.class.php
+++ b/htdocs/core/class/html.formfile.class.php
@@ -136,6 +136,7 @@ class FormFile
$out .= ' '."\n";
$out .= ' '."\n";
$out .= ' '."\n";
+ $out .= ' '."\n";
}
$out .= '';
@@ -215,13 +216,13 @@ class FormFile
$langs->load('link');
$out .= ''.$langs->trans("OverwriteIfExists").' ';
}
- $out .= ' trans("Upload").'"';
$out .= (empty($conf->global->MAIN_UPLOAD_DOC) || empty($perm) ? ' disabled' : '');
$out .= '>';
if ($addcancel) {
$out .= ' ';
- $out .= ' ';
+ $out .= ' ';
}
if (!empty($conf->global->MAIN_UPLOAD_DOC)) {
@@ -275,6 +276,7 @@ class FormFile
$out .= ' '."\n";
$out .= ' '."\n";
$out .= ' '."\n";
+ $out .= ' '."\n";
}
$out .= '';
@@ -293,7 +295,7 @@ class FormFile
$out .= ' ';
$out .= '
';
$out .= '';
- $out .= ' trans("ToLink").'"';
$out .= (empty($conf->global->MAIN_UPLOAD_DOC) || empty($perm) ? ' disabled' : '');
$out .= '>';
$out .= '
';
@@ -1672,7 +1674,8 @@ class FormFile
dol_include_once($hookmanager->resArray['classpath']);
if (array_key_exists('classname', $hookmanager->resArray) && !empty($hookmanager->resArray['classname'])) {
if (class_exists($hookmanager->resArray['classname'])) {
- $object_instance = new ${$hookmanager->resArray['classname']}($this->db);
+ $tmpclassname = $hookmanager->resArray['classname'];
+ $object_instance = new $tmpclassname($this->db);
}
}
}
@@ -1811,9 +1814,11 @@ class FormFile
print '';
// File
+ // Check if document source has external module part, if it the case use it for module part on document.php
+ preg_match('/^[^@]*@([^@]*)$/', $modulepart.'@expertisemedical', $modulesuffix);
print '';
//print "XX".$file['name']; //$file['name'] must be utf8
- print 'getDocumentsLink($modulepart, $modulesubdir, $filedir, '^'.preg_quote($file['name'],'/').'$');
- print $this->showPreview($file, $modulepart, $file['relativename']);
+ print $this->showPreview($file, (empty($modulesuffix) ? $modulepart : $modulesuffix[1]), $file['relativename']);
print " \n";
diff --git a/htdocs/core/class/html.formother.class.php b/htdocs/core/class/html.formother.class.php
index 8c30d42075f..99ee1b6af9b 100644
--- a/htdocs/core/class/html.formother.class.php
+++ b/htdocs/core/class/html.formother.class.php
@@ -863,9 +863,9 @@ class FormOther
}
},
function(color, context) { console.log("close"); },
- function(color, context) { var hex = color.val(\'hex\'); console.log("new color selected in jpicker "+hex);';
+ function(color, context) { var hex = color.val(\'hex\'); console.log("new color selected in jpicker "+hex+" setpropertyonselect='.dol_escape_js($setpropertyonselect).'");';
if ($setpropertyonselect) {
- $out .= ' if (hex != null) document.documentElement.style.setProperty(\'--'.$setpropertyonselect.'\', \'#\'+hex);';
+ $out .= ' if (hex != null) document.documentElement.style.setProperty(\'--'.dol_escape_js($setpropertyonselect).'\', \'#\'+hex);';
}
$out .= '},
function(color, context) { console.log("cancel"); }
diff --git a/htdocs/core/class/html.formticket.class.php b/htdocs/core/class/html.formticket.class.php
index c37766b24df..a4b18470be4 100644
--- a/htdocs/core/class/html.formticket.class.php
+++ b/htdocs/core/class/html.formticket.class.php
@@ -762,7 +762,7 @@ class FormTicket
$arraycodenotparent[] = "";
$stringtoprint = ''.$langs->trans("GroupOfTicket").' ';
- $stringtoprint .= '';
+ $stringtoprint .= '';
$stringtoprint .= ' ';
$sql = "SELECT ctc.rowid, ctc.code, ctc.label, ctc.fk_parent, ctc.public, ";
diff --git a/htdocs/core/class/rssparser.class.php b/htdocs/core/class/rssparser.class.php
index 6a8a91dbb05..c3c434d1aed 100644
--- a/htdocs/core/class/rssparser.class.php
+++ b/htdocs/core/class/rssparser.class.php
@@ -240,7 +240,7 @@ class RssParser
if (!empty($conf->global->EXTERNALRSS_USE_SIMPLEXML)) {
//print 'xx'.LIBXML_NOCDATA;
libxml_use_internal_errors(false);
- $rss = simplexml_load_string($str, "SimpleXMLElement", LIBXML_NOCDATA);
+ $rss = simplexml_load_string($str, "SimpleXMLElement", LIBXML_NOCDATA|LIBXML_NOCDATA);
} else {
if (!function_exists('xml_parser_create')) {
$this->error = 'Function xml_parser_create are not supported by your PHP';
diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php
index 0adcb967991..efea4c54b09 100644
--- a/htdocs/core/lib/company.lib.php
+++ b/htdocs/core/lib/company.lib.php
@@ -724,7 +724,7 @@ function getFormeJuridiqueLabel($code)
function getCountriesInEEC()
{
// List of all country codes that are in europe for european vat rules
- // List found on http://ec.europa.eu/taxation_customs/common/faq/faq_1179_en.htm#9
+ // List found on https://ec.europa.eu/taxation_customs/territorial-status-eu-countries-and-certain-territories_en
global $conf, $db;
$country_code_in_EEC = array();
diff --git a/htdocs/core/lib/eventorganization.lib.php b/htdocs/core/lib/eventorganization.lib.php
index 2f8ea573c1f..51ff1f2a90f 100644
--- a/htdocs/core/lib/eventorganization.lib.php
+++ b/htdocs/core/lib/eventorganization.lib.php
@@ -16,7 +16,7 @@
*/
/**
- * \file eventorganization/lib/eventorganization.lib.php
+ * \file htdocs/core/lib/eventorganization.lib.php
* \ingroup eventorganization
* \brief Library files with common functions for EventOrganization
*/
diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php
index 2d3a69fb1ea..cffd1f752f6 100644
--- a/htdocs/core/lib/functions.lib.php
+++ b/htdocs/core/lib/functions.lib.php
@@ -3732,7 +3732,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $
'action'=>'infobox-action', 'account'=>'infobox-bank_account', 'accountline'=>'infobox-bank_account', 'accountancy'=>'infobox-bank_account', 'asset'=>'infobox-bank_account',
'bank_account'=>'bg-infobox-bank_account',
'bill'=>'infobox-commande', 'billa'=>'infobox-commande', 'billr'=>'infobox-commande', 'billd'=>'infobox-commande',
- 'conferenceorbooth'=>'infobox-project',
+ 'margin'=>'infobox-bank_account', 'conferenceorbooth'=>'infobox-project',
'cash-register'=>'infobox-bank_account', 'contract'=>'infobox-contrat', 'check'=>'font-status4', 'collab'=>'infobox-action', 'conversation'=>'infobox-contrat',
'donation'=>'infobox-commande', 'dolly'=>'infobox-commande', 'dollyrevert'=>'flip infobox-order_supplier',
'ecm'=>'infobox-action', 'eventorganization'=>'infobox-project',
@@ -4386,7 +4386,7 @@ function img_mime($file, $titlealt = '', $morecss = '')
}
//return img_picto_common($titlealt, 'mime/'.$mimeimg, 'class="'.$morecss.'"');
- return ' ';
+ return ' ';
}
diff --git a/htdocs/core/lib/invoice.lib.php b/htdocs/core/lib/invoice.lib.php
index 28b56efb20d..164840eceb7 100644
--- a/htdocs/core/lib/invoice.lib.php
+++ b/htdocs/core/lib/invoice.lib.php
@@ -480,7 +480,8 @@ function getNumberInvoicesPieChart($mode)
date_add($datenowadd30, $interval30days);
date_add($datenowadd15, $interval15days);
- $sql = "SELECT sum(".$db->ifsql("f.date_lim_reglement < '".date_format($datenowsub30, 'Y-m-d')."'", 1, 0).") as nblate30";
+ $sql = "SELECT";
+ $sql .= " sum(".$db->ifsql("f.date_lim_reglement < '".date_format($datenowsub30, 'Y-m-d')."'", 1, 0).") as nblate30";
$sql .= ", sum(".$db->ifsql("f.date_lim_reglement < '".date_format($datenowsub15, 'Y-m-d')."'", 1, 0).") as nblate15";
$sql .= ", sum(".$db->ifsql("f.date_lim_reglement < '".date_format($now, 'Y-m-d')."'", 1, 0).") as nblatenow";
$sql .= ", sum(".$db->ifsql("f.date_lim_reglement >= '".date_format($now, 'Y-m-d')."'", 1, 0).") as nbnotlatenow";
@@ -508,24 +509,26 @@ function getNumberInvoicesPieChart($mode)
while ($i < $num) {
$obj = $db->fetch_object($resql);
- $dataseries = array(array($langs->trans('InvoiceLate30Days'), $obj->nblate30)
+ /*$dataseries = array(array($langs->trans('InvoiceLate30Days'), $obj->nblate30)
,array($langs->trans('InvoiceLate15Days'), $obj->nblate15 - $obj->nblate30)
,array($langs->trans('InvoiceLateMinus15Days'), $obj->nblatenow - $obj->nblate15)
,array($langs->trans('InvoiceNotLate'), $obj->nbnotlatenow - $obj->nbnotlate15)
,array($langs->trans('InvoiceNotLate15Days'), $obj->nbnotlate15 - $obj->nbnotlate30)
- ,array($langs->trans('InvoiceNotLate30Days'), $obj->nbnotlate30));
+ ,array($langs->trans('InvoiceNotLate30Days'), $obj->nbnotlate30));*/
+ $dataseries[0]=array($langs->trans('NbOfOpenInvoices'), $obj->nblate30, $obj->nblate15 - $obj->nblate30, $obj->nblatenow - $obj->nblate15, $obj->nbnotlatenow - $obj->nbnotlate15, $obj->nbnotlate15 - $obj->nbnotlate30, $obj->nbnotlate30);
$i++;
}
foreach ($dataseries as $key=>$value) {
$total += $value[1];
}
+ $legend = array($langs->trans('InvoiceLate30Days'), $langs->trans('InvoiceLate15Days'), $langs->trans('InvoiceLateMinus15Days'), $langs->trans('InvoiceNotLate'), $langs->trans('InvoiceNotLate15Days'), $langs->trans('InvoiceNotLate30Days'));
$colorseries = array($badgeStatus8, $badgeStatus1, $badgeStatus3, $badgeStatus4, $badgeStatus11, '-'.$badgeStatus11);
$result = '';
$result .= '
';
$result .= '';
- $result .= ''.$langs->trans("Statistics").' - ';
+ $result .= ' '.$langs->trans("NbOfOpenInvoices").' - ';
if ($mode == 'customers') {
$result .= $langs->trans("CustomerInvoice");
} elseif ($mode == 'fourn' || $mode == 'suppliers') {
@@ -537,14 +540,19 @@ function getNumberInvoicesPieChart($mode)
$result .= ' ';
if ($conf->use_javascript_ajax) {
+ //var_dump($dataseries);
$dolgraph = new DolGraph();
$dolgraph->SetData($dataseries);
+
+ $dolgraph->setLegend($legend);
+
$dolgraph->SetDataColor(array_values($colorseries));
$dolgraph->setShowLegend(2);
$dolgraph->setShowPercent(1);
- $dolgraph->SetType(['pie']);
- $dolgraph->setHeight('150');
- $dolgraph->setWidth('300');
+ $dolgraph->SetType(array('bars', 'bars', 'bars', 'bars', 'bars', 'bars'));
+ $dolgraph->setHeight('160');
+ $dolgraph->setWidth('400');
+ $dolgraph->setHideXValues(true);
if ($mode == 'customers') {
$dolgraph->draw('idgraphcustomerinvoices');
} elseif ($mode == 'fourn' || $mode == 'suppliers') {
diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php
index 7a9bb12172b..84b0ada3487 100644
--- a/htdocs/core/lib/usergroups.lib.php
+++ b/htdocs/core/lib/usergroups.lib.php
@@ -339,7 +339,7 @@ function showSkins($fuser, $edit = 0, $foruserprofile = false)
$thumbsbyrow = 6;
print '';
- print '
';
+ print '';
// Title
if ($foruserprofile) {
@@ -400,7 +400,7 @@ function showSkins($fuser, $edit = 0, $foruserprofile = false)
if (!file_exists($file)) {
$url = DOL_URL_ROOT.'/public/theme/common/nophoto.png';
}
- print 'id : '').'" style="font-weight: normal;" alt="'.$langs->trans("Preview").'">';
+ print ' id : '').'" style="font-weight: normal;" alt="'.$langs->trans("Preview").'">';
if ($subdir == $conf->global->MAIN_THEME) {
$title = $langs->trans("ThemeCurrentlyActive");
} else {
diff --git a/htdocs/core/modules/product_batch/mod_lot_free.php b/htdocs/core/modules/product_batch/mod_lot_free.php
index 0f069143ab1..def14bd37b3 100644
--- a/htdocs/core/modules/product_batch/mod_lot_free.php
+++ b/htdocs/core/modules/product_batch/mod_lot_free.php
@@ -18,7 +18,7 @@
*/
/**
- * \file htdocs/core/modules/product/mod_lot_free.php
+ * \file htdocs/core/modules/product_batch/mod_lot_free.php
* \ingroup productbatch
* \brief File containing class for numbering model of Lot free
*/
diff --git a/htdocs/core/modules/product_batch/mod_sn_advanced.php b/htdocs/core/modules/product_batch/mod_sn_advanced.php
index 5e8fde199c1..abe094220d2 100644
--- a/htdocs/core/modules/product_batch/mod_sn_advanced.php
+++ b/htdocs/core/modules/product_batch/mod_sn_advanced.php
@@ -22,7 +22,7 @@
*/
/**
- * \file htdocs/core/modules/product_batch/mod_batch_advanced.php
+ * \file htdocs/core/modules/product_batch/mod_sn_advanced.php
* \ingroup productbatch
* \brief File containing class for numbering model of SN advanced
*/
diff --git a/htdocs/core/modules/product_batch/mod_sn_free.php b/htdocs/core/modules/product_batch/mod_sn_free.php
index 95e1bd20359..67d39ec085a 100644
--- a/htdocs/core/modules/product_batch/mod_sn_free.php
+++ b/htdocs/core/modules/product_batch/mod_sn_free.php
@@ -18,7 +18,7 @@
*/
/**
- * \file htdocs/core/modules/product/mod_sn_free.php
+ * \file htdocs/core/modules/product_batch/mod_sn_free.php
* \ingroup productbatch
* \brief File containing class for numbering model of SN free
*/
diff --git a/htdocs/core/tpl/admin_extrafields_view.tpl.php b/htdocs/core/tpl/admin_extrafields_view.tpl.php
index 2f1c113fcf5..6750cc0b1a5 100644
--- a/htdocs/core/tpl/admin_extrafields_view.tpl.php
+++ b/htdocs/core/tpl/admin_extrafields_view.tpl.php
@@ -141,9 +141,9 @@ if (isset($extrafields->attributes[$elementtype]['type']) && is_array($extrafiel
}
print '';
- print '';
+ print ' ';
print $langs->trans("None");
- print ' ';
+ print '';
print ' ';
}
diff --git a/htdocs/core/tpl/ajaxrow.tpl.php b/htdocs/core/tpl/ajaxrow.tpl.php
index acc5fad8125..61428170f50 100644
--- a/htdocs/core/tpl/ajaxrow.tpl.php
+++ b/htdocs/core/tpl/ajaxrow.tpl.php
@@ -61,6 +61,7 @@ $(document).ready(function(){
console.log("tableDND onDrop");
console.log(decodeURI($("#").tableDnDSerialize()));
$('# tr[data-element=extrafield]').attr('id', ''); // Set extrafields id to empty value in order to ignore them in tableDnDSerialize function
+ $('# tr[data-ignoreidfordnd=1]').attr('id', ''); // Set id to empty value in order to ignore them in tableDnDSerialize function
var roworder = cleanSerialize(decodeURI($("#").tableDnDSerialize()));
var table_element_line = "";
var fk_element = "";
diff --git a/htdocs/core/tpl/contacts.tpl.php b/htdocs/core/tpl/contacts.tpl.php
index 078b68d864e..3def83f4e0d 100644
--- a/htdocs/core/tpl/contacts.tpl.php
+++ b/htdocs/core/tpl/contacts.tpl.php
@@ -135,19 +135,19 @@ if ($permission) {
+
';
} ?>
-
+
socid) ? 0 : $object->socid);
$selectedCompany = $formcompany->selectCompaniesForNewContact($object, 'id', $selectedCompany, 'newcompany', '', 0, '', 'minwidth300imp'); ?>
-
-
+
selectcontacts(($selectedCompany > 0 ? $selectedCompany : -1), '', 'contactid', 3, '', '', 1, 'minwidth100imp');
+ print img_object('', 'contact', 'class="pictofixedwidth"').$form->selectcontacts(($selectedCompany > 0 ? $selectedCompany : -1), '', 'contactid', 3, '', '', 1, 'minwidth100imp widthcentpercentminusxx maxwidth400');
$nbofcontacts = $form->num;
$newcardbutton = '';
@@ -157,7 +157,7 @@ if ($permission) {
print $newcardbutton;
?>
-
+
element == 'shipping' || $object->element == 'reception') && is_object($objectsrc)) {
diff --git a/htdocs/core/tpl/login.tpl.php b/htdocs/core/tpl/login.tpl.php
index 7b20e7209f7..7f460587248 100644
--- a/htdocs/core/tpl/login.tpl.php
+++ b/htdocs/core/tpl/login.tpl.php
@@ -346,7 +346,7 @@ if (!empty($conf->global->MAIN_EASTER_EGG_COMMITSTRIP)) {
$resgetcommitstrip = getURLContent("https://www.commitstrip.com/en/feed/");
}
if ($resgetcommitstrip && $resgetcommitstrip['http_code'] == '200') {
- $xml = simplexml_load_string($resgetcommitstrip['content']);
+ $xml = simplexml_load_string($resgetcommitstrip['content'], 'SimpleXMLElement', LIBXML_NOCDATA|LIBXML_NONET);
$little = $xml->channel->item[0]->children('content', true);
print preg_replace('/width="650" height="658"/', '', $little->encoded);
}
diff --git a/htdocs/core/triggers/interface_90_modSociete_ContactRoles.class.php b/htdocs/core/triggers/interface_90_modSociete_ContactRoles.class.php
index c8e27f66189..b1eb321f7f5 100644
--- a/htdocs/core/triggers/interface_90_modSociete_ContactRoles.class.php
+++ b/htdocs/core/triggers/interface_90_modSociete_ContactRoles.class.php
@@ -78,7 +78,11 @@ class InterfaceContactRoles extends DolibarrTriggers
require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
$contactdefault = new Contact($this->db);
$contactdefault->socid = $socid;
- $TContact = $contactdefault->getContactRoles($object->element);
+
+ $TContact = array();
+ if (method_exists($contactdefault, 'getContactRoles')) { // For backward compatibility
+ $TContact = $contactdefault->getContactRoles($object->element);
+ }
if (is_array($TContact) && !empty($TContact)) {
$TContactAlreadyLinked = array();
diff --git a/htdocs/don/class/don.class.php b/htdocs/don/class/don.class.php
index 792edbcc928..7ca70a31aa2 100644
--- a/htdocs/don/class/don.class.php
+++ b/htdocs/don/class/don.class.php
@@ -1116,7 +1116,7 @@ class Don extends CommonObject
return -1;
}
- $sql = 'SELECT SUM(amount) as sum_amount FROM '.MAIN_DB_PREFIX.'payment_donation WHERE fk_donation = '.((int) $this->id);
+ $sql = "SELECT SUM(amount) as sum_amount FROM ".MAIN_DB_PREFIX."payment_donation WHERE fk_donation = ".((int) $this->id);
$resql = $this->db->query($sql);
if (!$resql) {
dol_print_error($this->db);
diff --git a/htdocs/ecm/index.php b/htdocs/ecm/index.php
index 20d948b4b3b..813ee69b6fb 100644
--- a/htdocs/ecm/index.php
+++ b/htdocs/ecm/index.php
@@ -42,6 +42,7 @@ if (!$section) {
$section = 0;
}
$section_dir = GETPOST('section_dir', 'alpha');
+$overwritefile = GETPOST('overwritefile', 'int');
$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
$sortfield = GETPOST("sortfield", 'alpha');
@@ -120,7 +121,6 @@ if (GETPOST("sendit", 'alphanohtml') && !empty($conf->global->MAIN_UPLOAD_DOC))
if (!$error) {
$generatethumbs = 0;
- $overwritefile = GETPOST('overwritefile', 'int')?GETPOST('overwritefile', 'int'):0;
$res = dol_add_file_process($upload_dir, $overwritefile, 1, 'userfile', '', null, '', $generatethumbs);
if ($res > 0) {
$result = $ecmdir->changeNbOfFiles('+');
diff --git a/htdocs/eventorganization/conferenceorbooth_list.php b/htdocs/eventorganization/conferenceorbooth_list.php
index 780b3bebc55..9b997c8b0e9 100644
--- a/htdocs/eventorganization/conferenceorbooth_list.php
+++ b/htdocs/eventorganization/conferenceorbooth_list.php
@@ -643,6 +643,7 @@ print '
';
print '
';
print '
';
print '
';
+print '
';
$title = $langs->trans("ListOfConferencesOrBooths");
diff --git a/htdocs/eventorganization/conferenceorboothattendee_list.php b/htdocs/eventorganization/conferenceorboothattendee_list.php
index 19d35a4be0e..709d3255e13 100644
--- a/htdocs/eventorganization/conferenceorboothattendee_list.php
+++ b/htdocs/eventorganization/conferenceorboothattendee_list.php
@@ -697,6 +697,7 @@ print '
';
print '
';
print '
';
print '
';
+print '
';
$newcardbutton = dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/eventorganization/conferenceorboothattendee_card.php?action=create'.(!empty($confOrBooth->id)?'&conforboothid='.$confOrBooth->id:'').(!empty($projectstatic->id)?'&fk_project='.$projectstatic->id:'').$withProjectUrl.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?projectid='.$projectstatic->id.(empty($confOrBooth->id) ? '' : '&conforboothid='.$confOrBooth->id).$withProjectUrl), '', $permissiontoadd);
diff --git a/htdocs/eventorganization/core/actions_massactions_mail.inc.php b/htdocs/eventorganization/core/actions_massactions_mail.inc.php
index 483a1e5bc84..2f8e2959f2b 100644
--- a/htdocs/eventorganization/core/actions_massactions_mail.inc.php
+++ b/htdocs/eventorganization/core/actions_massactions_mail.inc.php
@@ -173,7 +173,7 @@ if (!$error && $massaction == 'confirm_presend_attendees') {
$tmp = explode(',', $conf->global->MAIN_INFO_SOCIETE_MAIL_ALIASES);
$from = trim($tmp[($reg[1] - 1)]);
} elseif (preg_match('/senderprofile_(\d+)_(\d+)/', $fromtype, $reg)) {
- $sql = 'SELECT rowid, label, email FROM ' . MAIN_DB_PREFIX . 'c_email_senderprofile WHERE rowid = ' . (int) $reg[1];
+ $sql = "SELECT rowid, label, email FROM " . MAIN_DB_PREFIX . "c_email_senderprofile WHERE rowid = " . (int) $reg[1];
$resql = $db->query($sql);
$obj = $db->fetch_object($resql);
if ($obj) {
diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php
index f982b046793..d5610c9153a 100644
--- a/htdocs/expensereport/card.php
+++ b/htdocs/expensereport/card.php
@@ -68,6 +68,17 @@ $socid = GETPOST('socid', 'int') ?GETPOST('socid', 'int') : GETPOST('socid_id',
$childids = $user->getAllChildIds(1);
+if (! empty($conf->global->EXPENSEREPORT_PREFILL_DATES_WITH_CURRENT_MONTH)) {
+ if (empty($date_start)) {
+ $date_start = dol_mktime(0, 0, 0, (int) dol_print_date(dol_now(), '%m'), 1, (int) dol_print_date(dol_now(), '%Y'));
+ }
+
+ if (empty($date_end)) {
+ // date('t') => number of days in the month, so last day of the month too
+ $date_end = dol_mktime(0, 0, 0, (int) dol_print_date(dol_now(), '%m'), (int) date('t'), (int) dol_print_date(dol_now(), '%Y'));
+ }
+}
+
// Hack to use expensereport dir
$rootfordata = DOL_DATA_ROOT;
$rootforuser = DOL_DATA_ROOT;
@@ -266,10 +277,14 @@ if (empty($reshook)) {
}
}
- if (!$error && empty($conf->global->EXPENSEREPORT_ALLOW_OVERLAPPING_PERIODS) && $object->periode_existe($fuser, $object->date_debut, $object->date_fin)) {
- $error++;
- setEventMessages($langs->trans("ErrorDoubleDeclaration"), null, 'errors');
- $action = 'create';
+ if (!$error && empty($conf->global->EXPENSEREPORT_ALLOW_OVERLAPPING_PERIODS)) {
+ $overlappingExpenseReportID = $object->periode_existe($fuser, $object->date_debut, $object->date_fin, true);
+
+ if ($overlappingExpenseReportID > 0) {
+ $error++;
+ setEventMessages($langs->trans("ErrorDoubleDeclaration").'
'. $langs->trans('ShowTrip').' ', null, 'errors');
+ $action = 'create';
+ }
}
if (!$error) {
@@ -1565,6 +1580,8 @@ if ($action == 'create') {
print '';
} else {
+ $taxlessUnitPriceDisabled = ! empty($conf->global->EXPENSEREPORT_FORCE_LINE_AMOUNTS_INCLUDING_TAXES_ONLY) ? ' disabled' : '';
+
print dol_get_fiche_head($head, 'card', $langs->trans("ExpenseReport"), -1, 'trip');
// Clone confirmation
@@ -2281,7 +2298,7 @@ if ($action == 'create') {
// Unit price
print '
';
- print ' ';
+ print ' ';
print ' ';
// Unit price with tax
@@ -2460,7 +2477,7 @@ if ($action == 'create') {
// Unit price net
print '
';
- print ' ';
+ print ' ';
print ' ';
// Unit price with tax
diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php
index 63303554c51..64034c10a3f 100644
--- a/htdocs/expensereport/class/expensereport.class.php
+++ b/htdocs/expensereport/class/expensereport.class.php
@@ -2213,8 +2213,6 @@ class ExpenseReport extends CommonObject
$date_d_form = $date_debut;
$date_f_form = $date_fin;
- $existe = false;
-
while ($i < $num_rows) {
$objp = $this->db->fetch_object($result);
@@ -2222,17 +2220,13 @@ class ExpenseReport extends CommonObject
$date_f_req = $this->db->jdate($objp->date_fin); // 4
if (!($date_f_form < $date_d_req || $date_d_form > $date_f_req)) {
- $existe = true;
+ return $objp->rowid;
}
$i++;
}
- if ($existe) {
- return 1;
- } else {
- return 0;
- }
+ return 0;
} else {
return 0;
}
diff --git a/htdocs/fourn/class/fournisseur.product.class.php b/htdocs/fourn/class/fournisseur.product.class.php
index b08d9237c63..5b523d8d7e8 100644
--- a/htdocs/fourn/class/fournisseur.product.class.php
+++ b/htdocs/fourn/class/fournisseur.product.class.php
@@ -846,7 +846,7 @@ class ProductFournisseur extends Product
$this->fourn_qty = $record["quantity"];
$this->fourn_remise_percent = $record["remise_percent"];
$this->fourn_remise = $record["remise"];
- $this->fourn_unitprice = $record["unitprice"];
+ $this->fourn_unitprice = $fourn_unitprice;
$this->fourn_charges = $record["charges"]; // deprecated
$this->fourn_tva_tx = $record["tva_tx"];
$this->fourn_id = $record["fourn_id"];
@@ -1183,7 +1183,7 @@ class ProductFournisseur extends Product
$label .= $this->displayPriceProductFournisseurLog($logPrices);
}
- $url = dol_buildpath('/product/fournisseurs.php', 1).'?id='.$this->id.'&action=add_price&socid='.$this->fourn_id.'&rowid='.$this->product_fourn_price_id;
+ $url = dol_buildpath('/product/fournisseurs.php', 1).'?id='.$this->id.'&action=add_price&token='.newToken().'&socid='.$this->fourn_id.'&rowid='.$this->product_fourn_price_id;
if ($option != 'nolink') {
// Add param to save lastsearch_values or not
diff --git a/htdocs/holiday/define_holiday.php b/htdocs/holiday/define_holiday.php
index fdcdb5f88e6..621443fb408 100644
--- a/htdocs/holiday/define_holiday.php
+++ b/htdocs/holiday/define_holiday.php
@@ -358,7 +358,7 @@ if (count($typeleaves) == 0) {
//var_dump($users['rowid'].' - '.$val['rowid']);
print '
';
if ($canedit) {
- print ' ';
+ print ' ';
} else {
print $nbtoshow;
}
diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php
index 5139e12ab7a..2ab7e3976aa 100644
--- a/htdocs/imports/import.php
+++ b/htdocs/imports/import.php
@@ -1205,7 +1205,7 @@ if ($step == 4 && $datatoimport) {
// async: false
// });'."\n";
// Now reload page
- print 'var newlocation= \''.$_SERVER["PHP_SELF"].'?step=4'.$param.'&action=saveorder&boxorder=\' + boxorder;'."\n";
+ print 'var newlocation= \''.$_SERVER["PHP_SELF"].'?step=4'.$param.'&action=saveorder&token='.newToken().'&boxorder=\' + boxorder;'."\n";
//print 'alert(newlocation);';
print 'window.location.href=newlocation;'."\n";
print '}'."\n";
diff --git a/htdocs/index.php b/htdocs/index.php
index 880b5577bbb..8c1433c79cb 100644
--- a/htdocs/index.php
+++ b/htdocs/index.php
@@ -337,6 +337,7 @@ if (empty($conf->global->MAIN_DISABLE_GLOBAL_WORKBOARD)) {
),
'supplier_proposal' =>
array(
+ 'lang' => 'supplier_proposal',
'groupName' => 'SupplierProposals',
'globalStatsKey' => 'askprice',
'stats' =>
@@ -486,6 +487,9 @@ if (empty($conf->global->MAIN_DISABLE_GLOBAL_WORKBOARD)) {
}
if (!empty($boards)) {
+ if (!empty($groupElement['lang'])) {
+ $langs->load($groupElement['lang']);
+ }
$groupName = $langs->trans($groupElement['groupName']);
$groupKeyLowerCase = strtolower($groupKey);
$nbTotalForGroup = 0;
diff --git a/htdocs/install/lib/repair.lib.php b/htdocs/install/lib/repair.lib.php
index aa0866fac69..aea82107d29 100644
--- a/htdocs/install/lib/repair.lib.php
+++ b/htdocs/install/lib/repair.lib.php
@@ -32,8 +32,8 @@ function checkElementExist($id, $table)
{
global $db;
- $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$table;
- $sql .= ' WHERE rowid = '.((int) $id);
+ $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX.$table;
+ $sql .= " WHERE rowid = ".((int) $id);
$resql = $db->query($sql);
if ($resql) {
$num = $db->num_rows($resql);
@@ -87,8 +87,8 @@ function checkLinkedElements($sourcetype, $targettype)
$out = $langs->trans('SourceType').': '.$sourcetype.' => '.$langs->trans('TargetType').': '.$targettype.' ';
- $sql = 'SELECT rowid, fk_source, fk_target FROM '.MAIN_DB_PREFIX.'element_element';
- $sql .= " WHERE sourcetype='".$db->escape($sourcetype)."' AND targettype='".$db->escape($targettype)."'";
+ $sql = "SELECT rowid, fk_source, fk_target FROM ".MAIN_DB_PREFIX."element_element";
+ $sql .= " WHERE sourcetype = '".$db->escape($sourcetype)."' AND targettype = '".$db->escape($targettype)."'";
$resql = $db->query($sql);
if ($resql) {
$num = $db->num_rows($resql);
@@ -106,7 +106,7 @@ function checkLinkedElements($sourcetype, $targettype)
foreach ($elements as $key => $element) {
if (!checkElementExist($element[$sourcetype], $sourcetable) || !checkElementExist($element[$targettype], $targettable)) {
$sql = 'DELETE FROM '.MAIN_DB_PREFIX.'element_element';
- $sql .= ' WHERE rowid = '.((int) $key);
+ $sql .= " WHERE rowid = ".((int) $key);
$resql = $db->query($sql);
$deleted++;
}
diff --git a/htdocs/install/mysql/data/llx_00_c_country.sql b/htdocs/install/mysql/data/llx_00_c_country.sql
index 4465756f00a..7217fda7d09 100644
--- a/htdocs/install/mysql/data/llx_00_c_country.sql
+++ b/htdocs/install/mysql/data/llx_00_c_country.sql
@@ -279,5 +279,5 @@ INSERT INTO llx_c_country (rowid,code,code_iso,label,active,favorite) VALUES (24
-- Set field eec
-UPDATE llx_c_country SET eec = 1 WHERE code IN ('AT','BE','BG','CY','CZ','DE','DK','EE','ES','FI','FR','GR','HR','NL','HU','IE','IM','IT','LT','LU','LV','MC','MT','PL','PT','RO','SE','SK','SI');
+UPDATE llx_c_country SET eec = 1 WHERE code IN ('AT','BE','BG','CY','CZ','DE','DK','EE','ES','FI','FR','GR','HR','NL','HU','IE','IT','LT','LU','LV','MC','MT','PL','PT','RO','SE','SK','SI');
diff --git a/htdocs/install/mysql/data/llx_c_tva.sql b/htdocs/install/mysql/data/llx_c_tva.sql
index cae269783e4..12b0b92a13e 100644
--- a/htdocs/install/mysql/data/llx_c_tva.sql
+++ b/htdocs/install/mysql/data/llx_c_tva.sql
@@ -330,7 +330,7 @@ insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values (10
insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values (105,10, '15','0','VAT 12% Majoré à 25% (15%)',1);
insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values (106,10, '22.5','0','VAT 18% Majoré à 25% (22.5%)',1);
insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values (107,10, '6','0','VAT 6%', 1);
-insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active,localtax1,localtax1_type,localtax2,localtax2_type) values (107,10,'18.18','0','VAT 18%+FODEC', 1, 1, '4', 0, 0);
+insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active,localtax1,localtax1_type,localtax2,localtax2_type) values (108,10,'18.18','0','VAT 18%+FODEC', 1, 1, '4', 0, 0);
-- UKRAINE (id country=226)
INSERT INTO llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values (2261,226, '0','0','VAT rate 0',1);
@@ -379,10 +379,6 @@ INSERT INTO llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) VALUES ( 4
INSERT INTO llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) VALUES ( 462, 46, '15','0','VAT 15%',1);
INSERT INTO llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) VALUES ( 463, 46, '7.5','0','VAT 7.5%',1);
--- SOUTH AFRICA (id country=205)
-INSERT INTO llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) VALUES (2051,205, '0','0','No VAT',1);
-INSERT INTO llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) VALUES (2052,205, '14','0','VAT 14%',1);
-
-- VENEZUELA (id country=232)
insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values (2321,232, '0','0','No VAT',1);
insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values (2322,232, '12','0','VAT 12%',1);
diff --git a/htdocs/install/mysql/migration/14.0.0-15.0.0.sql b/htdocs/install/mysql/migration/14.0.0-15.0.0.sql
index 3e5d86b5dd6..3f8047f4dc4 100644
--- a/htdocs/install/mysql/migration/14.0.0-15.0.0.sql
+++ b/htdocs/install/mysql/migration/14.0.0-15.0.0.sql
@@ -103,6 +103,7 @@ ALTER TABLE llx_categorie_ticket ADD CONSTRAINT fk_categorie_ticket_categorie_ro
ALTER TABLE llx_categorie_ticket ADD CONSTRAINT fk_categorie_ticket_ticket_rowid FOREIGN KEY (fk_ticket) REFERENCES llx_ticket (rowid);
ALTER TABLE llx_product_fournisseur_price MODIFY COLUMN ref_fourn varchar(128);
ALTER TABLE llx_product_customer_price MODIFY COLUMN ref_customer varchar(128);
+ALTER TABLE llx_product_association ADD COLUMN rang integer DEFAULT 0;
-- -- add action trigger
INSERT INTO llx_c_action_trigger (code,label,description,elementtype,rang) VALUES ('ORDER_SUPPLIER_CANCEL','Supplier order request canceled','Executed when a supplier order is canceled','order_supplier',13);
@@ -127,7 +128,7 @@ ALTER TABLE llx_categorie_knowledgemanagement ADD INDEX idx_categorie_knowledgem
ALTER TABLE llx_categorie_knowledgemanagement ADD INDEX idx_categorie_knowledgemanagement_fk_knowledgemanagement (fk_knowledgemanagement);
ALTER TABLE llx_categorie_knowledgemanagement ADD CONSTRAINT fk_categorie_knowledgemanagement_categorie_rowid FOREIGN KEY (fk_categorie) REFERENCES llx_categorie (rowid);
-ALTER TABLE llx_categorie_knowledgemanagement ADD CONSTRAINT fk_categorie_knowledgemanagement_knowledgemanagement_rowid FOREIGN KEY (fk_knowledgemanagement) REFERENCES llx_knowledgemanagement (rowid);
+ALTER TABLE llx_categorie_knowledgemanagement ADD CONSTRAINT fk_categorie_knowledgemanagement_knowledgemanagement_rowid FOREIGN KEY (fk_knowledgemanagement) REFERENCES llx_knowledgemanagement_knowledgerecord (rowid);
ALTER TABLE llx_product_lot ADD COLUMN barcode varchar(180) DEFAULT NULL;
ALTER TABLE llx_product_lot ADD COLUMN fk_barcode_type integer DEFAULT NULL;
@@ -154,3 +155,223 @@ ALTER TABLE llx_c_payment_term ADD COLUMN deposit_percent real DEFAULT NULL AFTE
ALTER TABLE llx_societe ADD COLUMN deposit_percent real DEFAULT NULL AFTER cond_reglement;
ALTER TABLE llx_propal ADD COLUMN deposit_percent real DEFAULT NULL AFTER fk_cond_reglement;
ALTER TABLE llx_commande ADD COLUMN deposit_percent real DEFAULT NULL AFTER fk_cond_reglement;
+
+
+-- START GRH/HRM MODULE
+
+
+CREATE TABLE llx_hrm_evaluation(
+ -- BEGIN MODULEBUILDER FIELDS
+ rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
+ ref varchar(128) DEFAULT '(PROV)' NOT NULL,
+ label varchar(255),
+ description text,
+ note_public text,
+ note_private text,
+ date_creation datetime NOT NULL,
+ tms timestamp,
+ fk_user_creat integer NOT NULL,
+ fk_user_modif integer,
+ import_key varchar(14),
+ status smallint NOT NULL,
+ date_eval date,
+ fk_user integer NOT NULL,
+ fk_job integer NOT NULL
+ -- END MODULEBUILDER FIELDS
+) ENGINE=innodb;
+ALTER TABLE llx_hrm_evaluation ADD INDEX idx_hrm_evaluation_rowid (rowid);
+ALTER TABLE llx_hrm_evaluation ADD INDEX idx_hrm_evaluation_ref (ref);
+ALTER TABLE llx_hrm_evaluation ADD CONSTRAINT llx_hrm_evaluation_fk_user_creat FOREIGN KEY (fk_user_creat) REFERENCES llx_user(rowid);
+ALTER TABLE llx_hrm_evaluation ADD INDEX idx_hrm_evaluation_status (status);
+
+
+create table llx_hrm_evaluation_extrafields
+(
+ rowid integer AUTO_INCREMENT PRIMARY KEY,
+ tms timestamp,
+ fk_object integer NOT NULL,
+ import_key varchar(14) -- import key
+) ENGINE=innodb;
+
+ALTER TABLE llx_hrm_evaluation_extrafields ADD INDEX idx_evaluation_fk_object(fk_object);
+
+
+CREATE TABLE llx_hrm_evaluationdet(
+ -- BEGIN MODULEBUILDER FIELDS
+ rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
+ date_creation datetime NOT NULL,
+ tms timestamp,
+ fk_user_creat integer NOT NULL,
+ fk_user_modif integer,
+ fk_skill integer NOT NULL,
+ fk_evaluation integer NOT NULL,
+ rank integer NOT NULL,
+ required_rank integer NOT NULL,
+ import_key varchar(14)
+ -- END MODULEBUILDER FIELDS
+) ENGINE=innodb;
+
+ALTER TABLE llx_hrm_evaluationdet ADD INDEX idx_hrm_evaluationdet_rowid (rowid);
+ALTER TABLE llx_hrm_evaluationdet ADD CONSTRAINT llx_hrm_evaluationdet_fk_user_creat FOREIGN KEY (fk_user_creat) REFERENCES llx_user(rowid);
+ALTER TABLE llx_hrm_evaluationdet ADD INDEX idx_hrm_evaluationdet_fk_skill (fk_skill);
+ALTER TABLE llx_hrm_evaluationdet ADD INDEX idx_hrm_evaluationdet_fk_evaluation (fk_evaluation);
+
+
+create table llx_hrm_evaluationdet_extrafields
+(
+ rowid integer AUTO_INCREMENT PRIMARY KEY,
+ tms timestamp,
+ fk_object integer NOT NULL,
+ import_key varchar(14) -- import key
+) ENGINE=innodb;
+
+ALTER TABLE llx_hrm_evaluationdet_extrafields ADD INDEX idx_evaluationdet_fk_object(fk_object);
+
+
+
+
+CREATE TABLE llx_hrm_job(
+
+ rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
+ label varchar(255) NOT NULL,
+ description text,
+ date_creation datetime NOT NULL,
+ tms timestamp,
+ deplacement varchar(255),
+ note_public text,
+ note_private text,
+ fk_user_creat integer,
+ fk_user_modif integer
+
+) ENGINE=innodb;
+
+ALTER TABLE llx_hrm_job ADD INDEX idx_hrm_job_rowid (rowid);
+ALTER TABLE llx_hrm_job ADD INDEX idx_hrm_job_label (label);
+
+
+create table llx_hrm_job_extrafields
+(
+ rowid integer AUTO_INCREMENT PRIMARY KEY,
+ tms timestamp,
+ fk_object integer NOT NULL,
+ import_key varchar(14) -- import key
+) ENGINE=innodb;
+
+ALTER TABLE llx_hrm_job_extrafields ADD INDEX idx_job_fk_object(fk_object);
+
+
+
+CREATE TABLE llx_hrm_job_user(
+ -- BEGIN MODULEBUILDER FIELDS
+ rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
+ -- ref varchar(128) NOT NULL,
+ description text,
+ date_creation datetime NOT NULL,
+ tms timestamp,
+ fk_contrat integer,
+ fk_user integer NOT NULL,
+ fk_job integer NOT NULL,
+ date_start date,
+ date_end date,
+ commentaire_abandon varchar(255),
+ note_public text,
+ note_private text,
+ fk_user_creat integer,
+ fk_user_modif integer
+ -- END MODULEBUILDER FIELDS
+) ENGINE=innodb;
+
+ALTER TABLE llx_hrm_job_user ADD INDEX idx_hrm_job_user_rowid (rowid);
+-- ALTER TABLE llx_hrm_job_user ADD INDEX idx_hrm_job_user_ref (ref);
+
+
+create table llx_hrm_job_user_extrafields
+(
+ rowid integer AUTO_INCREMENT PRIMARY KEY,
+ tms timestamp,
+ fk_object integer NOT NULL,
+ import_key varchar(14) -- import key
+) ENGINE=innodb;
+
+ALTER TABLE llx_hrm_job_user_extrafields ADD INDEX idx_position_fk_object(fk_object);
+
+
+
+CREATE TABLE llx_hrm_skill(
+ -- BEGIN MODULEBUILDER FIELDS
+ rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
+ label varchar(255),
+ description text,
+ date_creation datetime NOT NULL,
+ tms timestamp,
+ fk_user_creat integer NOT NULL,
+ fk_user_modif integer,
+ required_level integer NOT NULL,
+ date_validite integer NOT NULL,
+ temps_theorique double(24,8) NOT NULL,
+ skill_type integer NOT NULL,
+ note_public text,
+ note_private text
+ -- END MODULEBUILDER FIELDS
+) ENGINE=innodb;
+
+ALTER TABLE llx_hrm_skill ADD INDEX idx_hrm_skill_rowid (rowid);
+ALTER TABLE llx_hrm_skill ADD CONSTRAINT llx_hrm_skill_fk_user_creat FOREIGN KEY (fk_user_creat) REFERENCES llx_user(rowid);
+ALTER TABLE llx_hrm_skill ADD INDEX idx_hrm_skill_skill_type (skill_type);
+
+create table llx_hrm_skill_extrafields
+(
+ rowid integer AUTO_INCREMENT PRIMARY KEY,
+ tms timestamp,
+ fk_object integer NOT NULL,
+ import_key varchar(14) -- import key
+) ENGINE=innodb;
+
+ALTER TABLE llx_hrm_skill_extrafields ADD INDEX idx_skill_fk_object(fk_object);
+
+
+CREATE TABLE llx_hrm_skilldet(
+ -- BEGIN MODULEBUILDER FIELDS
+ rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
+ description text,
+ fk_user_creat integer NOT NULL,
+ fk_user_modif integer,
+ fk_skill integer NOT NULL,
+ rank integer
+ -- END MODULEBUILDER FIELDS
+) ENGINE=innodb;
+
+ALTER TABLE llx_hrm_skilldet ADD INDEX idx_hrm_skilldet_rowid (rowid);
+ALTER TABLE llx_hrm_skilldet ADD CONSTRAINT llx_hrm_skilldet_fk_user_creat FOREIGN KEY (fk_user_creat) REFERENCES llx_user(rowid);
+
+create table llx_hrm_skilldet_extrafields
+(
+ rowid integer AUTO_INCREMENT PRIMARY KEY,
+ tms timestamp,
+ fk_object integer NOT NULL,
+ import_key varchar(14) -- import key
+) ENGINE=innodb;
+
+ALTER TABLE llx_hrm_skilldet_extrafields ADD INDEX idx_skilldet_fk_object(fk_object);
+
+
+CREATE TABLE llx_hrm_skillrank(
+ -- BEGIN MODULEBUILDER FIELDS
+ rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
+ fk_skill integer NOT NULL,
+ rank integer NOT NULL,
+ fk_object integer NOT NULL,
+ date_creation datetime NOT NULL,
+ tms timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ fk_user_creat integer NOT NULL,
+ fk_user_modif integer,
+ objecttype varchar(128) NOT NULL
+ -- END MODULEBUILDER FIELDS
+) ENGINE=innodb;
+
+ALTER TABLE llx_hrm_skillrank ADD INDEX idx_hrm_skillrank_rowid (rowid);
+ALTER TABLE llx_hrm_skillrank ADD INDEX idx_hrm_skillrank_fk_skill (fk_skill);
+ALTER TABLE llx_hrm_skillrank ADD CONSTRAINT llx_hrm_skillrank_fk_user_creat FOREIGN KEY (fk_user_creat) REFERENCES llx_user(rowid);
+
+--END GRH/HRM MODULE
+
diff --git a/htdocs/install/mysql/tables/llx_hrm_evaluation.key.sql b/htdocs/install/mysql/tables/llx_hrm_evaluation.key.sql
new file mode 100644
index 00000000000..804bc6b4803
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_evaluation.key.sql
@@ -0,0 +1,29 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+
+-- BEGIN MODULEBUILDER INDEXES
+ALTER TABLE llx_hrm_evaluation ADD INDEX idx_hrm_evaluation_rowid (rowid);
+ALTER TABLE llx_hrm_evaluation ADD INDEX idx_hrm_evaluation_ref (ref);
+ALTER TABLE llx_hrm_evaluation ADD CONSTRAINT llx_hrm_evaluation_fk_user_creat FOREIGN KEY (fk_user_creat) REFERENCES llx_user(rowid);
+ALTER TABLE llx_hrm_evaluation ADD INDEX idx_hrm_evaluation_status (status);
+-- END MODULEBUILDER INDEXES
+
+--ALTER TABLE llx_hrm_evaluation ADD UNIQUE INDEX uk_hrm_evaluation_fieldxy(fieldx, fieldy);
+
+--ALTER TABLE llx_hrm_evaluation ADD CONSTRAINT llx_hrm_evaluation_fk_field FOREIGN KEY (fk_field) REFERENCES llx_hrm_myotherobject(rowid);
+
diff --git a/htdocs/install/mysql/tables/llx_hrm_evaluation.sql b/htdocs/install/mysql/tables/llx_hrm_evaluation.sql
new file mode 100644
index 00000000000..bc9b7a1effc
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_evaluation.sql
@@ -0,0 +1,37 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+
+CREATE TABLE llx_hrm_evaluation(
+ -- BEGIN MODULEBUILDER FIELDS
+ rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
+ ref varchar(128) DEFAULT '(PROV)' NOT NULL,
+ label varchar(255),
+ description text,
+ note_public text,
+ note_private text,
+ date_creation datetime NOT NULL,
+ tms timestamp,
+ fk_user_creat integer NOT NULL,
+ fk_user_modif integer,
+ import_key varchar(14),
+ status smallint NOT NULL,
+ date_eval date,
+ fk_user integer NOT NULL,
+ fk_job integer NOT NULL
+ -- END MODULEBUILDER FIELDS
+) ENGINE=innodb;
diff --git a/htdocs/install/mysql/tables/llx_hrm_evaluation_extrafields.key.sql b/htdocs/install/mysql/tables/llx_hrm_evaluation_extrafields.key.sql
new file mode 100644
index 00000000000..ff9ba9d6cb6
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_evaluation_extrafields.key.sql
@@ -0,0 +1,21 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation; either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+
+-- BEGIN MODULEBUILDER INDEXES
+ALTER TABLE llx_hrm_evaluation_extrafields ADD INDEX idx_evaluation_fk_object(fk_object);
+-- END MODULEBUILDER INDEXES
diff --git a/htdocs/install/mysql/tables/llx_hrm_evaluation_extrafields.sql b/htdocs/install/mysql/tables/llx_hrm_evaluation_extrafields.sql
new file mode 100644
index 00000000000..da00cc3c333
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_evaluation_extrafields.sql
@@ -0,0 +1,25 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation; either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+create table llx_hrm_evaluation_extrafields
+(
+ rowid integer AUTO_INCREMENT PRIMARY KEY,
+ tms timestamp,
+ fk_object integer NOT NULL,
+ import_key varchar(14) -- import key
+) ENGINE=innodb;
+
diff --git a/htdocs/install/mysql/tables/llx_hrm_evaluationdet.key.sql b/htdocs/install/mysql/tables/llx_hrm_evaluationdet.key.sql
new file mode 100644
index 00000000000..05309ce57e2
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_evaluationdet.key.sql
@@ -0,0 +1,29 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+
+-- BEGIN MODULEBUILDER INDEXES
+ALTER TABLE llx_hrm_evaluationdet ADD INDEX idx_hrm_evaluationdet_rowid (rowid);
+ALTER TABLE llx_hrm_evaluationdet ADD CONSTRAINT llx_hrm_evaluationdet_fk_user_creat FOREIGN KEY (fk_user_creat) REFERENCES llx_user(rowid);
+ALTER TABLE llx_hrm_evaluationdet ADD INDEX idx_hrm_evaluationdet_fk_skill (fk_skill);
+ALTER TABLE llx_hrm_evaluationdet ADD INDEX idx_hrm_evaluationdet_fk_evaluation (fk_evaluation);
+-- END MODULEBUILDER INDEXES
+
+--ALTER TABLE llx_hrm_evaluationdet ADD UNIQUE INDEX uk_hrm_evaluationdet_fieldxy(fieldx, fieldy);
+
+--ALTER TABLE llx_hrm_evaluationdet ADD CONSTRAINT llx_hrm_evaluationdet_fk_field FOREIGN KEY (fk_field) REFERENCES llx_hrm_myotherobject(rowid);
+
diff --git a/htdocs/install/mysql/tables/llx_hrm_evaluationdet.sql b/htdocs/install/mysql/tables/llx_hrm_evaluationdet.sql
new file mode 100644
index 00000000000..0509cc80146
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_evaluationdet.sql
@@ -0,0 +1,32 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+
+CREATE TABLE llx_hrm_evaluationdet(
+ -- BEGIN MODULEBUILDER FIELDS
+ rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
+ date_creation datetime NOT NULL,
+ tms timestamp,
+ fk_user_creat integer NOT NULL,
+ fk_user_modif integer,
+ fk_skill integer NOT NULL,
+ fk_evaluation integer NOT NULL,
+ rank integer NOT NULL,
+ required_rank integer NOT NULL,
+ import_key varchar(14)
+ -- END MODULEBUILDER FIELDS
+) ENGINE=innodb;
diff --git a/htdocs/install/mysql/tables/llx_hrm_evaluationdet_extrafields.key.sql b/htdocs/install/mysql/tables/llx_hrm_evaluationdet_extrafields.key.sql
new file mode 100644
index 00000000000..5072e2eb67b
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_evaluationdet_extrafields.key.sql
@@ -0,0 +1,21 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation; either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+
+-- BEGIN MODULEBUILDER INDEXES
+ALTER TABLE llx_hrm_evaluationdet_extrafields ADD INDEX idx_evaluationdet_fk_object(fk_object);
+-- END MODULEBUILDER INDEXES
diff --git a/htdocs/install/mysql/tables/llx_hrm_evaluationdet_extrafields.sql b/htdocs/install/mysql/tables/llx_hrm_evaluationdet_extrafields.sql
new file mode 100644
index 00000000000..4d4031ba228
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_evaluationdet_extrafields.sql
@@ -0,0 +1,24 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation; either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+create table llx_hrm_evaluationdet_extrafields
+(
+ rowid integer AUTO_INCREMENT PRIMARY KEY,
+ tms timestamp,
+ fk_object integer NOT NULL,
+ import_key varchar(14) -- import key
+) ENGINE=innodb;
diff --git a/htdocs/install/mysql/tables/llx_hrm_job.key.sql b/htdocs/install/mysql/tables/llx_hrm_job.key.sql
new file mode 100644
index 00000000000..6fe7da6016e
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_job.key.sql
@@ -0,0 +1,27 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+
+-- BEGIN MODULEBUILDER INDEXES
+ALTER TABLE llx_hrm_job ADD INDEX idx_hrm_job_rowid (rowid);
+ALTER TABLE llx_hrm_job ADD INDEX idx_hrm_job_label (label);
+-- END MODULEBUILDER INDEXES
+
+--ALTER TABLE llx_hrm_job ADD UNIQUE INDEX uk_hrm_job_fieldxy(fieldx, fieldy);
+
+--ALTER TABLE llx_hrm_job ADD CONSTRAINT llx_hrm_job_fk_field FOREIGN KEY (fk_field) REFERENCES llx_hrm_myotherobject(rowid);
+
diff --git a/htdocs/install/mysql/tables/llx_hrm_job.sql b/htdocs/install/mysql/tables/llx_hrm_job.sql
new file mode 100644
index 00000000000..51f472af377
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_job.sql
@@ -0,0 +1,32 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+
+CREATE TABLE llx_hrm_job(
+
+ rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
+ label varchar(255) NOT NULL,
+ description text,
+ date_creation datetime NOT NULL,
+ tms timestamp,
+ deplacement varchar(255),
+ note_public text,
+ note_private text,
+ fk_user_creat integer,
+ fk_user_modif integer
+
+) ENGINE=innodb;
diff --git a/htdocs/install/mysql/tables/llx_hrm_job_extrafields.key.sql b/htdocs/install/mysql/tables/llx_hrm_job_extrafields.key.sql
new file mode 100644
index 00000000000..b5226dc4c38
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_job_extrafields.key.sql
@@ -0,0 +1,21 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation; either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+
+-- BEGIN MODULEBUILDER INDEXES
+ALTER TABLE llx_hrm_job_extrafields ADD INDEX idx_job_fk_object(fk_object);
+-- END MODULEBUILDER INDEXES
diff --git a/htdocs/install/mysql/tables/llx_hrm_job_extrafields.sql b/htdocs/install/mysql/tables/llx_hrm_job_extrafields.sql
new file mode 100644
index 00000000000..10cccf1c36f
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_job_extrafields.sql
@@ -0,0 +1,25 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation; either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+create table llx_hrm_job_extrafields
+(
+ rowid integer AUTO_INCREMENT PRIMARY KEY,
+ tms timestamp,
+ fk_object integer NOT NULL,
+ import_key varchar(14) -- import key
+) ENGINE=innodb;
+
diff --git a/htdocs/install/mysql/tables/llx_hrm_job_user.key.sql b/htdocs/install/mysql/tables/llx_hrm_job_user.key.sql
new file mode 100644
index 00000000000..ead2f7f3b18
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_job_user.key.sql
@@ -0,0 +1,27 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+
+-- BEGIN MODULEBUILDER INDEXES
+ALTER TABLE llx_hrm_job_user ADD INDEX idx_hrm_job_user_rowid (rowid);
+-- ALTER TABLE llx_hrm_job_user ADD INDEX idx_hrm_job_user_ref (ref);
+-- END MODULEBUILDER INDEXES
+
+--ALTER TABLE llx_hrm_job_user ADD UNIQUE INDEX uk_hrm_job_user_fieldxy(fieldx, fieldy);
+
+--ALTER TABLE llx_hrm_job_user ADD CONSTRAINT llx_hrm_job_user_fk_field FOREIGN KEY (fk_field) REFERENCES llx_hrm_myotherobject(rowid);
+
diff --git a/htdocs/install/mysql/tables/llx_hrm_job_user.sql b/htdocs/install/mysql/tables/llx_hrm_job_user.sql
new file mode 100644
index 00000000000..ce9620623dd
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_job_user.sql
@@ -0,0 +1,36 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+CREATE TABLE llx_hrm_job_user(
+ -- BEGIN MODULEBUILDER FIELDS
+ rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
+ -- ref varchar(128) NOT NULL,
+ description text,
+ date_creation datetime NOT NULL,
+ tms timestamp,
+ fk_contrat integer,
+ fk_user integer NOT NULL,
+ fk_job integer NOT NULL,
+ date_start datetime,
+ date_end datetime,
+ commentaire_abandon varchar(255),
+ note_public text,
+ note_private text,
+ fk_user_creat integer,
+ fk_user_modif integer
+ -- END MODULEBUILDER FIELDS
+) ENGINE=innodb;
diff --git a/htdocs/install/mysql/tables/llx_hrm_job_user_extrafields.key.sql b/htdocs/install/mysql/tables/llx_hrm_job_user_extrafields.key.sql
new file mode 100644
index 00000000000..99ed1f4c1bc
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_job_user_extrafields.key.sql
@@ -0,0 +1,21 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation; either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+
+-- BEGIN MODULEBUILDER INDEXES
+ALTER TABLE llx_hrm_job_user_extrafields ADD INDEX idx_position_fk_object(fk_object);
+-- END MODULEBUILDER INDEXES
diff --git a/htdocs/install/mysql/tables/llx_hrm_job_user_extrafields.sql b/htdocs/install/mysql/tables/llx_hrm_job_user_extrafields.sql
new file mode 100644
index 00000000000..7495563f68d
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_job_user_extrafields.sql
@@ -0,0 +1,25 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation; either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+create table llx_hrm_job_user_extrafields
+(
+ rowid integer AUTO_INCREMENT PRIMARY KEY,
+ tms timestamp,
+ fk_object integer NOT NULL,
+ import_key varchar(14) -- import key
+) ENGINE=innodb;
+
diff --git a/htdocs/install/mysql/tables/llx_hrm_skill.key.sql b/htdocs/install/mysql/tables/llx_hrm_skill.key.sql
new file mode 100644
index 00000000000..b3196bf8522
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_skill.key.sql
@@ -0,0 +1,28 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+
+-- BEGIN MODULEBUILDER INDEXES
+ALTER TABLE llx_hrm_skill ADD INDEX idx_hrm_skill_rowid (rowid);
+ALTER TABLE llx_hrm_skill ADD CONSTRAINT llx_hrm_skill_fk_user_creat FOREIGN KEY (fk_user_creat) REFERENCES llx_user(rowid);
+ALTER TABLE llx_hrm_skill ADD INDEX idx_hrm_skill_skill_type (skill_type);
+-- END MODULEBUILDER INDEXES
+
+--ALTER TABLE llx_hrm_skill ADD UNIQUE INDEX uk_hrm_skill_fieldxy(fieldx, fieldy);
+
+--ALTER TABLE llx_hrm_skill ADD CONSTRAINT llx_hrm_skill_fk_field FOREIGN KEY (fk_field) REFERENCES llx_hrm_myotherobject(rowid);
+
diff --git a/htdocs/install/mysql/tables/llx_hrm_skill.sql b/htdocs/install/mysql/tables/llx_hrm_skill.sql
new file mode 100644
index 00000000000..96a31be588a
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_skill.sql
@@ -0,0 +1,35 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+
+CREATE TABLE llx_hrm_skill(
+ -- BEGIN MODULEBUILDER FIELDS
+ rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
+ label varchar(255),
+ description text,
+ date_creation datetime NOT NULL,
+ tms timestamp,
+ fk_user_creat integer NOT NULL,
+ fk_user_modif integer,
+ required_level integer NOT NULL,
+ date_validite integer NOT NULL,
+ temps_theorique double(24,8) NOT NULL,
+ skill_type integer NOT NULL,
+ note_public text,
+ note_private text
+ -- END MODULEBUILDER FIELDS
+) ENGINE=innodb;
diff --git a/htdocs/install/mysql/tables/llx_hrm_skill_extrafields.key.sql b/htdocs/install/mysql/tables/llx_hrm_skill_extrafields.key.sql
new file mode 100644
index 00000000000..a4ae591731e
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_skill_extrafields.key.sql
@@ -0,0 +1,21 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation; either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+
+-- BEGIN MODULEBUILDER INDEXES
+ALTER TABLE llx_hrm_skill_extrafields ADD INDEX idx_skill_fk_object(fk_object);
+-- END MODULEBUILDER INDEXES
diff --git a/htdocs/install/mysql/tables/llx_hrm_skill_extrafields.sql b/htdocs/install/mysql/tables/llx_hrm_skill_extrafields.sql
new file mode 100644
index 00000000000..d47657e34f8
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_skill_extrafields.sql
@@ -0,0 +1,25 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation; either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+create table llx_hrm_skill_extrafields
+(
+ rowid integer AUTO_INCREMENT PRIMARY KEY,
+ tms timestamp,
+ fk_object integer NOT NULL,
+ import_key varchar(14) -- import key
+) ENGINE=innodb;
+
diff --git a/htdocs/install/mysql/tables/llx_hrm_skilldet.key.sql b/htdocs/install/mysql/tables/llx_hrm_skilldet.key.sql
new file mode 100644
index 00000000000..289276e07b5
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_skilldet.key.sql
@@ -0,0 +1,27 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+
+-- BEGIN MODULEBUILDER INDEXES
+ALTER TABLE llx_hrm_skilldet ADD INDEX idx_hrm_skilldet_rowid (rowid);
+ALTER TABLE llx_hrm_skilldet ADD CONSTRAINT llx_hrm_skilldet_fk_user_creat FOREIGN KEY (fk_user_creat) REFERENCES llx_user(rowid);
+-- END MODULEBUILDER INDEXES
+
+--ALTER TABLE llx_hrm_skilldet ADD UNIQUE INDEX uk_hrm_skilldet_fieldxy(fieldx, fieldy);
+
+--ALTER TABLE llx_hrm_skilldet ADD CONSTRAINT llx_hrm_skilldet_fk_field FOREIGN KEY (fk_field) REFERENCES llx_hrm_myotherobject(rowid);
+
diff --git a/htdocs/install/mysql/tables/llx_hrm_skilldet.sql b/htdocs/install/mysql/tables/llx_hrm_skilldet.sql
new file mode 100644
index 00000000000..fba82645915
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_skilldet.sql
@@ -0,0 +1,28 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+
+CREATE TABLE llx_hrm_skilldet(
+ -- BEGIN MODULEBUILDER FIELDS
+ rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
+ description text,
+ fk_user_creat integer NOT NULL,
+ fk_user_modif integer,
+ fk_skill integer NOT NULL,
+ rank integer
+ -- END MODULEBUILDER FIELDS
+) ENGINE=innodb;
diff --git a/htdocs/install/mysql/tables/llx_hrm_skilldet_extrafields.key.sql b/htdocs/install/mysql/tables/llx_hrm_skilldet_extrafields.key.sql
new file mode 100644
index 00000000000..319eb193a18
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_skilldet_extrafields.key.sql
@@ -0,0 +1,21 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+--
+-- 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
+-- the Free Software Foundation; either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+
+-- BEGIN MODULEBUILDER INDEXES
+ALTER TABLE llx_hrm_skilldet_extrafields ADD INDEX idx_skilldet_fk_object(fk_object);
+-- END MODULEBUILDER INDEXES
diff --git a/htdocs/install/mysql/tables/llx_hrm_skilldet_extrafields.sql b/htdocs/install/mysql/tables/llx_hrm_skilldet_extrafields.sql
new file mode 100644
index 00000000000..a6e14f476c0
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_skilldet_extrafields.sql
@@ -0,0 +1,24 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+-- 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
+-- the Free Software Foundation; either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+create table llx_hrm_skilldet_extrafields
+(
+ rowid integer AUTO_INCREMENT PRIMARY KEY,
+ tms timestamp,
+ fk_object integer NOT NULL,
+ import_key varchar(14) -- import key
+) ENGINE=innodb;
+
diff --git a/htdocs/install/mysql/tables/llx_hrm_skillrank.key.sql b/htdocs/install/mysql/tables/llx_hrm_skillrank.key.sql
new file mode 100644
index 00000000000..11d89b0187c
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_skillrank.key.sql
@@ -0,0 +1,27 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+-- 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
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+
+-- BEGIN MODULEBUILDER INDEXES
+ALTER TABLE llx_hrm_skillrank ADD INDEX idx_hrm_skillrank_rowid (rowid);
+ALTER TABLE llx_hrm_skillrank ADD INDEX idx_hrm_skillrank_fk_skill (fk_skill);
+ALTER TABLE llx_hrm_skillrank ADD CONSTRAINT llx_hrm_skillrank_fk_user_creat FOREIGN KEY (fk_user_creat) REFERENCES llx_user(rowid);
+-- END MODULEBUILDER INDEXES
+
+--ALTER TABLE llx_hrm_skillrank ADD UNIQUE INDEX uk_hrm_skillrank_fieldxy(fieldx, fieldy);
+
+--ALTER TABLE llx_hrm_skillrank ADD CONSTRAINT llx_hrm_skillrank_fk_field FOREIGN KEY (fk_field) REFERENCES llx_hrm_myotherobject(rowid);
+
diff --git a/htdocs/install/mysql/tables/llx_hrm_skillrank.sql b/htdocs/install/mysql/tables/llx_hrm_skillrank.sql
new file mode 100644
index 00000000000..5c4deb95938
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_hrm_skillrank.sql
@@ -0,0 +1,30 @@
+-- Copyright (C) 2021 Gauthier VERDOL
+-- Copyright (C) 2021 Greg Rastklan
+-- Copyright (C) 2021 Jean-Pascal BOUDET
+-- 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
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see https://www.gnu.org/licenses/.
+
+
+CREATE TABLE llx_hrm_skillrank(
+ -- BEGIN MODULEBUILDER FIELDS
+ rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
+ fk_skill integer NOT NULL,
+ rank integer NOT NULL,
+ fk_object integer NOT NULL,
+ date_creation datetime NOT NULL,
+ tms timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ fk_user_creat integer NOT NULL,
+ fk_user_modif integer,
+ objecttype varchar(128) NOT NULL
+ -- END MODULEBUILDER FIELDS
+) ENGINE=innodb;
diff --git a/htdocs/install/mysql/tables/llx_product_association.sql b/htdocs/install/mysql/tables/llx_product_association.sql
index 91cc14882f1..f97e2aa6a0b 100644
--- a/htdocs/install/mysql/tables/llx_product_association.sql
+++ b/htdocs/install/mysql/tables/llx_product_association.sql
@@ -23,6 +23,7 @@ create table llx_product_association
fk_product_pere integer NOT NULL DEFAULT 0, -- id du produit maitre
fk_product_fils integer NOT NULL DEFAULT 0, -- id du sous-produit
qty double NULL,
- incdec integer DEFAULT 1 -- when set to 1 changing stock of product will change stock of linked product too
+ incdec integer DEFAULT 1, -- when set to 1 changing stock of product will change stock of linked product too
+ rang integer DEFAULT 0
)ENGINE=innodb;
diff --git a/htdocs/install/mysql/tables/llx_workstation_workstation_user_group.sql b/htdocs/install/mysql/tables/llx_workstation_workstation_usergroup.sql
similarity index 100%
rename from htdocs/install/mysql/tables/llx_workstation_workstation_user_group.sql
rename to htdocs/install/mysql/tables/llx_workstation_workstation_usergroup.sql
diff --git a/htdocs/install/repair.php b/htdocs/install/repair.php
index 8160f6e89b8..3bc37960bf3 100644
--- a/htdocs/install/repair.php
+++ b/htdocs/install/repair.php
@@ -1180,7 +1180,7 @@ if ($ok && GETPOST('clean_perm_table', 'alpha')) {
foreach ($conf->modules as $key => $val) {
$listofmods .= ($listofmods ? ',' : '')."'".$val."'";
}
- $sql = 'SELECT id, libelle as label, module from '.MAIN_DB_PREFIX.'rights_def WHERE module NOT IN ('.$db->sanitize($listofmods).') AND id > 100000';
+ $sql = "SELECT id, libelle as label, module from ".MAIN_DB_PREFIX."rights_def WHERE module NOT IN (".$db->sanitize($listofmods).") AND id > 100000";
$resql = $db->query($sql);
if ($resql) {
$num = $db->num_rows($resql);
@@ -1191,7 +1191,7 @@ if ($ok && GETPOST('clean_perm_table', 'alpha')) {
if ($obj->id > 0) {
print 'Found line with id '.$obj->id.', label "'.$obj->label.'" of module "'.$obj->module.'" to delete';
if (GETPOST('clean_perm_table', 'alpha') == 'confirmed') {
- $sqldelete = 'DELETE FROM '.MAIN_DB_PREFIX.'rights_def WHERE id = '.$obj->id;
+ $sqldelete = "DELETE FROM ".MAIN_DB_PREFIX."rights_def WHERE id = ".((int) $obj->id);
$resqldelete = $db->query($sqldelete);
if (!$resqldelete) {
dol_print_error($db);
diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang
index 48887552e7e..31d08d98a08 100644
--- a/htdocs/langs/en_US/admin.lang
+++ b/htdocs/langs/en_US/admin.lang
@@ -133,7 +133,6 @@ IdModule=Module ID
IdPermissions=Permissions ID
LanguageBrowserParameter=Parameter %s
LocalisationDolibarrParameters=Localization parameters
-ClientTZ=Client Time Zone (user)
ClientHour=Client time (user)
OSTZ=Server OS Time Zone
PHPTZ=PHP server Time Zone
@@ -161,7 +160,7 @@ Purge=Purge
PurgeAreaDesc=This page allows you to delete all files generated or stored by Dolibarr (temporary files or all files in %s directory). Using this feature is not normally necessary. It is provided as a workaround for users whose Dolibarr is hosted by a provider that does not offer permissions to delete files generated by the web server.
PurgeDeleteLogFile=Delete log files, including %s defined for Syslog module (no risk of losing data)
PurgeDeleteTemporaryFiles=Delete all log and temporary files (no risk of losing data). Parameter can be 'tempfilesold', 'logfiles' or both 'tempfilesold+logfiles'. Note: Deletion of temporary files is done only if the temp directory was created more than 24 hours ago.
-PurgeDeleteTemporaryFilesShort=Delete log and temporary files
+PurgeDeleteTemporaryFilesShort=Delete log and temporary files (no risk of losing data)
PurgeDeleteAllFilesInDocumentsDir=Delete all files in directory: %s . This will delete all generated documents related to elements (third parties, invoices etc...), files uploaded into the ECM module, database backup dumps and temporary files.
PurgeRunNow=Purge now
PurgeNothingToDelete=No directory or files to delete.
@@ -517,6 +516,8 @@ Field=Field
ProductDocumentTemplates=Document templates to generate product document
FreeLegalTextOnExpenseReports=Free legal text on expense reports
WatermarkOnDraftExpenseReports=Watermark on draft expense reports
+PrefillExpenseReportDatesWithCurrentMonth=Pre-fill start and end dates of new expense report with start and end dates of the current month
+ForceExpenseReportsLineAmountsIncludingTaxesOnly=Force the entry of expense report amounts always in amount with taxes
AttachMainDocByDefault=Set this to 1 if you want to attach main document to email by default (if applicable)
FilesAttachedToEmail=Attach file
SendEmailsReminders=Send agenda reminders by emails
@@ -2156,7 +2157,7 @@ NoWritableFilesFoundIntoRootDir=No writable files or directories of the common p
RecommendedValueIs=Recommended: %s
Recommended=Recommended
NotRecommended=Not recommended
-ARestrictedPath=A restricted path
+ARestrictedPath=Some restricted path
CheckForModuleUpdate=Check for external modules updates
CheckForModuleUpdateHelp=This action will connect to editors of external modules to check if a new version is available.
ModuleUpdateAvailable=An update is available
diff --git a/htdocs/langs/en_US/bills.lang b/htdocs/langs/en_US/bills.lang
index 88f653473d5..429e46b0d69 100644
--- a/htdocs/langs/en_US/bills.lang
+++ b/htdocs/langs/en_US/bills.lang
@@ -265,6 +265,7 @@ DateInvoice=Invoice date
DatePointOfTax=Point of tax
NoInvoice=No invoice
NoOpenInvoice=No open invoice
+NbOfOpenInvoices=Number of open invoices
ClassifyBill=Classify invoice
SupplierBillsToPay=Unpaid vendor invoices
CustomerBillsUnpaid=Unpaid customer invoices
diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang
index b68b62c2a43..fb6e20adcca 100644
--- a/htdocs/langs/en_US/main.lang
+++ b/htdocs/langs/en_US/main.lang
@@ -1155,4 +1155,5 @@ ConfirmMassLeaveApproval=Mass leave approval confirmation
RecordAproved=Record approved
RecordsApproved=%s Record(s) approved
Properties=Properties
-hasBeenValidated=%s has been validated
\ No newline at end of file
+hasBeenValidated=%s has been validated
+ClientTZ=Client Time Zone (user)
diff --git a/htdocs/langs/en_US/printing.lang b/htdocs/langs/en_US/printing.lang
index 16494583550..bd9094f213d 100644
--- a/htdocs/langs/en_US/printing.lang
+++ b/htdocs/langs/en_US/printing.lang
@@ -1,10 +1,10 @@
# Dolibarr language file - Source file is en_US - printing
-Module64000Name=Direct Printing
-Module64000Desc=Enable Direct Printing System
-PrintingSetup=Setup of Direct Printing System
-PrintingDesc=This module adds a Print button to various modules to allow documents to be printed directly to a printer without needing to open the document in another application.
-MenuDirectPrinting=Direct Printing jobs
-DirectPrint=Direct print
+Module64000Name=One click Printing
+Module64000Desc=Enable One click Printing System
+PrintingSetup=Setup of One click Printing System
+PrintingDesc=This module adds a Print button to various modules to allow documents to be printed directly to a printer with no need to open the document into another application.
+MenuDirectPrinting=One click Printing jobs
+DirectPrint=One click Print
PrintingDriverDesc=Configuration variables for printing driver.
ListDrivers=List of drivers
PrintTestDesc=List of Printers.
diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang
index 128eb120e0b..19349fb35a8 100644
--- a/htdocs/langs/en_US/products.lang
+++ b/htdocs/langs/en_US/products.lang
@@ -401,11 +401,10 @@ DeleteLinkedProduct=Delete the child product linked to the combination
AmountUsedToUpdateWAP=Amount to use to update the Weighted Average Price
PMPValue=Weighted average price
PMPValueShort=WAP
-
mandatoryperiod=Mandatory periods
mandatoryPeriodNeedTobeSet=Attention periods not entered and mandatory
mandatoryPeriodNeedTobeSetMsgValidate=A service requires a start and end period
mandatoryHelper=Message to the user on the need to enter a start date and an end date on a service when creating / validating an invoice, commercial proposal, sales order. This action is not blocking in the process of confirmation
DefaultBOM=Default BOM
-DefaultBOMDesc=The default BOM recommended to use to manufacture this product. This field can be set only if nature of product is '%s'.
-
+DefaultBOMDesc=The default BOM recommended to use to manufacture this product. This field can be set only if nature of product is '%s'.
+Rank=Rank
diff --git a/htdocs/langs/fr_FR/products.lang b/htdocs/langs/fr_FR/products.lang
index 83514bd95ff..24e5c062cc7 100644
--- a/htdocs/langs/fr_FR/products.lang
+++ b/htdocs/langs/fr_FR/products.lang
@@ -399,6 +399,7 @@ ProductSupplierExtraFields=Attributs supplémentaires (Prix fournisseur)
DeleteLinkedProduct=Supprimer le produit enfant lié à la combinaison
PMPValue=Prix moyen pondéré (PMP)
PMPValueShort=PMP
+Rank=Rang
mandatoryperiod=Périodes obligatoires
mandatoryPeriodNeedTobeSet=Attention périodes non saisies et obligatoires
mandatoryPeriodNeedTobeSetMsgValidate=Un service nécessite une période de début et de fin
diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php
index 6f6d74c0cda..a26954bbed5 100644
--- a/htdocs/main.inc.php
+++ b/htdocs/main.inc.php
@@ -465,13 +465,13 @@ if (!defined('NOTOKENRENEWAL') && !defined('NOSESSION')) {
if ((!defined('NOCSRFCHECK') && empty($dolibarr_nocsrfcheck) && getDolGlobalInt('MAIN_SECURITY_CSRF_WITH_TOKEN')) || defined('CSRFCHECK_WITH_TOKEN')) {
// Array of action code where CSRFCHECK with token will be forced (so token must be provided on url request)
$sensitiveget = false;
- if ((GETPOSTISSET('massaction') || GETPOST('action', 'aZ09')) && getDolGlobalInt('MAIN_SECURITY_CSRF_WITH_TOKEN') == 2) {
+ if ((GETPOSTISSET('massaction') || GETPOST('action', 'aZ09')) && getDolGlobalInt('MAIN_SECURITY_CSRF_WITH_TOKEN') >= 3) {
// All GET actions and mass actions are processed as sensitive.
$sensitiveget = true;
- } else {
- // Only GET actions coded with a &token into url are processed as sensitive.
+ } elseif (getDolGlobalInt('MAIN_SECURITY_CSRF_WITH_TOKEN') >= 2) {
+ // Few GET actions coded with a &token into url are processed as sensitive.
$arrayofactiontoforcetokencheck = array(
- 'activate', 'add', 'addrights', 'addtimespent',
+ 'activate',
'doprev', 'donext', 'dvprev', 'dvnext',
'install',
'reopen'
@@ -479,7 +479,7 @@ if ((!defined('NOCSRFCHECK') && empty($dolibarr_nocsrfcheck) && getDolGlobalInt(
if (in_array(GETPOST('action', 'aZ09'), $arrayofactiontoforcetokencheck)) {
$sensitiveget = true;
}
- if (preg_match('/^(classify|close|confirm|del|disable|enable|remove|set|unset|update)/', GETPOST('action', 'aZ09'))) {
+ if (preg_match('/^(add|classify|close|confirm|copy|del|disable|enable|remove|set|unset|update|save)/', GETPOST('action', 'aZ09'))) {
$sensitiveget = true;
}
}
diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php
index 4a3f9fd6e25..ea0af722885 100644
--- a/htdocs/modulebuilder/index.php
+++ b/htdocs/modulebuilder/index.php
@@ -2309,7 +2309,7 @@ if ($module == 'initmodule') {
$i++;
}
} else {
- print ' '.$langs->trans("None").' ';
+ print ''.$langs->trans("None").' ';
}
print '
';
@@ -3106,7 +3106,7 @@ if ($module == 'initmodule') {
print '';
}
} else {
- print ''.$langs->trans("None").' ';
+ print ''.$langs->trans("None").' ';
}
print '
';
@@ -3199,7 +3199,7 @@ if ($module == 'initmodule') {
print '';
}
} else {
- print '
'.$langs->trans("None").' ';
+ print '
'.$langs->trans("None").' ';
}
print '
';
@@ -3696,7 +3696,7 @@ if ($module == 'initmodule') {
print '';
}
} else {
- print '
'.$langs->trans("None").' ';
+ print '
'.$langs->trans("None").' ';
}
print '
';
diff --git a/htdocs/modulebuilder/template/class/myobject.class.php b/htdocs/modulebuilder/template/class/myobject.class.php
index e7db2a1275a..ad1774b149e 100644
--- a/htdocs/modulebuilder/template/class/myobject.class.php
+++ b/htdocs/modulebuilder/template/class/myobject.class.php
@@ -430,13 +430,13 @@ class MyObject extends CommonObject
$records = array();
- $sql = 'SELECT ';
+ $sql = "SELECT ";
$sql .= $this->getFieldList('t');
- $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
+ $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t";
if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
- $sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')';
+ $sql .= " WHERE t.entity IN (".getEntity($this->table_element).")";
} else {
- $sql .= ' WHERE 1 = 1';
+ $sql .= " WHERE 1 = 1";
}
// Manage filter
$sqlwhere = array();
@@ -908,10 +908,11 @@ class MyObject extends CommonObject
*/
public function info($id)
{
- $sql = 'SELECT rowid, date_creation as datec, tms as datem,';
- $sql .= ' fk_user_creat, fk_user_modif';
- $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
- $sql .= ' WHERE t.rowid = '.((int) $id);
+ $sql = "SELECT rowid, date_creation as datec, tms as datem,";
+ $sql .= " fk_user_creat, fk_user_modif";
+ $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t";
+ $sql .= " WHERE t.rowid = ".((int) $id);
+
$result = $this->db->query($sql);
if ($result) {
if ($this->db->num_rows($result)) {
diff --git a/htdocs/mrp/class/api_mos.class.php b/htdocs/mrp/class/api_mos.class.php
index 8fbd25090c7..59b4cbfa16b 100644
--- a/htdocs/mrp/class/api_mos.class.php
+++ b/htdocs/mrp/class/api_mos.class.php
@@ -22,7 +22,7 @@ require_once DOL_DOCUMENT_ROOT.'/mrp/class/mo.class.php';
/**
- * \file mrp/class/api_mo.class.php
+ * \file htdocs/mrp/class/api_mos.class.php
* \ingroup mrp
* \brief File for API management of MO.
*/
diff --git a/htdocs/mrp/mo_production.php b/htdocs/mrp/mo_production.php
index 84dab109b91..784b91f6f4c 100644
--- a/htdocs/mrp/mo_production.php
+++ b/htdocs/mrp/mo_production.php
@@ -704,7 +704,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
$newlinetext = '';
if ($object->status != $object::STATUS_PRODUCED && $object->status != $object::STATUS_CANCELED && $action != 'consumeorproduce' && $action != 'consumeandproduceall') {
- $newlinetext = 'id.'&action=addconsumeline">'.$langs->trans("AddNewConsumeLines").' ';
+ $newlinetext = 'id.'&action=addconsumeline&token='.newToken().'">'.$langs->trans("AddNewConsumeLines").' ';
}
print load_fiche_titre($langs->trans('Consumption'), '', '', 0, '', '', $newlinetext);
@@ -996,7 +996,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
$newlinetext = '';
if ($object->status != $object::STATUS_PRODUCED && $object->status != $object::STATUS_CANCELED && $action != 'consumeorproduce' && $action != 'consumeandproduceall') {
if ($nblinetoproduce == 0 || $object->mrptype == 1) {
- $newlinetext = 'id.'&action=addproduceline">'.$langs->trans("AddNewProduceLines").' ';
+ $newlinetext = 'id.'&action=addproduceline&token='.newToken().'">'.$langs->trans("AddNewProduceLines").' ';
}
}
print load_fiche_titre($langs->trans('Production'), '', '', 0, '', '', $newlinetext);
diff --git a/htdocs/multicurrency/class/multicurrency.class.php b/htdocs/multicurrency/class/multicurrency.class.php
index 5e145dbd8a6..73eab7773bd 100644
--- a/htdocs/multicurrency/class/multicurrency.class.php
+++ b/htdocs/multicurrency/class/multicurrency.class.php
@@ -133,7 +133,7 @@ class MultiCurrency extends CommonObject
$now = dol_now();
// Insert request
- $sql = 'INSERT INTO '.MAIN_DB_PREFIX.$this->table_element.'(';
+ $sql = "INSERT INTO ".MAIN_DB_PREFIX.$this->table_element."(";
$sql .= ' code,';
$sql .= ' name,';
$sql .= ' entity,';
@@ -194,7 +194,7 @@ class MultiCurrency extends CommonObject
global $conf;
- $sql = 'SELECT';
+ $sql = "SELECT";
$sql .= ' c.rowid, c.name, c.code, c.entity, c.date_create, c.fk_user';
$sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' AS c';
if (!empty($code)) {
@@ -243,7 +243,7 @@ class MultiCurrency extends CommonObject
*/
public function fetchAllCurrencyRate()
{
- $sql = 'SELECT cr.rowid';
+ $sql = "SELECT cr.rowid";
$sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element_line.' as cr';
$sql .= ' WHERE cr.fk_multicurrency = '.((int) $this->id);
$sql .= ' ORDER BY cr.date_sync DESC';
@@ -298,10 +298,10 @@ class MultiCurrency extends CommonObject
}
// Update request
- $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element.' SET';
- $sql .= ' name=\''.$this->db->escape($this->name).'\'';
- $sql .= ' code=\''.$this->db->escape($this->code).'\'';
- $sql .= ' WHERE rowid='.((int) $this->id);
+ $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET";
+ $sql .= " name = '".$this->db->escape($this->name)."'";
+ $sql .= " code = '".$this->db->escape($this->code)."'";
+ $sql .= " WHERE rowid = ".((int) $this->id);
$this->db->begin();
@@ -362,8 +362,8 @@ class MultiCurrency extends CommonObject
dol_syslog('Currency::delete '.join(',', $this->errors), LOG_ERR);
}
- $sql = 'DELETE FROM '.MAIN_DB_PREFIX.$this->table_element;
- $sql .= ' WHERE rowid='.((int) $this->id);
+ $sql = "DELETE FROM ".MAIN_DB_PREFIX.$this->table_element;
+ $sql .= " WHERE rowid = ".((int) $this->id);
dol_syslog(__METHOD__, LOG_DEBUG);
$resql = $this->db->query($sql);
@@ -438,7 +438,7 @@ class MultiCurrency extends CommonObject
$currency->code = $code;
$currency->name = $code;
- $sql = 'SELECT label FROM '.MAIN_DB_PREFIX."c_currencies WHERE code_iso = '".$this->db->escape($code)."'";
+ $sql = "SELECT label FROM ".MAIN_DB_PREFIX."c_currencies WHERE code_iso = '".$this->db->escape($code)."'";
dol_syslog(__METHOD__, LOG_DEBUG);
$resql = $this->db->query($sql);
@@ -477,8 +477,8 @@ class MultiCurrency extends CommonObject
*/
public function getRate()
{
- $sql = 'SELECT cr.rowid';
- $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element_line.' as cr';
+ $sql = "SELECT cr.rowid";
+ $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element_line." as cr";
$sql .= " WHERE cr.fk_multicurrency = ".((int) $this->id);
$sql .= " AND cr.date_sync = (SELECT MAX(cr2.date_sync) FROM ".MAIN_DB_PREFIX.$this->table_element_line." AS cr2 WHERE cr2.fk_multicurrency = ".((int) $this->id).")";
@@ -502,7 +502,7 @@ class MultiCurrency extends CommonObject
{
global $conf;
- $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX."multicurrency WHERE code = '".$db->escape($code)."' AND entity = ".$conf->entity;
+ $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."multicurrency WHERE code = '".$db->escape($code)."' AND entity = ".$conf->entity;
dol_syslog(__METHOD__, LOG_DEBUG);
$resql = $db->query($sql);
@@ -527,7 +527,7 @@ class MultiCurrency extends CommonObject
{
global $conf;
- $sql1 = 'SELECT m.rowid, mc.rate FROM '.MAIN_DB_PREFIX.'multicurrency m';
+ $sql1 = "SELECT m.rowid, mc.rate FROM ".MAIN_DB_PREFIX."multicurrency m";
$sql1 .= ' LEFT JOIN '.MAIN_DB_PREFIX.'multicurrency_rate mc ON (m.rowid = mc.fk_multicurrency)';
$sql1 .= " WHERE m.code = '".$db->escape($code)."'";
@@ -537,7 +537,7 @@ class MultiCurrency extends CommonObject
$tmparray = dol_getdate($date_document);
$sql2 .= " AND mc.date_sync <= '".$db->idate(dol_mktime(23, 59, 59, $tmparray['mon'], $tmparray['mday'], $tmparray['year'], true))."'";
}
- $sql3 = ' ORDER BY mc.date_sync DESC LIMIT 1';
+ $sql3 = " ORDER BY mc.date_sync DESC LIMIT 1";
dol_syslog(__METHOD__, LOG_DEBUG);
$resql = $db->query($sql1.$sql2.$sql3);
@@ -591,7 +591,7 @@ class MultiCurrency extends CommonObject
{
global $db;
- $sql = 'SELECT multicurrency_tx FROM '.MAIN_DB_PREFIX.$table.' WHERE rowid = '.((int) $fk_facture);
+ $sql = "SELECT multicurrency_tx FROM ".MAIN_DB_PREFIX.$table." WHERE rowid = ".((int) $fk_facture);
dol_syslog(__METHOD__, LOG_DEBUG);
$resql = $db->query($sql);
@@ -773,7 +773,7 @@ class CurrencyRate extends CommonObjectLine
$now = empty($this->date_sync) ? dol_now() : $this->date_sync;
// Insert request
- $sql = 'INSERT INTO '.MAIN_DB_PREFIX.$this->table_element.'(';
+ $sql = "INSERT INTO ".MAIN_DB_PREFIX.$this->table_element."(";
$sql .= ' rate,';
$sql .= ' date_sync,';
$sql .= ' fk_multicurrency,';
@@ -829,9 +829,9 @@ class CurrencyRate extends CommonObjectLine
{
dol_syslog('CurrencyRate::fetch', LOG_DEBUG);
- $sql = 'SELECT cr.rowid, cr.rate, cr.date_sync, cr.fk_multicurrency, cr.entity';
- $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' AS cr';
- $sql .= ' WHERE cr.rowid = '.((int) $id);
+ $sql = "SELECT cr.rowid, cr.rate, cr.date_sync, cr.fk_multicurrency, cr.entity";
+ $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." AS cr";
+ $sql .= " WHERE cr.rowid = ".((int) $id);
dol_syslog(__METHOD__, LOG_DEBUG);
$resql = $this->db->query($sql);
@@ -878,15 +878,15 @@ class CurrencyRate extends CommonObjectLine
$this->rate = price2num($this->rate);
// Update request
- $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
- $sql .= "SET rate =".((float) $this->rate);
+ $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
+ $sql .= "SET rate = ".((float) $this->rate);
if (!empty($this->date_sync)) {
- $sql .= ", date_sync='".$this->db->idate($this->date_sync)."'";
+ $sql .= ", date_sync = '".$this->db->idate($this->date_sync)."'";
}
if (!empty($this->fk_multicurrency)) {
- $sql .= ', fk_multicurrency='.((int) $this->fk_multicurrency);
+ $sql .= ', fk_multicurrency = '.((int) $this->fk_multicurrency);
}
- $sql .= ' WHERE rowid='.((int) $this->id);
+ $sql .= " WHERE rowid =".((int) $this->id);
$this->db->begin();
diff --git a/htdocs/opensurvey/card.php b/htdocs/opensurvey/card.php
index c32b49ff1a1..19aff377c65 100644
--- a/htdocs/opensurvey/card.php
+++ b/htdocs/opensurvey/card.php
@@ -254,18 +254,6 @@ if ($action == 'edit') {
}
print '';
-// EMail
-//If linked user, then emails are going to be sent to users' email
-if (!$object->fk_user_creat) {
- print ''.$langs->trans("EMail").' ';
- if ($action == 'edit') {
- print ' ';
- } else {
- print dol_print_email($object->mail_admin, 0, 0, 1, 0, 1, 1);
- }
- print ' ';
-}
-
// Receive an email with each vote
print ''.$langs->trans('ToReceiveEMailForEachVote').' ';
if ($action == 'edit') {
@@ -323,10 +311,14 @@ print ' ';
// Author
print '';
print $langs->trans("Author").' ';
-if ($object->fk_user_creat) {
+if ($object->fk_user_creat > 0) {
print $userstatic->getLoginUrl(1);
} else {
- print dol_htmlentities($object->nom_admin);
+ if ($action == 'edit') {
+ print ' ';
+ } else {
+ print dol_print_email($object->mail_admin, 0, 0, 1, 0, 1, 1);
+ }
}
print ' ';
diff --git a/htdocs/opensurvey/wizard/create_survey.php b/htdocs/opensurvey/wizard/create_survey.php
index 30e662be7ea..6ed1f2073d2 100644
--- a/htdocs/opensurvey/wizard/create_survey.php
+++ b/htdocs/opensurvey/wizard/create_survey.php
@@ -170,7 +170,7 @@ if ($_SESSION["mailsonde"]) {
$cochemail = "checked";
}
-print ' '.$langs->trans("ToReceiveEMailForEachVote").' '."\n";
+print ' '.$langs->trans("ToReceiveEMailForEachVote").' '."\n";
if ($_SESSION['allow_comments']) {
$allow_comments = 'checked';
@@ -178,7 +178,7 @@ if ($_SESSION['allow_comments']) {
if (GETPOSTISSET('allow_comments')) {
$allow_comments = GETPOST('allow_comments') ? 'checked' : '';
}
-print ' '.$langs->trans('CanComment').' '."\n";
+print ' '.$langs->trans('CanComment').' '."\n";
if ($_SESSION['allow_spy']) {
$allow_spy = 'checked';
@@ -186,7 +186,7 @@ if ($_SESSION['allow_spy']) {
if (GETPOSTISSET('allow_spy')) {
$allow_spy = GETPOST('allow_spy') ? 'checked' : '';
}
-print ' '.$langs->trans('CanSeeOthersVote').' '."\n";
+print ' '.$langs->trans('CanSeeOthersVote').' '."\n";
if (GETPOST('choix_sondage')) {
if (GETPOST('choix_sondage') == 'date') {
diff --git a/htdocs/product/admin/dynamic_prices.php b/htdocs/product/admin/dynamic_prices.php
index 9a354a8dcdb..e1e23feac86 100644
--- a/htdocs/product/admin/dynamic_prices.php
+++ b/htdocs/product/admin/dynamic_prices.php
@@ -182,9 +182,9 @@ if ($action != 'create_updater' && $action != 'edit_updater') {
print '';
}
} else {
- print '';
+ print ' ';
print $langs->trans("None");
- print ' ';
+ print '';
}
print '';
diff --git a/htdocs/product/card.php b/htdocs/product/card.php
index 80378bd1b2a..b4c951a953f 100644
--- a/htdocs/product/card.php
+++ b/htdocs/product/card.php
@@ -640,7 +640,7 @@ if (empty($reshook)) {
// Fill array 'array_options' with data from add form
- $ret = $extrafields->setOptionalsFromPost(null, $object);
+ $ret = $extrafields->setOptionalsFromPost(null, $object, '@GETPOSTISSET');
if ($ret < 0) {
$error++;
}
diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php
index fd5d8ecf1db..1109c93fad9 100644
--- a/htdocs/product/class/product.class.php
+++ b/htdocs/product/class/product.class.php
@@ -4021,28 +4021,31 @@ class Product extends CommonObject
}
// Check not already father of id_pere (to avoid father -> child -> father links)
- $sql = 'SELECT fk_product_pere from '.MAIN_DB_PREFIX.'product_association';
- $sql .= ' WHERE fk_product_pere = '.((int) $id_fils).' AND fk_product_fils = '.((int) $id_pere);
+ $sql = "SELECT fk_product_pere from ".MAIN_DB_PREFIX."product_association";
+ $sql .= " WHERE fk_product_pere = ".((int) $id_fils)." AND fk_product_fils = ".((int) $id_pere);
if (!$this->db->query($sql)) {
dol_print_error($this->db);
return -1;
} else {
- $result = $this->db->query($sql);
- if ($result) {
- $num = $this->db->num_rows($result);
- if ($num > 0) {
- $this->error = "isFatherOfThis";
+ //Selection of the highest row
+ $sql = "SELECT MAX(rang) as max_rank FROM ".MAIN_DB_PREFIX."product_association";
+ $sql .= " WHERE fk_product_pere = ".((int) $id_pere);
+ $resql = $this->db->query($sql);
+ if ($resql > 0) {
+ $obj = $this->db->fetch_object($resql);
+ $rank = $obj->max_rank + 1;
+ //Addition of a product with the highest rank +1
+ $sql = "INSERT INTO ".MAIN_DB_PREFIX."product_association(fk_product_pere,fk_product_fils,qty,incdec,rang)";
+ $sql .= " VALUES (".((int) $id_pere).", ".((int) $id_fils).", ".price2num($qty, 'MS').", ".price2num($incdec, 'MS').", ".((int) $rank).")";
+ if (! $this->db->query($sql)) {
+ dol_print_error($this->db);
return -1;
} else {
- $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'product_association(fk_product_pere,fk_product_fils,qty,incdec)';
- $sql .= ' VALUES ('.((int) $id_pere).', '.((int) $id_fils).', '.((float) $qty).', '.((int) $incdec).')';
- if (!$this->db->query($sql)) {
- dol_print_error($this->db);
- return -1;
- } else {
- return 1;
- }
+ return 1;
}
+ } else {
+ dol_print_error($this->db);
+ return -1;
}
}
}
@@ -4089,11 +4092,11 @@ class Product extends CommonObject
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
- * Retire le lien entre un sousproduit et un produit/service
+ * Remove a link between a subproduct and a parent product/service
*
- * @param int $fk_parent Id du produit auquel ne sera plus lie le produit lie
- * @param int $fk_child Id du produit a ne plus lie
- * @return int < 0 if KO, > 0 if OK
+ * @param int $fk_parent Id of parent product (child will no more be linked to it)
+ * @param int $fk_child Id of child product
+ * @return int < 0 if KO, > 0 if OK
*/
public function del_sousproduit($fk_parent, $fk_child)
{
@@ -4115,6 +4118,24 @@ class Product extends CommonObject
return -1;
}
+ // Updated ranks so that none are missing
+ $sqlrank = "SELECT rowid, rang FROM ".MAIN_DB_PREFIX."product_association";
+ $sqlrank.= " WHERE fk_product_pere = ".((int) $fk_parent);
+ $sqlrank.= " ORDER BY rang";
+ $resqlrank = $this->db->query($sqlrank);
+ if ($resqlrank) {
+ $cpt = 0;
+ while ($objrank = $this->db->fetch_object($resqlrank)) {
+ $cpt++;
+ $sql = "UPDATE ".MAIN_DB_PREFIX."product_association";
+ $sql.= " SET rang = ".((int) $cpt);
+ $sql.= " WHERE rowid = ".((int) $objrank->rowid);
+ if (! $this->db->query($sql)) {
+ dol_print_error($this->db);
+ return -1;
+ }
+ }
+ }
return 1;
}
@@ -4679,12 +4700,14 @@ class Product extends CommonObject
}
$sql = "SELECT p.rowid, p.ref, p.label as label, p.fk_product_type,";
- $sql .= " pa.qty as qty, pa.fk_product_fils as id, pa.incdec";
+ $sql .= " pa.qty as qty, pa.fk_product_fils as id, pa.incdec,";
+ $sql .= " pa.rowid as fk_association, pa.rang";
$sql .= " FROM ".MAIN_DB_PREFIX."product as p,";
$sql .= " ".MAIN_DB_PREFIX."product_association as pa";
$sql .= " WHERE p.rowid = pa.fk_product_fils";
$sql .= " AND pa.fk_product_pere = ".((int) $id);
$sql .= " AND pa.fk_product_fils <> ".((int) $id); // This should not happens, it is to avoid infinite loop if it happens
+ $sql.= " ORDER BY pa.rang";
dol_syslog(get_class($this).'::getChildsArbo id='.$id.' level='.$level, LOG_DEBUG);
@@ -4711,7 +4734,9 @@ class Product extends CommonObject
2=>$rec['fk_product_type'],
3=>$this->db->escape($rec['label']),
4=>$rec['incdec'],
- 5=>$rec['ref']
+ 5=>$rec['ref'],
+ 6=>$rec['fk_association'],
+ 7=>$rec['rang']
);
//$prods[$this->db->escape($rec['label'])]= array(0=>$rec['id'],1=>$rec['qty'],2=>$rec['fk_product_type']);
//$prods[$this->db->escape($rec['label'])]= array(0=>$rec['id'],1=>$rec['qty']);
@@ -5062,7 +5087,7 @@ class Product extends CommonObject
$langs->load('products');
if (isset($this->finished) && $this->finished >= 0) {
- $sql = 'SELECT label, code FROM '.MAIN_DB_PREFIX.'c_product_nature where code='.((int) $this->finished).' AND active=1';
+ $sql = "SELECT label, code FROM ".MAIN_DB_PREFIX."c_product_nature where code = ".((int) $this->finished)." AND active=1";
$resql = $this->db->query($sql);
if ($resql && $this->db->num_rows($resql) > 0) {
$res = $this->db->fetch_array($resql);
@@ -5108,7 +5133,7 @@ class Product extends CommonObject
$op[1] = "-".trim($nbpiece);
$movementstock = new MouvementStock($this->db);
- $movementstock->setOrigin($origin_element, $origin_id); // Set ->origin and ->origin->id
+ $movementstock->setOrigin($origin_element, $origin_id); // Set ->origin_type and ->origin_id
$result = $movementstock->_create($user, $this->id, $id_entrepot, $op[$movement], $movement, $price, $label, $inventorycode, '', '', '', '', false, 0, $disablestockchangeforsubproduct);
if ($result >= 0) {
@@ -5155,7 +5180,7 @@ class Product extends CommonObject
$op[1] = "-".trim($nbpiece);
$movementstock = new MouvementStock($this->db);
- $movementstock->setOrigin($origin_element, $origin_id);
+ $movementstock->setOrigin($origin_element, $origin_id); // Set ->origin_type and ->fk_origin
$result = $movementstock->_create($user, $this->id, $id_entrepot, $op[$movement], $movement, $price, $label, $inventorycode, '', $dlc, $dluo, $lot, false, 0, $disablestockchangeforsubproduct);
if ($result >= 0) {
@@ -5306,7 +5331,7 @@ class Product extends CommonObject
}
$stock_commande_fournisseur = $this->stats_commande_fournisseur['qty'];
}
- if (((!empty($conf->fournisseur->enabled) && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || !empty($conf->supplier_order->enabled) || !empty($conf->supplier_invoice->enabled)) && empty($conf->reception->enabled)) {
+ if (((!empty($conf->fournisseur->enabled) && empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) || !empty($conf->supplier_order->enabled) || !empty($conf->supplier_invoice->enabled)) && !empty($conf->reception->enabled)) {
$filterStatus = '4';
if (isset($includedraftpoforvirtual)) {
$filterStatus = '0,'.$filterStatus;
diff --git a/htdocs/product/composition/card.php b/htdocs/product/composition/card.php
index 000e5da6cbc..2cecfc84bc4 100644
--- a/htdocs/product/composition/card.php
+++ b/htdocs/product/composition/card.php
@@ -24,7 +24,7 @@
/**
* \file htdocs/product/composition/card.php
* \ingroup product
- * \brief Page de la fiche produit
+ * \brief Page of product file
*/
require '../../main.inc.php';
@@ -132,6 +132,8 @@ if ($action == 'add_prod' && ($user->rights->produit->creer || $user->rights->se
setEventMessages('RecordSaved', null);
}
$action = '';
+ header("Location: ".$_SERVER["PHP_SELF"].'?id='.$object->id);
+ exit;
}
@@ -268,8 +270,18 @@ if ($id > 0 || !empty($ref)) {
$prodsfather = $object->getFather(); // Parent Products
$object->get_sousproduits_arbo(); // Load $object->sousprods
+ $parent_label = $object->label;
$prods_arbo = $object->get_arbo_each_prod();
+ $tmpid = $id;
+ if (! empty($conf->use_javascript_ajax)) {
+ $nboflines = $prods_arbo;
+ $table_element_line='product_association';
+
+ include DOL_DOCUMENT_ROOT . '/core/tpl/ajaxrow.tpl.php';
+ }
+ $id = $tmpid;
+
$nbofsubsubproducts = count($prods_arbo); // This include sub sub product into nb
$prodschild = $object->getChildsArbo($id, 1);
$nbofsubproducts = count($prodschild); // This include only first level of childs
@@ -323,18 +335,29 @@ if ($id > 0 || !empty($ref)) {
print ' ';
print ' ';
- print '';
+ print '';
- print '';
+ print ' ';
+ // Rank
+ print ''.$langs->trans('Rank').' ';
+ // Product ref
print ''.$langs->trans('ComposedProduct').' ';
+ // Product label
print ''.$langs->trans('Label').' ';
+ // Min supplier price
print ''.$langs->trans('MinSupplierPrice').' ';
+ // Min customer price
print ''.$langs->trans('MinCustomerPrice').' ';
+ // Stock
if (!empty($conf->stock->enabled)) {
print ''.$langs->trans('Stock').' ';
}
+ // Qty in kit
print ''.$langs->trans('Qty').' ';
+ // Stoc inc/dev
print ''.$langs->trans('ComposedProductIncDecStock').' ';
+ // Move
+ print ' ';
print ' '."\n";
$totalsell = 0;
@@ -343,12 +366,18 @@ if ($id > 0 || !empty($ref)) {
$productstatic->fetch($value['id']);
if ($value['level'] <= 1) {
- print '';
+ print ' ';
+
+ // Rank
+ print ''.$object->sousprods[$parent_label][$value['id']][7].' ';
$notdefined = 0;
$nb_of_subproduct = $value['nb'];
+ // Product ref
print ''.$productstatic->getNomUrl(1, 'composition').' ';
+
+ // Product label
print ''.$productstatic->label.' ';
// Best buying price
@@ -407,6 +436,9 @@ if ($id > 0 || !empty($ref)) {
print ''.($value['incdec'] == 1 ? 'x' : '').' ';
}
+ // Move action
+ print ' ';
+
print ' '."\n";
} else {
$hide = '';
@@ -414,15 +446,22 @@ if ($id > 0 || !empty($ref)) {
$hide = ' hideobject'; // By default, we do not show this. It makes screen very difficult to understand
}
- print '';
+ print ' ';
//$productstatic->ref=$value['label'];
$productstatic->ref = $value['ref'];
+
+ // Rankd
+ print ' ';
+
+ // Product ref
print '';
for ($i = 0; $i < $value['level']; $i++) {
print ' '; // Add indentation
}
print $productstatic->getNomUrl(1, 'composition').' ';
+
+ // Product label
print ''.$productstatic->label.' ';
// Best buying price
@@ -432,18 +471,36 @@ if ($id > 0 || !empty($ref)) {
print ' ';
print ' ';
+ // Stock
if (!empty($conf->stock->enabled)) {
print ' '; // Real stock
}
+
+ // Qty in kit
print ''.$value['nb'].' ';
+
+ // Inc/dec
+ print ' ';
+
+ // Action move
print ' ';
print ' '."\n";
}
}
+
+ // Total
+
print '';
+
+ // Rank
+ print ' ';
+
+ // Product ref
print ' ';
+
+ // Product label
print ' ';
// Minimum buying price
@@ -475,11 +532,16 @@ if ($id > 0 || !empty($ref)) {
print ' ';
}
- print '';
+ print ' ';
+
+ print '';
if ($user->rights->produit->creer || $user->rights->service->creer) {
print ' ';
}
print ' ';
+
+ print ' ';
+
print ' '."\n";
} else {
$colspan = 8;
diff --git a/htdocs/product/fournisseurs.php b/htdocs/product/fournisseurs.php
index 72af7b6e886..a3ae38184e9 100644
--- a/htdocs/product/fournisseurs.php
+++ b/htdocs/product/fournisseurs.php
@@ -683,7 +683,7 @@ if ($id > 0 || $ref) {
print '';
$currencies = array();
- $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'multicurrency WHERE entity = '.((int) $conf->entity);
+ $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."multicurrency WHERE entity = ".((int) $conf->entity);
$resql = $db->query($sql);
if ($resql) {
$currency = new MultiCurrency($db);
@@ -767,11 +767,6 @@ END;
// Barcode
if (!empty($conf->barcode->enabled)) {
- // Option to define a transport cost on supplier price
- print '';
- print ''.$langs->trans('BarcodeValue').' ';
- print ''.img_picto('', 'barcode', 'class="pictofixedwidth"').' ';
- print ' ';
$formbarcode = new FormBarCode($db);
// Barcode type
@@ -781,6 +776,12 @@ END;
print $formbarcode->selectBarcodeType(($rowid ? $object->supplier_fk_barcode_type : $conf->global->PRODUIT_DEFAULT_BARCODE_TYPE), 'fk_barcode_type', 1);
print '';
print '';
+
+ // Barcode value
+ print '';
+ print ''.$langs->trans('BarcodeValue').' ';
+ print ''.img_picto('', 'barcode', 'class="pictofixedwidth"').' ';
+ print ' ';
}
// Option to define a transport cost on supplier price
@@ -788,7 +789,7 @@ END;
if (!empty($conf->margin->enabled)) {
print '';
print ''.$langs->trans("Charges").' ';
- print ' ';
+ print ' ';
print ' ';
print ' ';
}
@@ -893,7 +894,7 @@ END;
$reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
if (empty($reshook)) {
if ($usercancreate) {
- print '';
+ print ' ';
print $langs->trans("AddSupplierPrice").' ';
}
}
@@ -933,8 +934,8 @@ END;
'pfp.multicurrency_unitprice'=>array('label'=>$langs->trans("UnitPriceHTCurrency"), 'enabled' => $conf->multicurrency->enabled, 'checked'=>0, 'position'=>10),
'pfp.delivery_time_days'=>array('label'=>$langs->trans("NbDaysToDelivery"), 'checked'=>1, 'position'=>13),
'pfp.supplier_reputation'=>array('label'=>$langs->trans("ReputationForThisProduct"), 'checked'=>1, 'position'=>14),
- 'pfp.barcode'=>array('label'=>$langs->trans("BarcodeValue"), 'enabled' => $conf->barcode->enabled, 'checked'=>0, 'position'=>15),
- 'pfp.fk_barcode_type'=>array('label'=>$langs->trans("BarcodeType"), 'enabled' => $conf->barcode->enabled, 'checked'=>0, 'position'=>16),
+ 'pfp.fk_barcode_type'=>array('label'=>$langs->trans("BarcodeType"), 'enabled' => $conf->barcode->enabled, 'checked'=>0, 'position'=>15),
+ 'pfp.barcode'=>array('label'=>$langs->trans("BarcodeValue"), 'enabled' => $conf->barcode->enabled, 'checked'=>0, 'position'=>16),
'pfp.packaging'=>array('label'=>$langs->trans("PackagingForThisProduct"), 'enabled' => !empty($conf->global->PRODUCT_USE_SUPPLIER_PACKAGING), 'checked'=>0, 'position'=>17),
'pfp.tms'=>array('label'=>$langs->trans("DateModification"), 'enabled' => $conf->barcode->enabled, 'checked'=>1, 'position'=>18),
);
@@ -1007,12 +1008,12 @@ END;
if (!empty($arrayfields['pfp.supplier_reputation']['checked'])) {
print_liste_field_titre("ReputationForThisProduct", $_SERVER["PHP_SELF"], "pfp.supplier_reputation", "", $param, '', $sortfield, $sortorder, 'center ');
}
- if (!empty($arrayfields['pfp.barcode']['checked'])) {
- print_liste_field_titre("BarcodeValue", $_SERVER["PHP_SELF"], "pfp.barcode", "", $param, '', $sortfield, $sortorder, 'center ');
- }
if (!empty($arrayfields['pfp.fk_barcode_type']['checked'])) {
print_liste_field_titre("BarcodeType", $_SERVER["PHP_SELF"], "pfp.fk_barcode_type", "", $param, '', $sortfield, $sortorder, 'center ');
}
+ if (!empty($arrayfields['pfp.barcode']['checked'])) {
+ print_liste_field_titre("BarcodeValue", $_SERVER["PHP_SELF"], "pfp.barcode", "", $param, '', $sortfield, $sortorder, 'center ');
+ }
if (!empty($arrayfields['pfp.packaging']['checked'])) {
print_liste_field_titre("PackagingForThisProduct", $_SERVER["PHP_SELF"], "pfp.packaging", "", $param, 'align="center"', $sortfield, $sortorder);
}
@@ -1152,13 +1153,6 @@ END;
print'';
}
- // Barcode
- if (!empty($arrayfields['pfp.barcode']['checked'])) {
- print '';
- print $productfourn->supplier_barcode;
- print ' ';
- }
-
// Barcode type
if (!empty($arrayfields['pfp.fk_barcode_type']['checked'])) {
print '';
@@ -1168,6 +1162,13 @@ END;
print ' ';
}
+ // Barcode
+ if (!empty($arrayfields['pfp.barcode']['checked'])) {
+ print '';
+ print $productfourn->supplier_barcode;
+ print ' ';
+ }
+
// Packaging
if (!empty($arrayfields['pfp.packaging']['checked'])) {
print '';
diff --git a/htdocs/product/price.php b/htdocs/product/price.php
index 49ffd69fd0b..773a097fed8 100644
--- a/htdocs/product/price.php
+++ b/htdocs/product/price.php
@@ -1161,7 +1161,7 @@ if (!$action || $action == 'delete' || $action == 'showlog_customer_price' || $a
if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES)) {
if ($user->rights->produit->creer || $user->rights->service->creer) {
- print '';
+ print '';
}
}
diff --git a/htdocs/product/stock/class/api_stockmovements.class.php b/htdocs/product/stock/class/api_stockmovements.class.php
index 42a03a1836a..19f23edd4f4 100644
--- a/htdocs/product/stock/class/api_stockmovements.class.php
+++ b/htdocs/product/stock/class/api_stockmovements.class.php
@@ -165,11 +165,13 @@ class StockMovements extends DolibarrApi
* @param string $price To update AWP (Average Weighted Price) when you make a stock increase (qty must be higher then 0). {@from body}
* @param string $dlc Eat-by date. {@from body} {@type date}
* @param string $dluo Sell-by date. {@from body} {@type date}
+ * @param string $origin_type Origin type (Element of source object, like 'project', 'inventory', ...)
+ * @param string $origin_id Origin id (Id of source object)
*
* @return int ID of stock movement
* @throws RestException
*/
- public function post($product_id, $warehouse_id, $qty, $lot = '', $movementcode = '', $movementlabel = '', $price = '', $dlc = '', $dluo = '')
+ public function post($product_id, $warehouse_id, $qty, $lot = '', $movementcode = '', $movementlabel = '', $price = '', $dlc = '', $dluo = '', $origin_type = '', $origin_id = 0)
{
if (!DolibarrApiAccess::$user->rights->stock->creer) {
throw new RestException(401);
@@ -189,6 +191,7 @@ class StockMovements extends DolibarrApi
$eatBy = empty($dluo) ? '' : dol_stringtotime($dluo);
$sellBy = empty($dlc) ? '' : dol_stringtotime($dlc);
+ $this->stockmovement->setOrigin($origin_type, $origin_id);
if ($this->stockmovement->_create(DolibarrApiAccess::$user, $product_id, $warehouse_id, $qty, $type, $price, $movementlabel, $movementcode, '', $eatBy, $sellBy, $lot) <= 0) {
$errormessage = $this->stockmovement->error;
if (empty($errormessage)) {
diff --git a/htdocs/product/stock/class/entrepot.class.php b/htdocs/product/stock/class/entrepot.class.php
index 37f6f76d216..991ec70b6aa 100644
--- a/htdocs/product/stock/class/entrepot.class.php
+++ b/htdocs/product/stock/class/entrepot.class.php
@@ -819,7 +819,7 @@ class Entrepot extends CommonObject
$parentid = $this->fk_parent; // If parent_id not defined on current object, we do not start consecutive searches of parents
$i = 0;
while ($parentid > 0 && $i < $protection) {
- $sql = 'SELECT fk_parent FROM '.MAIN_DB_PREFIX.'entrepot WHERE rowid = '.((int) $parentid);
+ $sql = "SELECT fk_parent FROM ".MAIN_DB_PREFIX."entrepot WHERE rowid = ".((int) $parentid);
$resql = $this->db->query($sql);
if ($resql) {
$objarbo = $this->db->fetch_object($resql);
diff --git a/htdocs/product/stock/class/mouvementstock.class.php b/htdocs/product/stock/class/mouvementstock.class.php
index dd1b2202956..3a43d9ee6bb 100644
--- a/htdocs/product/stock/class/mouvementstock.class.php
+++ b/htdocs/product/stock/class/mouvementstock.class.php
@@ -54,8 +54,10 @@ class MouvementStock extends CommonObject
/**
* @var int Type of movement
- * 0=input (stock increase by a stock transfer), 1=output (stock decrease after by a stock transfer),
- * 2=output (stock decrease), 3=input (stock increase)
+ * 0=input (stock increase by a manual/direct stock transfer, correction or inventory),
+ * 1=output (stock decrease after by a manual/direct stock transfer, correction or inventory),
+ * 2=output (stock decrease after a business event like sale, shipment or manufacturing, ...),
+ * 3=input (stock increase after a business event like purchase, reception or manufacturing, ...)
* Note that qty should be > 0 with 0 or 3, < 0 with 1 or 2.
*/
public $type;
@@ -76,18 +78,32 @@ class MouvementStock extends CommonObject
/**
* @var int ID
+ * @deprecated
+ * @see $origin_id
*/
public $fk_origin;
+ /**
+ * @var int Origin id
+ */
+ public $origin_id;
+
+ /**
+ * @var string origintype
+ * @deprecated
+ * see $origin_type
+ */
public $origintype;
+ /**
+ * @var string Origin type ('project', ...)
+ */
+ public $origin_type;
+
+
public $inventorycode;
public $batch;
- /**
- * @var Object Object set as origin before calling livraison() or reception()
- */
- public $origin;
public $fields = array(
'rowid' =>array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>10, 'showoncombobox'=>1),
@@ -127,7 +143,7 @@ class MouvementStock extends CommonObject
/**
* Add a movement of stock (in one direction only).
* This is the lowest level method to record a stock change.
- * $this->origin can be also be set to save the source object of movement.
+ * $this->origin_type and $this->origin_id can be also be set to save the source object of movement.
*
* @param User $user User object
* @param int $fk_product Id of product
@@ -403,25 +419,20 @@ class MouvementStock extends CommonObject
}
if ($movestock) { // Change stock for current product, change for subproduct is done after
- // Set $origintype, fk_origin, fk_project
- $fk_project = 0;
- if (!empty($this->origin)) { // This is set by caller for tracking reason
- $origintype = empty($this->origin->origin_type) ? $this->origin->element : $this->origin->origin_type;
- $fk_origin = $this->origin->id;
- if ($origintype == 'project') {
- $fk_project = $fk_origin;
- } else {
- $res = $this->origin->fetch($fk_origin);
- if ($res > 0) {
- if (!empty($this->origin->fk_project)) {
- $fk_project = $this->origin->fk_project;
- }
- }
+ // Set $origin_type, origin_id and fk_project
+ $fk_project = $this->fk_project;
+ if (!empty($this->origin_type)) { // This is set by caller for tracking reason
+ $origin_type = $this->origin_type;
+ $origin_id = $this->origin_id;
+ if (empty($fk_project) && $origin_type == 'project') {
+ $fk_project = $origin_id;
+ $origin_type = '';
+ $origin_id = 0;
}
} else {
- $origintype = '';
- $fk_origin = 0;
$fk_project = 0;
+ $origin_type = '';
+ $origin_id = 0;
}
$sql = "INSERT INTO ".MAIN_DB_PREFIX."stock_mouvement(";
@@ -437,8 +448,8 @@ class MouvementStock extends CommonObject
$sql .= " '".$this->db->escape($label)."',";
$sql .= " ".($inventorycode ? "'".$this->db->escape($inventorycode)."'" : "null").",";
$sql .= " ".((float) price2num($price)).",";
- $sql .= " ".((int) $fk_origin).",";
- $sql .= " '".$this->db->escape($origintype)."',";
+ $sql .= " ".((int) $origin_id).",";
+ $sql .= " '".$this->db->escape($origin_type)."',";
$sql .= " ".((int) $fk_project);
$sql .= ")";
@@ -626,8 +637,8 @@ class MouvementStock extends CommonObject
$sql .= " t.type_mouvement,";
$sql .= " t.fk_user_author,";
$sql .= " t.label,";
- $sql .= " t.fk_origin,";
- $sql .= " t.origintype,";
+ $sql .= " t.fk_origin as origin_id,";
+ $sql .= " t.origintype as origin_type,";
$sql .= " t.inventorycode,";
$sql .= " t.batch,";
$sql .= " t.eatby,";
@@ -654,8 +665,10 @@ class MouvementStock extends CommonObject
$this->price = $obj->price;
$this->fk_user_author = $obj->fk_user_author;
$this->label = $obj->label;
- $this->fk_origin = $obj->fk_origin;
- $this->origintype = $obj->origintype;
+ $this->fk_origin = $obj->origin_id; // For backward compatibility
+ $this->origintype = $obj->origin_type; // For backward compatibility
+ $this->origin_id = $obj->origin_id;
+ $this->origin_type = $obj->origin_type;
$this->inventorycode = $obj->inventorycode;
$this->batch = $obj->batch;
$this->eatby = $this->db->jdate($obj->eatby);
@@ -730,6 +743,7 @@ class MouvementStock extends CommonObject
foreach ($pids as $key => $value) {
if (!$error) {
$tmpmove = dol_clone($this, 1);
+
$result = $tmpmove->_create($user, $pids[$key], $entrepot_id, ($qty * $pqtys[$key]), $type, 0, $label, $inventorycode); // This will also call _createSubProduct making this recursive
if ($result < 0) {
$this->error = $tmpmove->error;
@@ -921,16 +935,16 @@ class MouvementStock extends CommonObject
/**
* Return Url link of origin object
*
- * @param int $fk_origin Id origin
- * @param int $origintype Type origin
+ * @param int $origin_id Id origin
+ * @param int $origin_type Type origin
* @return string
*/
- public function get_origin($fk_origin, $origintype)
+ public function get_origin($origin_id, $origin_type)
{
// phpcs:enable
$origin = '';
- switch ($origintype) {
+ switch ($origin_type) {
case 'commande':
require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
$origin = new Commande($this->db);
@@ -973,11 +987,11 @@ class MouvementStock extends CommonObject
break;
default:
- if ($origintype) {
+ if ($origin_type) {
// Separate originetype with "@" : left part is class name, right part is module name
- $origintype_array = explode('@', $origintype);
- $classname = ucfirst($origintype_array[0]);
- $modulename = empty($origintype_array[1]) ? $classname : $origintype_array[1];
+ $origin_type_array = explode('@', $origin_type);
+ $classname = ucfirst($origin_type_array[0]);
+ $modulename = empty($origin_type_array[1]) ? $classname : $origin_type_array[1];
$result = dol_include_once('/'.$modulename.'/class/'.strtolower($classname).'.class.php');
if ($result) {
$classname = ucfirst($classname);
@@ -991,7 +1005,7 @@ class MouvementStock extends CommonObject
return '';
}
- if ($origin->fetch($fk_origin) > 0) {
+ if ($origin->fetch($origin_id) > 0) {
return $origin->getNomUrl(1);
}
@@ -999,29 +1013,20 @@ class MouvementStock extends CommonObject
}
/**
- * Set attribute origin to object
+ * Set attribute origin_type and fk_origin to object
*
- * @param string $origin_element type of element
- * @param int $origin_id id of element
+ * @param string $origin_element Type of element
+ * @param int $origin_id Id of element
*
* @return void
*/
public function setOrigin($origin_element, $origin_id)
{
- if (!empty($origin_element) && $origin_id > 0) {
- $origin = '';
- if ($origin_element == 'project') {
- if (!class_exists('Project')) {
- require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
- }
- $origin = new Project($this->db);
- }
-
- if (!empty($origin)) {
- $this->origin = $origin;
- $this->origin->id = $origin_id;
- }
- }
+ $this->origin_type = $origin_element;
+ $this->origin_id = $origin_id;
+ // For backward compatibility
+ $this->origintype = $origin_element;
+ $this->fk_origin = $origin_id;
}
diff --git a/htdocs/projet/class/api_tasks.class.php b/htdocs/projet/class/api_tasks.class.php
index e3d6af2de53..9366422002d 100644
--- a/htdocs/projet/class/api_tasks.class.php
+++ b/htdocs/projet/class/api_tasks.class.php
@@ -454,7 +454,7 @@ class Tasks extends DolibarrApi
throw new RestException(404, 'Task not found');
}
- if (!DolibarrApi::_checkAccessToResource('tasks', $this->project->id)) {
+ if (!DolibarrApi::_checkAccessToResource('task', $this->task->id)) {
throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
}
foreach ($request_data as $field => $value) {
@@ -488,7 +488,7 @@ class Tasks extends DolibarrApi
throw new RestException(404, 'Task not found');
}
- if (!DolibarrApi::_checkAccessToResource('tasks', $this->project->id)) {
+ if (!DolibarrApi::_checkAccessToResource('task', $this->task->id)) {
throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
}
diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php
index af1fb65337b..368fb3c2982 100644
--- a/htdocs/projet/class/project.class.php
+++ b/htdocs/projet/class/project.class.php
@@ -706,9 +706,9 @@ class Project extends CommonObject
} elseif ($type == 'project_task_time') { // Case we want to duplicate line foreach user
$sql = "SELECT DISTINCT pt.rowid, ptt.fk_user FROM ".MAIN_DB_PREFIX."projet_task as pt, ".MAIN_DB_PREFIX."projet_task_time as ptt WHERE pt.rowid = ptt.fk_task AND pt.fk_projet IN (".$this->db->sanitize($ids).")";
} elseif ($type == 'stock_mouvement') {
- $sql = 'SELECT ms.rowid, ms.fk_user_author as fk_user FROM '.MAIN_DB_PREFIX."stock_mouvement as ms, ".MAIN_DB_PREFIX."entrepot as e WHERE e.rowid = ms.fk_entrepot AND e.entity IN (".getEntity('stock').") AND ms.origintype = 'project' AND ms.fk_origin IN (".$this->db->sanitize($ids).") AND ms.type_mouvement = 1";
+ $sql = "SELECT ms.rowid, ms.fk_user_author as fk_user FROM ".MAIN_DB_PREFIX."stock_mouvement as ms, ".MAIN_DB_PREFIX."entrepot as e WHERE e.rowid = ms.fk_entrepot AND e.entity IN (".getEntity('stock').") AND ms.origintype = 'project' AND ms.fk_origin IN (".$this->db->sanitize($ids).") AND ms.type_mouvement = 1";
} elseif ($type == 'loan') {
- $sql = 'SELECT l.rowid, l.fk_user_author as fk_user FROM '.MAIN_DB_PREFIX."loan as l WHERE l.entity IN (".getEntity('loan').") AND l.fk_projet IN (".$this->db->sanitize($ids).")";
+ $sql = "SELECT l.rowid, l.fk_user_author as fk_user FROM ".MAIN_DB_PREFIX."loan as l WHERE l.entity IN (".getEntity('loan').") AND l.fk_projet IN (".$this->db->sanitize($ids).")";
} else {
$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX.$tablename." WHERE ".$projectkey." IN (".$this->db->sanitize($ids).") AND entity IN (".getEntity($type).")";
}
@@ -952,9 +952,9 @@ class Project extends CommonObject
} elseif ($type == 'project_task_time') { // Case we want to duplicate line foreach user
$sql = "SELECT DISTINCT COUNT(pt.rowid) as nb FROM ".MAIN_DB_PREFIX."projet_task as pt, ".MAIN_DB_PREFIX."projet_task_time as ptt WHERE pt.rowid = ptt.fk_task AND pt.fk_projet = ".((int) $this->id);
} elseif ($type == 'stock_mouvement') {
- $sql = 'SELECT COUNT(ms.rowid) as nb FROM '.MAIN_DB_PREFIX."stock_mouvement as ms, ".MAIN_DB_PREFIX."entrepot as e WHERE e.rowid = ms.fk_entrepot AND e.entity IN (".getEntity('stock').") AND ms.origintype = 'project' AND ms.fk_origin = ".((int) $this->id)." AND ms.type_mouvement = 1";
+ $sql = "SELECT COUNT(ms.rowid) as nb FROM ".MAIN_DB_PREFIX."stock_mouvement as ms, ".MAIN_DB_PREFIX."entrepot as e WHERE e.rowid = ms.fk_entrepot AND e.entity IN (".getEntity('stock').") AND ms.origintype = 'project' AND ms.fk_origin = ".((int) $this->id)." AND ms.type_mouvement = 1";
} elseif ($type == 'loan') {
- $sql = 'SELECT COUNT(l.rowid) as nb FROM '.MAIN_DB_PREFIX."loan as l WHERE l.entity IN (".getEntity('loan').") AND l.fk_projet = ".((int) $this->id);
+ $sql = "SELECT COUNT(l.rowid) as nb FROM ".MAIN_DB_PREFIX."loan as l WHERE l.entity IN (".getEntity('loan').") AND l.fk_projet = ".((int) $this->id);
} else {
$sql = "SELECT COUNT(rowid) as nb FROM ".MAIN_DB_PREFIX.$tablename." WHERE ".$projectkey." = ".((int) $this->id)." AND entity IN (".getEntity($type).")";
}
diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php
index 37019d85274..83f27c11796 100644
--- a/htdocs/projet/tasks/time.php
+++ b/htdocs/projet/tasks/time.php
@@ -1089,6 +1089,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0) {
print ' ';
print ' ';
print ' ';
+ print ' ';
// Form to convert time spent into invoice
if ($massaction == 'generateinvoice') {
diff --git a/htdocs/public/members/new.php b/htdocs/public/members/new.php
index b6498ca4032..c00c1d70367 100644
--- a/htdocs/public/members/new.php
+++ b/htdocs/public/members/new.php
@@ -381,7 +381,7 @@ if (empty($reshook) && $action == 'add') {
$urlback = $conf->global->MEMBER_URL_REDIRECT_SUBSCRIPTION;
// TODO Make replacement of __AMOUNT__, etc...
} else {
- $urlback = $_SERVER["PHP_SELF"]."?action=added";
+ $urlback = $_SERVER["PHP_SELF"]."?action=added&token=".newToken();
}
if (!empty($conf->global->MEMBER_NEWFORM_PAYONLINE) && $conf->global->MEMBER_NEWFORM_PAYONLINE != '-1') {
diff --git a/htdocs/public/project/new.php b/htdocs/public/project/new.php
index ca7101a3679..1d673991d3d 100644
--- a/htdocs/public/project/new.php
+++ b/htdocs/public/project/new.php
@@ -311,7 +311,7 @@ if (empty($reshook) && $action == 'add') {
$urlback = $conf->global->PROJECT_URL_REDIRECT_LEAD;
// TODO Make replacement of __AMOUNT__, etc...
} else {
- $urlback = $_SERVER["PHP_SELF"]."?action=added";
+ $urlback = $_SERVER["PHP_SELF"]."?action=added&token=".newToken();
}
if (!empty($entity)) {
diff --git a/htdocs/reception/class/reception.class.php b/htdocs/reception/class/reception.class.php
index 278263669ea..b88f5519c3f 100644
--- a/htdocs/reception/class/reception.class.php
+++ b/htdocs/reception/class/reception.class.php
@@ -948,9 +948,10 @@ class Reception extends CommonObject
}
if (!$error) {
- $main = MAIN_DB_PREFIX.'commande_fournisseur_dispatch';
- $ef = $main."_extrafields";
- $sqlef = "DELETE FROM $ef WHERE fk_object IN (SELECT rowid FROM $main WHERE fk_reception = ".((int) $this->id).")";
+ $main = MAIN_DB_PREFIX.'commande_fournisseur_dispatch';
+ $ef = $main."_extrafields";
+
+ $sqlef = "DELETE FROM ".$ef." WHERE fk_object IN (SELECT rowid FROM ".$main." WHERE fk_reception = ".((int) $this->id).")";
$sql = "DELETE FROM ".MAIN_DB_PREFIX."commande_fournisseur_dispatch";
$sql .= " WHERE fk_reception = ".((int) $this->id);
@@ -1044,7 +1045,8 @@ class Reception extends CommonObject
{
// phpcs:enable
dol_include_once('/fourn/class/fournisseur.commande.dispatch.class.php');
- $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'commande_fournisseur_dispatch WHERE fk_reception='.((int) $this->id);
+
+ $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."commande_fournisseur_dispatch WHERE fk_reception = ".((int) $this->id);
$resql = $this->db->query($sql);
if (!empty($resql)) {
diff --git a/htdocs/reception/list.php b/htdocs/reception/list.php
index b7f3f577ce2..f32e09aa580 100644
--- a/htdocs/reception/list.php
+++ b/htdocs/reception/list.php
@@ -618,11 +618,13 @@ if ($search_ref_supplier) {
$param .= "&search_ref_supplier=".urlencode($search_ref_supplier);
}
// Add $param from extra fields
-foreach ($search_array_options as $key => $val) {
- $crit = $val;
- $tmpkey = preg_replace('/search_options_/', '', $key);
- if ($val != '') {
- $param .= '&search_options_'.$tmpkey.'='.urlencode($val);
+if ($search_array_options) {
+ foreach ($search_array_options as $key => $val) {
+ $crit = $val;
+ $tmpkey = preg_replace('/search_options_/', '', $key);
+ if ($val != '') {
+ $param .= '&search_options_' . $tmpkey . '=' . urlencode($val);
+ }
}
}
diff --git a/htdocs/salaries/paiement_salary.php b/htdocs/salaries/paiement_salary.php
index 9f9a1ae7b50..b1e03866d7e 100644
--- a/htdocs/salaries/paiement_salary.php
+++ b/htdocs/salaries/paiement_salary.php
@@ -18,7 +18,7 @@
*/
/**
- * \file htdocs/compta/paiement_salary.php
+ * \file htdocs/salaries/paiement_salary.php
* \ingroup salary
* \brief Page to add payment of a salary
*/
diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php
index 16bcfdfb52f..6a77430ed46 100644
--- a/htdocs/societe/class/societe.class.php
+++ b/htdocs/societe/class/societe.class.php
@@ -2581,13 +2581,13 @@ class Societe extends CommonObject
$label .= ' '.$this->getLibStatut(5);
}
- if (!empty($this->name)) {
- $label .= ''.$langs->trans('Name').': '.dol_escape_htmltag($this->name);
- if (!empty($this->name_alias)) {
- $label .= ' ('.dol_escape_htmltag($this->name_alias).')';
- }
+ $label .= ''.$langs->trans('Name').': '.dol_escape_htmltag($this->name);
+ if (!empty($this->name_alias)) {
+ $label .= ' ('.dol_escape_htmltag($this->name_alias).')';
+ }
+ if ($this->email) {
+ $label .= ' '.img_picto('', 'email', 'class="pictofixedwidth"').$this->email;
}
- $label .= ' '.img_picto('', 'email', 'class="pictofixedwidth"').$this->email;
if (!empty($this->phone) || !empty($this->fax)) {
$phonelist = array();
if ($this->phone) {
@@ -3749,7 +3749,7 @@ class Societe extends CommonObject
public function has_projects()
{
// phpcs:enable
- $sql = 'SELECT COUNT(*) as numproj FROM '.MAIN_DB_PREFIX.'projet WHERE fk_soc = '.((int) $this->id);
+ $sql = "SELECT COUNT(*) as numproj FROM ".MAIN_DB_PREFIX."projet WHERE fk_soc = ".((int) $this->id);
$resql = $this->db->query($sql);
if ($resql) {
$obj = $this->db->fetch_object($resql);
diff --git a/htdocs/societe/consumption.php b/htdocs/societe/consumption.php
index 5f996e6f37d..b5a7b5cd8ea 100644
--- a/htdocs/societe/consumption.php
+++ b/htdocs/societe/consumption.php
@@ -686,7 +686,7 @@ if ($sql_select) {
print_liste_field_titre('Quantity', $_SERVER['PHP_SELF'], 'prod_qty', '', $param, '', $sortfield, $sortorder, 'right ');
print "\n";
- print ' '.$langs->trans("SelectElementAndClick", $langs->transnoentitiesnoconv("Search")).' ';
+ print ''.$langs->trans("SelectElementAndClick", $langs->transnoentitiesnoconv("Search")).' ';
print "
";
} else {
@@ -694,7 +694,7 @@ if ($sql_select) {
print ''."\n";
- print ''.$langs->trans("FeatureNotYetAvailable").' ';
+ print ''.$langs->trans("FeatureNotYetAvailable").' ';
print "
";
}
diff --git a/htdocs/societe/paymentmodes.php b/htdocs/societe/paymentmodes.php
index f80bebd9bf5..49ec346ec3f 100644
--- a/htdocs/societe/paymentmodes.php
+++ b/htdocs/societe/paymentmodes.php
@@ -1227,7 +1227,7 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard'
if ($nbremote == 0 && $nblocal == 0) {
$colspan = (!empty($conf->global->STRIPE_ALLOW_LOCAL_CARD) ? 10 : 9);
- print ''.$langs->trans("None").' ';
+ print '>'.$langs->trans("None").' ';
}
print "
";
print "";
diff --git a/htdocs/societe/price.php b/htdocs/societe/price.php
index c29717f002d..21dd3b9643b 100644
--- a/htdocs/societe/price.php
+++ b/htdocs/societe/price.php
@@ -525,7 +525,7 @@ if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES)) {
print "\n".''."\n";
if ($user->rights->produit->creer || $user->rights->service->creer) {
- print '
';
+ print '
';
}
print "\n
\n";
diff --git a/htdocs/takepos/admin/receipt.php b/htdocs/takepos/admin/receipt.php
index ec05dd89796..1fe95ff57d8 100644
--- a/htdocs/takepos/admin/receipt.php
+++ b/htdocs/takepos/admin/receipt.php
@@ -44,8 +44,8 @@ $langs->loadLangs(array("admin", "cashdesk", "commercial"));
if (GETPOST('action', 'alpha') == 'set') {
$db->begin();
- $res = dolibarr_set_const($db, "TAKEPOS_HEADER", GETPOST('TAKEPOS_HEADER', 'alpha'), 'chaine', 0, '', $conf->entity);
- $res = dolibarr_set_const($db, "TAKEPOS_FOOTER", GETPOST('TAKEPOS_FOOTER', 'alpha'), 'chaine', 0, '', $conf->entity);
+ $res = dolibarr_set_const($db, "TAKEPOS_HEADER", GETPOST('TAKEPOS_HEADER', 'restricthtml'), 'chaine', 0, '', $conf->entity);
+ $res = dolibarr_set_const($db, "TAKEPOS_FOOTER", GETPOST('TAKEPOS_FOOTER', 'restricthtml'), 'chaine', 0, '', $conf->entity);
$res = dolibarr_set_const($db, "TAKEPOS_RECEIPT_NAME", GETPOST('TAKEPOS_RECEIPT_NAME', 'alpha'), 'chaine', 0, '', $conf->entity);
$res = dolibarr_set_const($db, "TAKEPOS_SHOW_CUSTOMER", GETPOST('TAKEPOS_SHOW_CUSTOMER', 'alpha'), 'chaine', 0, '', $conf->entity);
$res = dolibarr_set_const($db, "TAKEPOS_AUTO_PRINT_TICKETS", GETPOST('TAKEPOS_AUTO_PRINT_TICKETS', 'int'), 'int', 0, '', $conf->entity);
diff --git a/htdocs/takepos/floors.php b/htdocs/takepos/floors.php
index b3ba955f4e8..64040a24466 100644
--- a/htdocs/takepos/floors.php
+++ b/htdocs/takepos/floors.php
@@ -212,9 +212,9 @@ $( document ).ready(function() {
admin) {?>
&place="+place+"&idproduct="+idproduct+"&selectedline="+selectedline, function() {
global->TAKEPOS_CUSTOMER_DISPLAY)) echo "CustomerDisplay();";?>
});
}
diff --git a/htdocs/takepos/invoice.php b/htdocs/takepos/invoice.php
index ad5d8f9fbd2..8b2e5ca78b7 100644
--- a/htdocs/takepos/invoice.php
+++ b/htdocs/takepos/invoice.php
@@ -1056,12 +1056,12 @@ function DolibarrTakeposPrinting(id) {
}
function CreditNote() {
- $("#poslines").load("invoice.php?action=creditnote&invoiceid="+placeid, function() {
+ $("#poslines").load("invoice.php?action=creditnote&token=&invoiceid="+placeid, function() {
});
}
function SetNote() {
- $("#poslines").load("invoice.php?action=addnote&invoiceid="+placeid+"&idline="+selectedline+"&addnote="+$("#textinput").val(), function() {
+ $("#poslines").load("invoice.php?action=addnote&token=&invoiceid="+placeid+"&idline="+selectedline+"&addnote="+$("#textinput").val(), function() {
});
}
diff --git a/htdocs/takepos/phone.php b/htdocs/takepos/phone.php
index 7eaa4d9ec68..b655d9f7789 100644
--- a/htdocs/takepos/phone.php
+++ b/htdocs/takepos/phone.php
@@ -238,10 +238,10 @@ function AddProductConfirm(placeid, productid){
place=placeid;
diff --git a/htdocs/takepos/receipt.php b/htdocs/takepos/receipt.php
index d978d2ac792..627a6c99565 100644
--- a/htdocs/takepos/receipt.php
+++ b/htdocs/takepos/receipt.php
@@ -119,7 +119,7 @@ if (!empty($conf->global->TAKEPOS_HEADER) || !empty($conf->global->{$constFreeTe
if (!empty($conf->global->{$constFreeText})) {
$newfreetext .= make_substitutions($conf->global->{$constFreeText}, $substitutionarray);
}
- print $newfreetext;
+ print nl2br($newfreetext);
}
?>
diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php
index 708870eeaa6..308114e89a7 100644
--- a/htdocs/theme/eldy/global.inc.php
+++ b/htdocs/theme/eldy/global.inc.php
@@ -13,7 +13,7 @@
--colorbacktitle1: rgb();
--colorbacktabcard1: rgb();
--colorbacktabactive: rgb();
- --colorbacklineimpair1: rgb();
+ --colorbacklinepair1: rgb();
--colorbacklineimpair2: rgb();
--colorbacklinepair1: rgb();
--colorbacklinepair2: rgb();
@@ -28,8 +28,9 @@
--colortexttitlelink: rgba(, 0.9);
--colortext: rgb();
--colortextlink: rgb();
- --colortextbackhmenu: #;
+ --colortextbackhmenu: #;
--colortextbackvmenu: #;
+ --colortopbordertitle1: rgb();
--listetotal: #888888;
--inputbackgroundcolor: #FFF;
--inputbordercolor: rgba(0,0,0,.2);
@@ -1737,6 +1738,20 @@ td.showDragHandle {
display: inline-block;
}
+/*
+.classforhorizontalscrolloftabs .fiche .div-table-responsive
+{
+ transform:rotateX(180deg);
+ -ms-transform:rotateX(180deg);
+ -webkit-transform:rotateX(180deg);
+}
+.classforhorizontalscrolloftabs .fiche .div-table-responsive-inside
+{
+ transform:rotateX(180deg);
+ -ms-transform:rotateX(180deg);
+ -webkit-transform:rotateX(180deg);
+}
+*/
global->THEME_DISABLE_STICKY_TOPMENU)) { ?>
@@ -1847,10 +1862,11 @@ div.vmenu, td.vmenu {
display: none;
}
- /* if no side-nav, we don't need to have width forced */
+ /* if no side-nav, we don't need to have width forced to calc(100% - 210px); */
.classforhorizontalscrolloftabs #id-right {
- width: unset;
- display: unset;
+ width: 100%;
+ /* width: unset; */
+ /* display: unset; */
}
body.sidebar-collapse .login_block {
@@ -2222,12 +2238,12 @@ img.photorefnoborder {
.underrefbanner {
}
.underbanner {
- border-bottom: px solid rgb();
+ border-bottom: px solid var(--colortopbordertitle1);
/* border-bottom: 2px solid var(--colorbackhmenu1); */
}
.trextrafieldseparator td, .trextrafields_collapse_last td {
/* border-bottom: 2px solid var(--colorbackhmenu1) !important; */
- border-bottom: 2px solid rgb() !important;
+ border-bottom: 2px solid var(--colortopbordertitle1) !important;
}
.tdhrthin {
@@ -3364,10 +3380,10 @@ td.border, div.tagtable div div.border {
border-bottom: none !important;
}
.bordertop {
- border-top: 1px solid rgb();
+ border-top: 1px solid var(--colortopbordertitle1);
}
.borderbottom {
- border-bottom: 1px solid rgb();
+ border-bottom: 1px solid var(--colortopbordertitle1);
}
@@ -3379,10 +3395,15 @@ table.liste, table.noborder, table.formdoc, div.noborder {
border-collapse: separate !important;
border-spacing: 0px;
border-top-width: px;
- border-top-color: rgb();
+ border-top-color: var(--colortopbordertitle1);
border-top-style: solid;
margin: 0px 0px 5px 0px;
+
+ border-left: 1px solid var(--colortopbordertitle1);
+ border-right: 1px solid var(--colortopbordertitle1);
+
/*width: calc(100% - 7px);
border-collapse: separate !important;
border-spacing: 0px;
@@ -3395,20 +3416,20 @@ table.liste, table.noborder, table.formdoc, div.noborder {
}
#tablelines {
border-bottom-width: 1px;
- border-bottom-color: rgb();
+ border-bottom-color: var(--colortopbordertitle1);
border-bottom-style: solid;
}
table.liste tr:last-of-type td, table.noborder:not(#tablelines) tr:last-of-type td, table.formdoc tr:last-of-type td, div.noborder tr:last-of-type td {
border-bottom-width: 1px;
- border-bottom-color: rgb();
+ border-bottom-color: var(--colortopbordertitle1);
border-bottom-style: solid;
}
div.tabBar div.fichehalfright table.noborder:not(.margintable):not(.paymenttable):not(.lastrecordtable):last-of-type {
- border-bottom: 1px solid rgb();
+ border-bottom: 1px solid var(--colortopbordertitle1);
}
div.tabBar table.border>tbody>tr:last-of-type>td {
border-bottom-width: 1px;
- border-bottom-color: rgb();
+ border-bottom-color: var(--colortopbordertitle1);
border-bottom-style: solid;
}
div.tabBar div.fichehalfright table.noborder {
@@ -3442,7 +3463,7 @@ tr.liste_titre_filter td.liste_titre:first-of-type {
{
border-bottom-width: 0 !important;
border-top-width: 1px;
- border-top-color: rgb();
+ border-top-color: var(--colortopbordertitle1);
border-top-style: solid;
}
tr#trlinefordates td {
@@ -3451,7 +3472,7 @@ tr#trlinefordates td {
.liste_titre_add td, .liste_titre_add th, .liste_titre_add .tagtd
{
border-top-width: 1px;
- border-top-color: rgb();
+ border-top-color: var(--colortopbordertitle1);
border-top-style: solid;
}
table.liste tr, table.noborder tr, div.noborder form {
@@ -3716,14 +3737,14 @@ table.hidepaginationnext .paginationnext {
{
font-family: ;
margin-bottom: 1px;
- color: var(--oddevencolor);
+ color: var(--oddeven);
}
.impair, .nohover .impair:hover, tr.impair td.nohover
{
- background: var(--colorbacklineimpair1);
+ background-color: var(--colorbacklineimpair2);
}
#GanttChartDIV {
- background-color: var(--colorbacklineimpair1);
+ background-color: var(--colorbacklineimpair2);
}
.oddeven, .evenodd, .pair, .nohover .pair:hover, tr.pair td.nohover, .tagtr.oddeven {
@@ -3732,21 +3753,21 @@ table.hidepaginationnext .paginationnext {
color: var(--oddevencolor);
}
.pair, .nohover .pair:hover, tr.pair td.nohover {
- background-color: var(--colorbacklinepair1);
+ background-color: var(--colorbacklinepair2);
}
table.dataTable tr.oddeven {
- background-color: var(--colorbacklinepair1) !important;
+ background-color: var(--colorbacklinepair2) !important;
}
/* For no hover style */
td.oddeven, table.nohover tr.impair, table.nohover tr.pair, table.nohover tr.impair td, table.nohover tr.pair td, tr.nohover td, form.nohover, form.nohover:hover {
- background-color: var(--colorbacklineimpair1) !important;
- background: var(--colorbacklineimpair1) !important;
+ background-color: var(--colorbacklineimpair2) !important;
+ background: var(--colorbacklineimpair2) !important;
}
td.evenodd, tr.nohoverpair td, #trlinefordates td {
- background-color: var(--colorbacklinepair1) !important;
- background: var(--colorbacklinepair1) !important;
+ background-color: var(--colorbacklinepair2) !important;
+ background: var(--colorbacklinepair2) !important;
}
.trforbreak td {
font-weight: 500;
@@ -3781,7 +3802,9 @@ tr.pair td .nobordernopadding tr td, tr.impair td .nobordernopadding tr td {
}
table.nobottomiftotal tr.liste_total td {
background-color: #fff;
+
border-bottom: 0px !important;
+
}
table.nobottom, td.nobottom {
border-bottom: 0px !important;
@@ -3797,8 +3820,12 @@ div.liste_titre {
}
div.liste_titre_bydiv {
border-top-width: px;
- border-top-color: rgb();
+ border-top-color: var(--colortopbordertitle1);
border-top-style: solid;
+
+ border-left: px solid var(--colortopbordertitle1);
+ /* border-right: px solid var(--colortopbordertitle1); */
+
border-collapse: collapse;
display: table;
@@ -3829,7 +3856,7 @@ div.liste_titre_bydiv, .liste_titre div.tagtr, tr.liste_titre, tr.liste_titre_se
}
tr.liste_titre th, tr.liste_titre td, th.liste_titre
{
- border-bottom: 1px solid rgb();
+ border-bottom: 1px solid var(--colortopbordertitle1);
}
tr.liste_titre:first-child th, tr:first-child th.liste_titre {
/* border-bottom: 1px solid #ddd ! important; */
@@ -3848,7 +3875,7 @@ tr.liste_titre th a, th.liste_titre a, tr.liste_titre td a, td.liste_titre a, fo
}
tr.liste_titre_topborder td {
border-top-width: px;
- border-top-color: rgb();
+ border-top-color: var(--colortopbordertitle1);
border-top-style: solid;
}
.liste_titre td a {
@@ -3949,7 +3976,7 @@ div.tabBar .noborder {
}
#tablelines tr.liste_titre td, .paymenttable tr.liste_titre td, .margintable tr.liste_titre td, .tableforservicepart1 tr.liste_titre td {
- border-bottom: 1px solid rgb() !important;
+ border-bottom: 1px solid var(--colortopbordertitle1) !important;
}
#tablelines tr td {
height: unset;
@@ -3961,11 +3988,10 @@ div.tabBar .noborder {
div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright):not(.ficheaddleft) > .border > tbody > tr:nth-of-type(even):not(.liste_titre), .liste > tbody > tr:nth-of-type(even):not(.liste_titre),
div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright):not(.ficheaddleft) .oddeven.tagtr:nth-of-type(even):not(.liste_titre)
{
- background: linear-gradient(bottom, var(--colorbacklineimpair1) 85%, var(--colorbacklineimpair2) 100%);
- background: -o-linear-gradient(bottom, var(--colorbacklineimpair1) 85%, var(--colorbacklineimpair2) 100%);
- background: -moz-linear-gradient(bottom, var(--colorbacklineimpair1) 85%, var(--colorbacklineimpair2) 100%);
- background: -webkit-linear-gradient(bottom, var(--colorbacklineimpair1) 85%, var(--colorbacklineimpair2) 100%);
- /* background: -ms-linear-gradient(bottom, var(--colorbacklineimpair1) 85%, var(--colorbacklineimpair2) 100%); */
+ background: linear-gradient(bottom, var(----colorbacklineimpair2) 0%, var(--colorbacklineimpair2) 100%);
+ background: -o-linear-gradient(bottom, var(--colorbacklineimpair2) 0%, var(--colorbacklineimpair2) 100%);
+ background: -moz-linear-gradient(bottom, var(--colorbacklineimpair2) 0%, var(--colorbacklineimpair2) 100%);
+ background: -webkit-linear-gradient(bottom, var(--colorbacklineimpair2) 0%, var(--colorbacklineimpair2) 100%);
}
.noborder > tbody > tr:nth-child(even):not(:last-child) td:not(.liste_titre), .liste > tbody > tr:nth-child(even):not(:last-child) td:not(.liste_titre),
.noborder .oddeven.tagtr:nth-child(even):not(:last-child) .tagtd:not(.liste_titre)
@@ -3977,11 +4003,10 @@ div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright):not(.ficheaddleft
div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright):not(.ficheaddleft) > .border > tbody > tr:nth-of-type(odd):not(.liste_titre), .liste > tbody > tr:nth-of-type(odd):not(.liste_titre),
div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright):not(.ficheaddleft) .oddeven.tagtr:nth-of-type(odd):not(.liste_titre)
{
- background: linear-gradient(bottom, var(--colorbacklinepair1) 85%, var(--colorbacklinepair2) 100%);
- background: -o-linear-gradient(bottom, var(--colorbacklinepair1) 85%, var(--colorbacklinepair2) 100%);
- background: -moz-linear-gradient(bottom, var(--colorbacklinepair1) 85%, var(--colorbacklinepair2) 100%);
- background: -webkit-linear-gradient(bottom, var(--colorbacklinepair1) 85%, var(--colorbacklinepair2) 100%);
- /* background: -ms-linear-gradient(bottom, var(--colorbacklinepair1) 85%, var(--colorbacklinepair2) 100%); */
+ background: linear-gradient(bottom, var(--colorbacklinepair2) 0%, var(--colorbacklinepair2) 100%);
+ background: -o-linear-gradient(bottom, var(--colorbacklinepair2) 0%, var(--colorbacklinepair2) 100%);
+ background: -moz-linear-gradient(bottom, var(--colorbacklinepair2) 0%, var(--colorbacklinepair2) 100%);
+ background: -webkit-linear-gradient(bottom, var(--colorbacklinepair2) 0%, var(--colorbacklinepair2) 100%);
}
.noborder > tbody > tr:nth-child(odd):not(:last-child) td:not(.liste_titre), .liste > tbody > tr:nth-child(odd):not(:last-child) td:not(.liste_titre),
.noborder .oddeven.tagtr:nth-child(odd):not(:last-child) .tagtd:not(.liste_titre)
@@ -4196,7 +4221,7 @@ span.dashboardlineko {
margin-bottom: 25px !important;
border-bottom-width: 1px;
background: var(--colorbackbody);
- border-top: px solid rgb();
+ border-top: px solid var(--colortopbordertitle1);
/* border-top: 2px solid var(--colorbackhmenu1) !important; */
}
table.noborder.boxtable tr td {
@@ -4878,11 +4903,10 @@ table.cal_month td { padding-left: 1px !important; padding-right: 1px !important
.cal_past { }
.cal_peruser { padding-top: 0 !important; padding-bottom: 0 !important; padding-: 1px !important; padding-: 1px !important; }
.cal_impair {
- background: linear-gradient(bottom, var(--colorbacklinepair1) 85%, var(--colorbacklinepair2) 100%);
- background: -o-linear-gradient(bottom, var(--colorbacklinepair1) 85%, var(--colorbacklinepair2) 100%);
- background: -moz-linear-gradient(bottom, var(--colorbacklinepair1) 85%, var(--colorbacklinepair2) 100%);
- background: -webkit-linear-gradient(bottom, var(--colorbacklinepair1) 85%, var(--colorbacklinepair2) 100%);
- /* background: -ms-linear-gradient(bottom, var(--colorbacklinepair1) 85%, var(--colorbacklinepair2) 100%); */
+ background: linear-gradient(bottom, var(--colorbacklinepair2) 85%, var(--colorbacklinepair2) 100%);
+ background: -o-linear-gradient(bottom, var(--colorbacklinepair2) 85%, var(--colorbacklinepair2) 100%);
+ background: -moz-linear-gradient(bottom, var(--colorbacklinepair2) 85%, var(--colorbacklinepair2) 100%);
+ background: -webkit-linear-gradient(bottom, var(--colorbacklinepair2) 85%, var(--colorbacklinepair2) 100%);
}
.cal_today_peruser_impair { background: #F8F8F0; }
.peruser_busy { }
@@ -5654,7 +5678,7 @@ span#select2-taskid-container[title^='--'] {
}
.select2-container--default .select2-results__option--highlighted[aria-selected] {
- background-color: rgb();
+ background-color: var(--colorbackhmenu1);
color: var(--colortextbackhmenu);
}
.select2-container--default .select2-results__option--highlighted[aria-selected] span {
@@ -6659,7 +6683,6 @@ div.tabsElem a.tab {
background-image: -o-linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(230,230,230,0.4) 100%);
background-image: -moz-linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(230,230,230,0.4) 100%);
background-image: -webkit-linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(230,230,230,0.4) 100%);
- background-image: -ms-linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(230,230,230,0.4) 100%);
background-image: linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(230,230,230,0.4) 100%);
}
.cd-timeline-content:after {
diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php
index 44a0a7d7b20..de089ecba54 100644
--- a/htdocs/theme/eldy/style.css.php
+++ b/htdocs/theme/eldy/style.css.php
@@ -118,7 +118,8 @@ $dol_no_mouse_hover = $conf->dol_no_mouse_hover;
//$user->conf->THEME_ELDY_ENABLE_PERSONALIZED=0;
//var_dump($user->conf->THEME_ELDY_RGB);
-$useboldtitle = (isset($conf->global->THEME_ELDY_USEBOLDTITLE) ? $conf->global->THEME_ELDY_USEBOLDTITLE : 0);
+$useboldtitle = getDolGlobalInt('THEME_ELDY_USEBOLDTITLE');
+$userborderontable = getDolGlobalInt('THEME_ELDY_USEBORDERONTABLE');
$borderwidth = 1;
// Case of option always editable
@@ -208,6 +209,8 @@ if ($tmpval <= 460) {
$colortextbackvmenu = '000000';
}
+$colortopbordertitle1 = join(',', colorStringToArray($colortopbordertitle1)); // Normalize value to 'x,y,z'
+
$colorbacktitle1 = join(',', colorStringToArray($colorbacktitle1)); // Normalize value to 'x,y,z'
$tmppart = explode(',', $colorbacktitle1);
if ($colortexttitle == '') {
diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php
index d68bfa78ee9..691ffa8f658 100644
--- a/htdocs/theme/md/style.css.php
+++ b/htdocs/theme/md/style.css.php
@@ -118,6 +118,7 @@ $dol_no_mouse_hover = $conf->dol_no_mouse_hover;
$useboldtitle = (isset($conf->global->THEME_ELDY_USEBOLDTITLE) ? $conf->global->THEME_ELDY_USEBOLDTITLE : 0);
$borderwidth = 2;
+$userborderontable = 1;
// Case of option always editable
if (!isset($conf->global->THEME_ELDY_BACKBODY)) {
@@ -210,6 +211,8 @@ if ($tmpval <= 460) {
$colortextbackvmenu = '000000';
}
+$colortopbordertitle1 = join(',', colorStringToArray($colortopbordertitle1)); // Normalize value to 'x,y,z'
+
$colorbacktitle1 = join(',', colorStringToArray($colorbacktitle1)); // Normalize value to 'x,y,z'
$tmppart = explode(',', $colorbacktitle1);
if ($colortexttitle == '') {
@@ -270,12 +273,13 @@ print 'colorbacklinepair1='.$colorbacklinepair1."\n";
print 'colorbacklinepair2='.$colorbacklinepair2."\n";
print 'colorbacklinepairhover='.$colorbacklinepairhover."\n";
print 'colorbacklinepairchecked='.$colorbacklinepairchecked."\n";
-print '$colortexttitlenotab='.$colortexttitlenotab."\n";
-print '$colortexttitle='.$colortexttitle."\n";
-print '$colortext='.$colortext."\n";
-print '$colortextlink='.$colortextlink."\n";
-print '$colortextbackhmenu='.$colortextbackhmenu."\n";
-print '$colortextbackvmenu='.$colortextbackvmenu."\n";
+print 'colortexttitlenotab='.$colortexttitlenotab."\n";
+print 'colortexttitle='.$colortexttitle."\n";
+print 'colortext='.$colortext."\n";
+print 'colortextlink='.$colortextlink."\n";
+print 'colortexttitlelink='.$colortexttitlelink."\n";
+print 'colortextbackhmenu='.$colortextbackhmenu."\n";
+print 'colortextbackvmenu='.$colortextbackvmenu."\n";
print 'dol_hide_topmenu='.$dol_hide_topmenu."\n";
print 'dol_hide_leftmenu='.$dol_hide_leftmenu."\n";
print 'dol_optimize_smallscreen='.$dol_optimize_smallscreen."\n";
@@ -306,12 +310,15 @@ print '*/'."\n";
--colorbacklinepairchecked: rgb();
--colorbacklinebreak: rgb();
--colorbackbody: rgb();
+ --colorbackmobilemenu: #f8f8f8;
--colortexttitlenotab: rgb();
--colortexttitle: rgb();
+ --colortexttitlelink: rgba(, 0.9);
--colortext: rgb();
--colortextlink: rgb();
- --colortextbackhmenu: #;
+ --colortextbackhmenu: #;
--colortextbackvmenu: #;
+ --colortopbordertitle1: rgb();
--listetotal: #551188;
--inputbackgroundcolor: #FFF;
--inputbordercolor: rgba(0,0,0,.2);
@@ -328,13 +335,16 @@ print '*/'."\n";
--amountremaintopaycolor:#880000;
--amountpaymentcomplete:#008800;
--amountremaintopaybackcolor:none;
+ --productlinestockod: #002200;
+ --productlinestocktoolow: #884400;
+ --infoboxmoduleenabledbgcolor : linear-gradient(0.4turn, #fff, #fff, #fff, #e4efe8);
}
body {
background-color: #FFFFFF;
- background: rgb();
+ background: var(--colorbackbody);
color: rgb();
font-size: ;
@@ -580,7 +590,7 @@ input.pageplusone {
}
.optionblue {
- color: rgb();
+ color: var(--colortextlink);
}
.optiongrey, .opacitymedium {
opacity: 0.5;
@@ -984,7 +994,7 @@ body[class*="colorblind-"] .text-success{
color: #ccc !important;
}
.editfielda span.fa-pencil-alt:hover, .editfielda span.fa-trash:hover {
- color: rgb() !important;
+ color: var(--colortexttitle) !important;
}
.size15x { font-size: 1.5em !important; }
@@ -1765,7 +1775,7 @@ td.showDragHandle {
display: none;
- background: rgb();
+ background: var(--colorbackvmenu1);
border-right: 1px solid rgba(0,0,0,0.2);
box-shadow: 3px 0 6px -2px #eee;
bottom: 0;
@@ -1859,6 +1869,7 @@ body.sidebar-collapse .side-nav, body.sidebar-collapse .login_block
div.login_block {
/* border-right: none ! important; */
top: inherit !important;
+ border-right: 1px solid rgba(0,0,0,0.3);
}
.side-nav {
@@ -1909,12 +1920,12 @@ div.login_block {
}
#id-left {
z-index: 91;
- background: rgb();
+ background: var(--colorbackvmenu1);
border-right: 1px solid rgba(0,0,0,0.3);
padding-top: 20px;
browser->layout, array('phone', 'tablet')) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) { ?>
- top: 50px ! important;
+ top: 66px ! important;
top: 60px ! important;
@@ -2204,11 +2215,11 @@ img.photorefnoborder {
.underrefbanner {
}
.underbanner {
- border-bottom: px solid rgb();
+ border-bottom: px solid var(--colortopbordertitle1);
}
.trextrafieldseparator td, .trextrafields_collapse_last td {
- border-bottom: 1px solid rgb() !important;
+ border-bottom: 1px solid var(--colortopbordertitle1) !important;
}
.tdhrthin {
margin: 0;
@@ -2239,13 +2250,12 @@ div#tmenu_tooltip {
display:none;
- background: rgb();
+ background: var(--colorbackhmenu1);
/*
background-image: linear-gradient(to top, rgba(255,255,255,.3) 0%, rgba(128,128,128,.3) 100%);
background-image: -o-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(128,128,128,.3) 100%);
background-image: -moz-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(128,128,128,.3) 100%);
background-image: -webkit-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(128,128,128,.3) 100%);
- background-image: -ms-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(128,128,128,.3) 100%);
background-image: -webkit-gradient( linear, left top, left bottom, color-stop(0, rgba(255,255,255,.3)), color-stop(1, rgba(128,128,128,.3)) );
*/
@@ -2322,13 +2332,12 @@ ul.tmenu { /* t r b l */
padding-left: 5px;
}
ul.tmenu li {
- background: rgb();
+ background: var(--colorbackhmenu1);
/*
background-image: linear-gradient(to top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%);
background-image: -o-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%);
background-image: -moz-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%);
background-image: -webkit-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%);
- background-image: -ms-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%);
background-image: -webkit-gradient( linear, left top, left bottom, color-stop(0, rgba(255,255,255,.3)), color-stop(1, rgba(0,0,0,.3)) );
*/
}
@@ -2729,7 +2738,7 @@ div.login_block {
z-index: 10;
text-align: center;
vertical-align: middle;
- background: rgb();
+ background: var(--colorbackvmenu1);
width: 228px;
height: 70px;
@@ -2810,9 +2819,9 @@ img.login, img.printer, img.entity {
font-weight: bold;
}
.userimg.atoplogin img.userphoto, .userimgatoplogin img.userphoto { /* size for user photo in login bar */
- border-radius: 8px;
- width: 16px;
- height: 16px;
+ /* border-radius: 8px; */
+ width: 20px;
+ height: 20px;
background-size: contain;
vertical-align: text-bottom;
background-color: #FFF;
@@ -3115,7 +3124,7 @@ div.tabBar {
border-left: 1px solid #BBB;
border-top: 1px solid #CCC;
width: auto;
- background: rgb();
+ background: var(--colorbacktabcard1);
border-bottom: 1px solid #aaa;
}
@@ -3208,8 +3217,8 @@ a.tab:link, a.tab:visited, a.tab:hover, a.tab#active {
}
.tabactive, a.tab#active {
- color: # !important;
- background: rgb() !important;
+ color: var(--colortextbacktab) !important;
+ background: var(--colorbacktabcard1) !important;
border-right: 1px solid #AAA !important;
border-left: 1px solid #AAA !important;
@@ -3225,8 +3234,8 @@ a.tab:link, a.tab:visited, a.tab:hover, a.tab#active {
a.tab:hover
{
/*
- background: rgba(, 0.5) url() 50% 0 repeat-x;
- color: #;
+ background: var(--colorbacktabcard1) url() 50% 0 repeat-x;
+ color: var(--colortextbacktab);
*/
text-decoration: underline;
}
@@ -3386,10 +3395,10 @@ td.border, div.tagtable div div.border {
border-bottom: none !important;
}
.bordertop {
- border-top: 1px solid rgb();
+ border-top: 1px solid var(--colortopbordertitle1);
}
.borderbottom {
- border-bottom: 1px solid rgb();
+ border-bottom: 1px solid var(--colortopbordertitle1);
}
.fichehalfright table.noborder {
@@ -3397,7 +3406,7 @@ td.border, div.tagtable div div.border {
}
div.colorback
{
- background: rgb();
+ background: var(--colorbacktitle1);
padding: 10px;
margin-top: 5px;
}
@@ -3412,7 +3421,7 @@ table.liste, table.noborder, table.formdoc, div.noborder {
border-spacing: 0px;
border-top-width: px;
- border-top-color: rgb();
+ border-top-color: var(--colortopbordertitle1);
border-top-style: solid;
border-bottom-width: 1px;
@@ -3445,7 +3454,7 @@ table.paddingtopbottomonly tr td {
}
.liste_titre_filter {
- background: rgb() !important;
+ background: var(--colorbacktitle1) !important;
}
tr.liste_titre_filter td.liste_titre {
padding-top: 4px;
@@ -3454,19 +3463,19 @@ tr.liste_titre_filter td.liste_titre {
.liste_titre_create td, .liste_titre_create th, .liste_titre_create .tagtd
{
border-top-width: 1px;
- border-top-color: rgb();
+ border-top-color: var(--colortopbordertitle1);
border-top-style: solid;
}
.liste_titre_add td, .liste_titre_add th, .liste_titre_add .tagtd
{
border-top-width: 2px;
- border-top-color: rgb();
+ border-top-color: var(--colortopbordertitle1);
border-top-style: solid;
}
.liste_titre_add td, .liste_titre_add .tagtd
{
border-top-width: 1px;
- border-top-color: rgb();
+ border-top-color: var(--colortopbordertitle1);
border-top-style: solid;
}
@@ -3534,7 +3543,7 @@ div.refidpadding {
}
div.refid {
font-weight: bold;
- color: rgb();
+ color: rgb(--colortexttitlenotab);
font-size: 160%;
}
div.refidno {
@@ -3627,7 +3636,7 @@ div.pagination li .active span:focus {
z-index: 2;
color: #fff;
cursor: default;
- background-color: rgb();
+ background-color: var(--colorbackhmenu1);
border-color: #337ab7;
}
div.pagination .disabled span,
@@ -3672,11 +3681,10 @@ table.hidepaginationnext .paginationnext {
/* Prepare to remove class pair - impair
.noborder > tbody > tr:nth-child(even) td {
- background: linear-gradient(to bottom, rgb() 85%, rgb() 100%);
- background: -o-linear-gradient(bottom, rgb() 85%, rgb() 100%);
- background: -moz-linear-gradient(bottom, rgb() 85%, rgb() 100%);
- background: -webkit-linear-gradient(bottom, rgb() 85%, rgb() 100%);
- background: -ms-linear-gradient(bottom, rgb() 85%, rgb() 100%);
+ background: linear-gradient(to bottom, var(--colorbacklineimpair1) 85%, var(--colorbacklineimpair2) 100%);
+ background: -o-linear-gradient(bottom, var(--colorbacklineimpair1) 85%, var(--colorbacklineimpair2) 100%);
+ background: -moz-linear-gradient(bottom, var(--colorbacklineimpair1) 85%, var(--colorbacklineimpair2) 100%);
+ background: -webkit-linear-gradient(bottom, var(--colorbacklineimpair1) 85%, var(--colorbacklineimpair2) 100%);
font-family: ;
border: 0px;
margin-bottom: 1px;
@@ -3685,11 +3693,10 @@ table.hidepaginationnext .paginationnext {
}
.noborder > tbody > tr:nth-child(odd) td {
- background: linear-gradient(to bottom, rgb() 85%, rgb() 100%);
- background: -o-linear-gradient(bottom, rgb() 85%, rgb() 100%);
- background: -moz-linear-gradient(bottom, rgb() 85%, rgb() 100%);
- background: -webkit-linear-gradient(bottom, rgb() 85%, rgb() 100%);
- background: -ms-linear-gradient(bottom, rgb() 85%, rgb() 100%);
+ background: linear-gradient(to bottom, var(--colorbacklinepair1) 85%, var(--colorbacklinepair2) 100%);
+ background: -o-linear-gradient(bottom, var(--colorbacklinepair1) 85%, var(--colorbacklinepair2) 100%);
+ background: -moz-linear-gradient(bottom, var(--colorbacklinepair1) 85%, var(--colorbacklinepair2) 100%);
+ background: -webkit-linear-gradient(bottom, var(--colorbacklinepair1) 85%, var(--colorbacklinepair2) 100%);
font-family: ;
border: 0px;
margin-bottom: 1px;
@@ -3698,11 +3705,7 @@ table.hidepaginationnext .paginationnext {
*/
ul.noborder li:nth-child(odd):not(.liste_titre) {
- background-color: rgb() !important;
- background-color: rgb() !important;
- background-color: rgb() !important;
- background-color: rgb() !important;
- background-color: rgb() !important;
+ background-color: var(--colorbacklinepair2) !important;
}
@@ -3827,7 +3830,7 @@ div.liste_titre {
}
div.liste_titre_bydiv {
border-top-width: px;
- border-top-color: rgb();
+ border-top-color: var(--colortopbordertitle1);
border-top-style: solid;
box-shadow: none;
@@ -3842,11 +3845,11 @@ tr.liste_titre, tr.liste_titre_sel, form.liste_titre, form.liste_titre_sel, tabl
}
div.liste_titre_bydiv, .liste_titre div.tagtr, tr.liste_titre, tr.liste_titre_sel, .tagtr.liste_titre, .tagtr.liste_titre_sel, form.liste_titre, form.liste_titre_sel, table.dataTable thead tr
{
- background: rgb();
+ background: var(--colorbacktitle1);
font-weight: ;
/* border-bottom: 1px solid #FDFFFF; */
- color: rgb();
+ color: var(--colortexttitle);
font-family: ;
text-align: ;
}
@@ -3867,25 +3870,25 @@ tr.liste_titre th, th.liste_titre, tr.liste_titre td, td.liste_titre, form.liste
}
tr.liste_titre th a, th.liste_titre a, tr.liste_titre td a, td.liste_titre a, form.liste_titre div a, div.liste_titre a {
text-shadow: none !important;
- color: rgb();
+ color: var(--colortexttitlelink);
}
tr.liste_titre_topborder td {
border-top-width: px;
- border-top-color: rgb();
+ border-top-color: var(--colortopbordertitle1);
border-top-style: solid;
}
.liste_titre td a {
text-shadow: none !important;
- color: rgb();
+ color: var(--colortexttitle);
}
.liste_titre td a.notasortlink {
- color: rgb();
+ color: var(--colortextlink);
}
.liste_titre td a.notasortlink:hover {
background: transparent;
}
tr.liste_titre:last-child th.liste_titre, tr.liste_titre:last-child th.liste_titre_sel, tr.liste_titre td.liste_titre, tr.liste_titre td.liste_titre_sel, form.liste_titre div.tagtd { /* For last line of table headers only */
- border-bottom: 1px solid rgb();
+ border-bottom: 1px solid var(--colortopbordertitle1);
}
div.liste_titre {
@@ -3933,7 +3936,7 @@ tr.liste_sub_total, tr.liste_sub_total td {
}
.paymenttable, .margintable:not(.margintablenotop) {
border-top-width: px !important;
- border-top-color: rgb() !important;
+ border-top-color: var(--colortopbordertitle1) !important;
border-top-style: solid !important;
}
.margintable.margintablenotop {
@@ -3986,11 +3989,10 @@ div .tdtop {
div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright):not(.ficheaddleft) > .border > tbody > tr:nth-of-type(even):not(.liste_titre), .liste > tbody > tr:nth-of-type(even):not(.liste_titre),
div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright):not(.ficheaddleft) .oddeven.tagtr:nth-of-type(even):not(.liste_titre)
{
- background: linear-gradient(to bottom, rgb() 85%, rgb() 100%);
- background: -o-linear-gradient(bottom, rgb() 85%, rgb() 100%);
- background: -moz-linear-gradient(bottom, rgb() 85%, rgb() 100%);
- background: -webkit-linear-gradient(bottom, rgb() 85%, rgb() 100%);
- background: -ms-linear-gradient(bottom, rgb() 85%, rgb() 100%);
+ background: linear-gradient(to bottom, var(--colorbacklineimpair1) 0%, var(--colorbacklineimpair2) 100%);
+ background: -o-linear-gradient(bottom, var(--colorbacklineimpair1) 0%, var(--colorbacklineimpair2) 100%);
+ background: -moz-linear-gradient(bottom, var(--colorbacklineimpair1) 0%, var(--colorbacklineimpair2) 100%);
+ background: -webkit-linear-gradient(bottom, var(--colorbacklineimpair1) 0%, var(--colorbacklineimpair2) 100%);
}
.noborder > tbody > tr:nth-child(even):not(:last-child) td:not(.liste_titre), .liste > tbody > tr:nth-child(even):not(:last-child) td:not(.liste_titre),
.noborder .tagtr:nth-child(even):not(:last-child) .oddeven.tagtd:not(.liste_titre)
@@ -4002,11 +4004,10 @@ div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright):not(.ficheaddleft
div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright):not(.ficheaddleft) > .border > tbody > tr:nth-of-type(odd):not(.liste_titre), .liste > tbody > tr:nth-of-type(odd):not(.liste_titre),
div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright):not(.ficheaddleft) .oddeven.tagtr:nth-of-type(odd):not(.liste_titre)
{
- background: linear-gradient(to bottom, rgb() 85%, rgb() 100%);
- background: -o-linear-gradient(bottom, rgb() 85%, rgb() 100%);
- background: -moz-linear-gradient(bottom, rgb() 85%, rgb() 100%);
- background: -webkit-linear-gradient(bottom, rgb() 85%, rgb() 100%);
- background: -ms-linear-gradient(bottom, rgb() 85%, rgb() 100%);
+ background: linear-gradient(to bottom, var(--colorbacklinepair1) 0%, var(--colorbacklinepair2) 100%);
+ background: -o-linear-gradient(bottom, var(--colorbacklinepair1) 0%, var(--colorbacklinepair2) 100%);
+ background: -moz-linear-gradient(bottom, var(--colorbacklinepair1) 0%, var(--colorbacklinepair2) 100%);
+ background: -webkit-linear-gradient(bottom, var(--colorbacklinepair1) 0%, var(--colorbacklinepair2) 100%);
}
.noborder > tbody > tr:nth-child(odd):not(:last-child) td:not(.liste_titre), .liste > tbody > tr:nth-child(odd):not(:last-child) td:not(.liste_titre),
.noborder .tagtr:nth-child(odd):not(:last-child) .oddeven.tagtd:not(.liste_titre)
@@ -4015,7 +4016,7 @@ div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright):not(.ficheaddleft
}
ul.noborder li:nth-child(even):not(.liste_titre) {
- background-color: rgb() !important;
+ background-color: var(--colorbacklinepair2) !important;
}
@@ -6538,7 +6539,6 @@ border-top-right-radius: 6px;
background-image: -o-linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(230,230,230,0.4) 100%);
background-image: -moz-linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(230,230,230,0.4) 100%);
background-image: -webkit-linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(230,230,230,0.4) 100%);
- background-image: -ms-linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(230,230,230,0.4) 100%);
background-image: linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(230,230,230,0.4) 100%);
}
.cd-timeline-content:after {
diff --git a/htdocs/ticket/list.php b/htdocs/ticket/list.php
index aeab9ac6e27..6cac26a2e23 100644
--- a/htdocs/ticket/list.php
+++ b/htdocs/ticket/list.php
@@ -45,7 +45,7 @@ $show_files = GETPOST('show_files', 'int'); // Show files area generated by bulk
$confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
$cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
$toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
-$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'tickep#selectedfieldstlist'; // To manage different context of search
+$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'ticketlist'; // To manage different context of search
$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
@@ -698,6 +698,7 @@ print ' ';
print ' ';
print ' ';
print ' ';
+
if ($socid) {
print ' ';
}
@@ -759,6 +760,7 @@ $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfi
$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
print ''; // You can use div-table-responsive-no-min if you dont need reserved height for your table
+print '
';
print '
'."\n";
@@ -1088,6 +1090,7 @@ print $hookmanager->resPrint;
print '
'."\n";
print '
'."\n";
+print '
'."\n";
print ''."\n";
diff --git a/htdocs/user/group/perms.php b/htdocs/user/group/perms.php
index 46506163c1f..478e345f2e3 100644
--- a/htdocs/user/group/perms.php
+++ b/htdocs/user/group/perms.php
@@ -248,9 +248,9 @@ if ($object->id > 0) {
print ''.$langs->trans("Module").' ';
if ($caneditperms) {
print '';
- print 'id.'&action=addrights&entity='.$entity.'&module=allmodules&confirm=yes&token='.newToken().'">'.$langs->trans("All")." ";
+ print 'id.'&action=addrights&token='.newToken().'&entity='.$entity.'&module=allmodules&confirm=yes">'.$langs->trans("All")." ";
print '/';
- print 'id.'&action=delrights&entity='.$entity.'&module=allmodules&confirm=yes&token='.newToken().'">'.$langs->trans("None")." ";
+ print 'id.'&action=delrights&&token='.newToken().'&entity='.$entity.'&module=allmodules&confirm=yes">'.$langs->trans("None")." ";
print ' ';
}
print ' ';
@@ -302,9 +302,9 @@ if ($object->id > 0) {
print '';
if ($caneditperms) {
print '';
- print 'id.'&action=addrights&entity='.$entity.'&module='.$obj->module.'&token='.newToken().'">'.$langs->trans("All")." ";
+ print 'id.'&action=addrights&entity='.$entity.'&module='.$obj->module.'&token='.newToken().'">'.$langs->trans("All")." ";
print '/';
- print 'id.'&action=delrights&entity='.$entity.'&module='.$obj->module.'&token='.newToken().'">'.$langs->trans("None")." ";
+ print 'id.'&action=delrights&entity='.$entity.'&module='.$obj->module.'&token='.newToken().'">'.$langs->trans("None")." ";
print ' ';
} else {
print ' ';
@@ -353,7 +353,7 @@ if ($object->id > 0) {
} else {
// Do not own permission
if ($caneditperms) {
- print 'id.'&action=addrights&entity='.$entity.'&rights='.$obj->id.'&confirm=yes&token='.newToken().'">';
+ print ' id.'&action=addrights&entity='.$entity.'&rights='.$obj->id.'&confirm=yes&token='.newToken().'">';
//print img_edit_add($langs->trans("Add"));
print img_picto($langs->trans("Add"), 'switch_off');
print ' ';
diff --git a/htdocs/user/perms.php b/htdocs/user/perms.php
index 7c7fe868b2f..d3ba33a5acf 100644
--- a/htdocs/user/perms.php
+++ b/htdocs/user/perms.php
@@ -420,7 +420,7 @@ if ($result) {
} else {
// Do not own permission
if ($caneditperms) {
- print 'id.'&action=addrights&entity='.$entity.'&rights='.$obj->id.'&confirm=yes&token='.newToken().'">';
+ print ' id.'&action=addrights&entity='.$entity.'&rights='.$obj->id.'&confirm=yes&token='.newToken().'">';
//print img_edit_add($langs->trans("Add"));
print img_picto($langs->trans("Add"), 'switch_off');
print ' ';
@@ -430,7 +430,7 @@ if ($result) {
} else {
// Do not own permission
if ($caneditperms) {
- print 'id.'&action=addrights&entity='.$entity.'&rights='.$obj->id.'&confirm=yes&token='.newToken().'">';
+ print ' id.'&action=addrights&entity='.$entity.'&rights='.$obj->id.'&confirm=yes&token='.newToken().'">';
//print img_edit_add($langs->trans("Add"));
print img_picto($langs->trans("Add"), 'switch_off');
print ' ';
diff --git a/htdocs/variants/combinations.php b/htdocs/variants/combinations.php
index a3ad036ca9a..d70419060f5 100644
--- a/htdocs/variants/combinations.php
+++ b/htdocs/variants/combinations.php
@@ -587,7 +587,7 @@ if (!empty($id) || !empty($ref)) {
$htmltext = $langs->trans("GoOnMenuToCreateVairants", $langs->transnoentities("Product"), $langs->transnoentities("VariantAttributes"));
print $form->textwithpicto('', $htmltext);
- /*print ' id).'">';
+ /*print ' id).'">';
print $langs->trans("Create");
print ' ';*/
@@ -605,7 +605,7 @@ if (!empty($id) || !empty($ref)) {
$htmltext = $langs->trans("GoOnMenuToCreateVairants", $langs->transnoentities("Product"), $langs->transnoentities("VariantAttributes"));
print $form->textwithpicto('', $htmltext);
/*
- print ' id).'">';
+ print ' id).'">';
print $langs->trans("Create");
print ' ';
*/
diff --git a/htdocs/webservices/server_supplier_invoice.php b/htdocs/webservices/server_supplier_invoice.php
index 6803133d527..926fa8f6418 100644
--- a/htdocs/webservices/server_supplier_invoice.php
+++ b/htdocs/webservices/server_supplier_invoice.php
@@ -350,13 +350,9 @@ function getSupplierInvoicesForThirdParty($authentication, $idthirdparty)
if (!$error) {
$linesinvoice = array();
- $sql .= 'SELECT f.rowid as facid';
- $sql .= ' FROM '.MAIN_DB_PREFIX.'facture_fourn as f';
- //$sql.=', '.MAIN_DB_PREFIX.'societe as s';
- //$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'product as p ON pt.fk_product = p.rowid';
- //$sql.=" WHERE f.fk_soc = s.rowid AND nom = '".$db->escape($idthirdparty)."'";
- //$sql.=" WHERE f.fk_soc = s.rowid AND nom = '".$db->escape($idthirdparty)."'";
- $sql .= " WHERE f.entity = ".$conf->entity;
+ $sql .= "SELECT f.rowid as facid";
+ $sql .= " FROM '.MAIN_DB_PREFIX.'facture_fourn as f";
+ $sql .= " WHERE f.entity = ".((int) $conf->entity);
if ($idthirdparty != 'all') {
$sql .= " AND f.fk_soc = ".((int) $idthirdparty);
}
diff --git a/htdocs/website/class/website.class.php b/htdocs/website/class/website.class.php
index f80a705c3f2..f1a923642e2 100644
--- a/htdocs/website/class/website.class.php
+++ b/htdocs/website/class/website.class.php
@@ -297,8 +297,8 @@ class Website extends CommonObject
{
dol_syslog(__METHOD__, LOG_DEBUG);
- $sql = 'SELECT';
- $sql .= ' t.rowid,';
+ $sql = "SELECT";
+ $sql .= " t.rowid,";
$sql .= " t.entity,";
$sql .= " t.ref,";
$sql .= " t.position,";
@@ -313,12 +313,12 @@ class Website extends CommonObject
$sql .= " t.fk_user_modif,";
$sql .= " t.date_creation,";
$sql .= " t.tms as date_modification";
- $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
- $sql .= ' WHERE t.entity IN ('.getEntity('website').')';
+ $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t";
+ $sql .= " WHERE t.entity IN (".getEntity('website').")";
if (!empty($ref)) {
$sql .= " AND t.ref = '".$this->db->escape($ref)."'";
} else {
- $sql .= ' AND t.rowid = '.(int) $id;
+ $sql .= " AND t.rowid = ".(int) $id;
}
$resql = $this->db->query($sql);
@@ -395,8 +395,8 @@ class Website extends CommonObject
{
dol_syslog(__METHOD__, LOG_DEBUG);
- $sql = 'SELECT';
- $sql .= ' t.rowid,';
+ $sql = "SELECT";
+ $sql .= " t.rowid,";
$sql .= " t.entity,";
$sql .= " t.ref,";
$sql .= " t.description,";
@@ -409,8 +409,8 @@ class Website extends CommonObject
$sql .= " t.fk_user_modif,";
$sql .= " t.date_creation,";
$sql .= " t.tms as date_modification";
- $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
- $sql .= ' WHERE t.entity IN ('.getEntity('website').')';
+ $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." as t";
+ $sql .= " WHERE t.entity IN (".getEntity('website').")";
// Manage filter
$sqlwhere = array();
if (count($filter) > 0) {
@@ -1252,7 +1252,7 @@ class Website extends CommonObject
// Read record of website that has been updated by the run_sql function previously called so we can get the
// value of fk_default_home that is ID of home page
- $sql = 'SELECT fk_default_home FROM '.MAIN_DB_PREFIX.'website WHERE rowid = '.((int) $object->id);
+ $sql = "SELECT fk_default_home FROM ".MAIN_DB_PREFIX."website WHERE rowid = ".((int) $object->id);
$resql = $this->db->query($sql);
if ($resql) {
$obj = $this->db->fetch_object($resql);
@@ -1297,7 +1297,7 @@ class Website extends CommonObject
$objectpagestatic = new WebsitePage($this->db);
- $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'website_page WHERE fk_website = '.((int) $this->id);
+ $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."website_page WHERE fk_website = ".((int) $this->id);
$resql = $this->db->query($sql);
if (!$resql) {
diff --git a/htdocs/website/index.php b/htdocs/website/index.php
index beca6a3a1a0..4e21887ff04 100644
--- a/htdocs/website/index.php
+++ b/htdocs/website/index.php
@@ -3825,7 +3825,7 @@ if ($action == 'editmeta' || $action == 'createcontainer') { // Edit properties
print '';
if ($action != 'createcontainer') {
// Has translation pages
- $sql = 'SELECT rowid, lang from '.MAIN_DB_PREFIX.'website_page where fk_page = '.((int) $objectpage->id);
+ $sql = "SELECT rowid, lang from ".MAIN_DB_PREFIX."website_page where fk_page = ".((int) $objectpage->id);
$resql = $db->query($sql);
if ($resql) {
$num_rows = $db->num_rows($resql);
diff --git a/test/phpunit/CodingPhpTest.php b/test/phpunit/CodingPhpTest.php
index 21a58f34159..2d3c71e7370 100644
--- a/test/phpunit/CodingPhpTest.php
+++ b/test/phpunit/CodingPhpTest.php
@@ -250,7 +250,6 @@ class CodingPhpTest extends PHPUnit\Framework\TestCase
$ok=true;
$matches=array();
- // Check string get_class...
preg_match_all('/'.preg_quote('get_class($this)."::".__METHOD__', '/').'/', $filecontent, $matches, PREG_SET_ORDER);
foreach ($matches as $key => $val) {
$ok=false;
@@ -260,9 +259,9 @@ class CodingPhpTest extends PHPUnit\Framework\TestCase
$this->assertTrue($ok, 'Found string get_class($this)."::".__METHOD__ that must be replaced with __METHOD__ only in '.$file['relativename']);
//exit;
+ // Check string $this->db->idate without quotes
$ok=true;
$matches=array();
- // Check string $this->db->idate without quotes
preg_match_all('/(..)\s*\.\s*\$this->db->idate\(/', $filecontent, $matches, PREG_SET_ORDER);
foreach ($matches as $key => $val) {
if ($val[1] != '\'"' && $val[1] != '\'\'') {
@@ -276,11 +275,10 @@ class CodingPhpTest extends PHPUnit\Framework\TestCase
//exit;
- $ok=true;
- $matches=array();
-
// Check sql string DELETE|OR|AND|WHERE|INSERT ... yyy = ".$xxx
// with xxx that is not 'thi' (for $this->db->sanitize) and 'db-' (for $db->sanitize). It means we forget a ' if string, or an (int) if int, when forging sql request.
+ $ok=true;
+ $matches=array();
preg_match_all('/(DELETE|OR|AND|WHERE|INSERT)\s.*([^\s][^\s][^\s])\s*=\s*"\s*\.\s*\$(...)/', $filecontent, $matches, PREG_SET_ORDER);
foreach ($matches as $key => $val) {
if ($val[2] == 'ity' && $val[3] == 'con') { // exclude entity = ".$conf->entity
@@ -300,8 +298,37 @@ class CodingPhpTest extends PHPUnit\Framework\TestCase
$this->assertTrue($ok, 'Found non quoted or not casted var into sql request '.$file['relativename'].' - Bad.');
//exit;
+ // Check that forged sql string is using ' instead of " as string PHP quotes
+ $ok=true;
+ $matches=array();
+ preg_match_all('/\$sql \.= \'\s*VALUES.*\$/', $filecontent, $matches, PREG_SET_ORDER);
+ foreach ($matches as $key => $val) {
+ //if ($val[1] != '\'"' && $val[1] != '\'\'') {
+ var_dump($matches);
+ $ok=false;
+ break;
+ //}
+ //if ($reg[0] != 'db') $ok=false;
+ }
+ //print __METHOD__." Result for checking we don't have non escaped string in sql requests for file ".$file."\n";
+ $this->assertTrue($ok, 'Found a forged SQL string that mix on same line the use of \' for PHP string and PHP variables into file '.$file['relativename'].' Use " to forge PHP string like this: $sql = "SELET ".$myvar...');
+ //exit;
+
+ // Check that forged sql string is using ' instead of " as string PHP quotes
+ $ok=true;
+ $matches=array();
+ preg_match_all('/\$sql \.?= \'SELECT.*\$/', $filecontent, $matches, PREG_SET_ORDER);
+ foreach ($matches as $key => $val) {
+ var_dump($matches);
+ $ok=false;
+ break;
+ }
+ $this->assertTrue($ok, 'Found a forged SQL string that mix on same line the use of \' for PHP string and PHP variables into file '.$file['relativename'].' Use " to forge PHP string like this: $sql = "SELET ".$myvar...');
+
// Check sql string VALUES ... , ".$xxx
// with xxx that is not 'db-' (for $db->escape). It means we forget a ' if string, or an (int) if int, when forging sql request.
+ $ok=true;
+ $matches=array();
preg_match_all('/(VALUES).*,\s*"\s*\.\s*\$(...)/', $filecontent, $matches, PREG_SET_ORDER);
foreach ($matches as $key => $val) {
if ($val[1] == 'VALUES' && $val[2] == 'db-') { // exclude $db->escape(
@@ -321,6 +348,8 @@ class CodingPhpTest extends PHPUnit\Framework\TestCase
// Check '".$xxx non escaped
// Check string ='".$this->xxx with xxx that is not 'escape'. It means we forget a db->escape when forging sql request.
+ $ok=true;
+ $matches=array();
preg_match_all('/=\s*\'"\s*\.\s*\$this->(....)/', $filecontent, $matches, PREG_SET_ORDER);
foreach ($matches as $key => $val) {
if ($val[1] != 'db->' && $val[1] != 'esca') {
@@ -332,6 +361,8 @@ class CodingPhpTest extends PHPUnit\Framework\TestCase
$this->assertTrue($ok, 'Found non escaped string in building of a sql request (case 1) in '.$file['relativename'].' - Bad.');
// Check string sql|set...'".$yyy->xxx with xxx that is not 'escape', 'idate', .... It means we forget a db->escape when forging sql request.
+ $ok=true;
+ $matches=array();
preg_match_all('/(sql|SET|WHERE|INSERT|VALUES).+\s*\'"\s*\.\s*\$(.........)/', $filecontent, $matches, PREG_SET_ORDER);
foreach ($matches as $key => $val) {
if (! in_array($val[2], array('this->db-', 'this->esc', 'db->escap', 'dbs->esca', 'mydb->esc', 'dbsession', 'db->idate', 'escapedli', 'excludeGr', 'includeGr'))) {
@@ -345,6 +376,8 @@ class CodingPhpTest extends PHPUnit\Framework\TestCase
//exit;
// Check string sql|set...'.$yyy->xxx with xxx that is not 'escape', 'idate', .... It means we forget a db->escape when forging sql request.
+ $ok=true;
+ $matches=array();
preg_match_all('/(\$sql|SET\s|WHERE\s|INSERT\s|VALUES\s|VALUES\().+\s*\'\s*\.\s*\$(.........)/', $filecontent, $matches, PREG_SET_ORDER);
foreach ($matches as $key => $val) {
if (! in_array($val[2], array('this->db-', 'db->sanit', 'conf->ent', 'key : \'\')', 'key])."\')', 'excludefi', 'regexstri', ''))) {
@@ -361,6 +394,8 @@ class CodingPhpTest extends PHPUnit\Framework\TestCase
// Checks with IN
// Check string 'IN (".xxx' or 'IN (\'.xxx' with xxx that is not '$this->db->sanitize' and not '$db->sanitize'. It means we forget a db->sanitize when forging sql request.
+ $ok=true;
+ $matches=array();
preg_match_all('/ IN \([\'"]\s*\.\s*(.........)/i', $filecontent, $matches, PREG_SET_ORDER);
foreach ($matches as $key => $val) {
if (!in_array($val[1], array('$db->sani', '$this->db', 'getEntity', 'WON\',\'L', 'self::STA', 'Commande:', 'CommandeF', 'Entrepot:', 'Facture::', 'FactureFo', 'ExpenseRe', 'Societe::', 'Ticket::S'))) {
@@ -374,6 +409,8 @@ class CodingPhpTest extends PHPUnit\Framework\TestCase
//exit;
// Check string 'IN (\'".xxx' with xxx that is not '$this->db->sanitize' and not '$db->sanitize'. It means we forget a db->sanitize when forging sql request.
+ $ok=true;
+ $matches=array();
preg_match_all('/ IN \(\'"\s*\.\s*(.........)/i', $filecontent, $matches, PREG_SET_ORDER);
foreach ($matches as $key => $val) {
if (!in_array($val[1], array('$db->sani', '$this->db', 'getEntity', 'WON\',\'L', 'self::STA', 'Commande:', 'CommandeF', 'Entrepot:', 'Facture::', 'FactureFo', 'ExpenseRe', 'Societe::', 'Ticket::S'))) {