diff --git a/build/makepack-howto.txt b/build/makepack-howto.txt
index 477d129d459..d4e37e32629 100644
--- a/build/makepack-howto.txt
+++ b/build/makepack-howto.txt
@@ -8,12 +8,13 @@ This files describe steps made by Dolibarr packaging team to make a
beta version of Dolibarr, step by step.
- Check all files are commited.
-- Update version/info in ChangeLog.
-To generate a changelog of a major new version x.y.0 (from develop repo), you can do "cd ~/git/dolibarr; git log `diff -u <(git rev-list --first-parent x.(y-1).0) <(git rev-list --first-parent develop) | sed -ne 's/^ //p' | head -1`.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa"
-To generate a changelog of a major new version x.y.0 (from x.y repo), you can do "cd ~/git/dolibarr_x.y; git log `diff -u <(git rev-list --first-parent x.(y-1).0) <(git rev-list --first-parent x.y.0) | sed -ne 's/^ //p' | head -1`.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa"
+- Update version/info in ChangeLog, for this you can:
+To generate a changelog of a major new version x.y.0 (from a repo on branch develop), you can do "cd ~/git/dolibarr; git log `diff -u <(git rev-list --first-parent x.(y-1).0) <(git rev-list --first-parent develop) | sed -ne 's/^ //p' | head -1`.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa"
+To generate a changelog of a major new version x.y.0 (from a repo on branch x.y repo), you can do "cd ~/git/dolibarr_x.y; git log `diff -u <(git rev-list --first-parent x.(y-1).0) <(git rev-list --first-parent x.y.0) | sed -ne 's/^ //p' | head -1`.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa"
To generate a changelog of a maintenance version x.y.z, you can do "cd ~/git/dolibarr_x.y; git log x.y.z-1.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa"
-- To know number of lines changes: git diff --shortstat A B
-- Update version number with x.y.z-w in htdocs/filefunc.inc.php
+Recopy the content of the output file into the file ChangeLog.
+- Note: To know number of lines changes: git diff --shortstat A B
+- Update version number with x.y.z-w in file htdocs/filefunc.inc.php
- Commit all changes.
- Run makepack-dolibarr.pl to generate all packages.
@@ -24,7 +25,6 @@ To generate a changelog of a maintenance version x.y.z, you can do "cd ~/git/dol
(/home/dolibarr/wwwroot/files/lastbuild).
- Post a news on dolibarr.org/dolibarr.fr + social networks
-- Send mail on mailings-list
***** Actions to do a RELEASE *****
@@ -32,12 +32,13 @@ This files describe steps made by Dolibarr packaging team to make a
complete release of Dolibarr, step by step.
- Check all files are commited.
-- Update version/info in ChangeLog.
-To generate a changelog of a major new version x.y.0 (from develop repo), you can do "cd ~/git/dolibarr; git log `diff -u <(git rev-list --first-parent x.(y-1).0) <(git rev-list --first-parent develop) | sed -ne 's/^ //p' | head -1`.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa"
-To generate a changelog of a major new version x.y.0 (from x.y repo), you can do "cd ~/git/dolibarr_x.y; git log `diff -u <(git rev-list --first-parent x.(y-1).0) <(git rev-list --first-parent x.y.0) | sed -ne 's/^ //p' | head -1`.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa"
+- Update version/info in ChangeLog, for this you can:
+To generate a changelog of a major new version x.y.0 (from a repo on branch develop), you can do "cd ~/git/dolibarr; git log `diff -u <(git rev-list --first-parent x.(y-1).0) <(git rev-list --first-parent develop) | sed -ne 's/^ //p' | head -1`.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa"
+To generate a changelog of a major new version x.y.0 (from a repo pn branch x.y), you can do "cd ~/git/dolibarr_x.y; git log `diff -u <(git rev-list --first-parent x.(y-1).0) <(git rev-list --first-parent x.y.0) | sed -ne 's/^ //p' | head -1`.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa"
To generate a changelog of a maintenance version x.y.z, you can do "cd ~/git/dolibarr_x.y; git log x.y.z-1.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa"
-- To know number of lines changes: git diff --shortstat A B
-- Update version number with x.y.z in htdocs/filefunc.inc.php
+Recopy the content of the output file into the file ChangeLog.
+- Note: To know the number of lines changes: git diff --shortstat A B
+- Update version number with x.y.z in file htdocs/filefunc.inc.php
- Commit all changes.
- Run makepack-dolibarr.pl to generate all packages.
@@ -52,4 +53,3 @@ To generate a changelog of a maintenance version x.y.z, you can do "cd ~/git/dol
on server to point to new files (used by some web sites).
- Post a news on dolibarr.org/dolibarr.fr + social networks
-- Send mail on mailings-list
diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php
index 1936d855a7e..b99d763b7b0 100644
--- a/htdocs/adherents/list.php
+++ b/htdocs/adherents/list.php
@@ -587,7 +587,7 @@ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
// List of mass actions available
$arrayofmassactions = array(
- //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').' '.$langs->trans("SendByMail"),
+ //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
//'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
);
if ($user->rights->adherent->creer) {
diff --git a/htdocs/admin/ihm.php b/htdocs/admin/ihm.php
index 2c997d746d9..fdfd8bb8fae 100644
--- a/htdocs/admin/ihm.php
+++ b/htdocs/admin/ihm.php
@@ -485,18 +485,17 @@ if ($mode == 'other') {
print '
';
print '';
- print $langs->trans("Miscelaneous");
- print ' ';
- print ' ';
+ print $langs->trans("Miscellaneous");
+ print '';
+ print ' ';
+ print '';
// Max size of lists
print '' . $langs->trans("DefaultMaxSizeList") . ' ';
- print ' ';
print ' ';
// Max size of short lists on customer card
print '' . $langs->trans("DefaultMaxSizeShortList") . ' ';
- print ' ';
print ' ';
// show input border
@@ -504,7 +503,6 @@ if ($mode == 'other') {
print ''.$langs->trans("showInputBorder").' ';
print $form->selectyesno('main_showInputBorder',isset($conf->global->THEME_ELDY_SHOW_BORDER_INPUT)?$conf->global->THEME_ELDY_SHOW_BORDER_INPUT:0,1);
print ' ';
- print ' ';
print ' ';
*/
@@ -512,21 +510,18 @@ if ($mode == 'other') {
print '' . $langs->trans("WeekStartOnDay") . ' ';
print $formother->select_dayofweek((isset($conf->global->MAIN_START_WEEK) ? $conf->global->MAIN_START_WEEK : '1'), 'MAIN_START_WEEK', 0);
print ' ';
- print ' ';
print ' ';
// DefaultWorkingDays
print '' . $langs->trans("DefaultWorkingDays") . ' ';
print ' ';
print ' ';
- print ' ';
print ' ';
// DefaultWorkingHours
print '' . $langs->trans("DefaultWorkingHours") . ' ';
print ' ';
print ' ';
- print ' ';
print ' ';
// Firstname/Name
@@ -534,7 +529,6 @@ if ($mode == 'other') {
$array = array(0 => $langs->trans("Firstname") . ' ' . $langs->trans("Lastname"), 1 => $langs->trans("Lastname") . ' ' . $langs->trans("Firstname"));
print $form->selectarray('MAIN_FIRSTNAME_NAME_POSITION', $array, (isset($conf->global->MAIN_FIRSTNAME_NAME_POSITION) ? $conf->global->MAIN_FIRSTNAME_NAME_POSITION : 0));
print '';
- print ' ';
print '';
// Hide unauthorized menus
@@ -542,7 +536,6 @@ if ($mode == 'other') {
//print $form->selectyesno('MAIN_MENU_HIDE_UNAUTHORIZED', isset($conf->global->MAIN_MENU_HIDE_UNAUTHORIZED) ? $conf->global->MAIN_MENU_HIDE_UNAUTHORIZED : 0, 1);
print ajax_constantonoff("MAIN_MENU_HIDE_UNAUTHORIZED", array(), $conf->entity, 0, 0, 1, 0, 0, 0, '', 'other');
print '';
- print ' ';
print '';
// Hide unauthorized button
@@ -550,7 +543,6 @@ if ($mode == 'other') {
//print $form->selectyesno('MAIN_BUTTON_HIDE_UNAUTHORIZED', isset($conf->global->MAIN_BUTTON_HIDE_UNAUTHORIZED) ? $conf->global->MAIN_BUTTON_HIDE_UNAUTHORIZED : 0, 1);
print ajax_constantonoff("MAIN_BUTTON_HIDE_UNAUTHORIZED", array(), $conf->entity, 0, 0, 1, 0, 0, 0, '', 'other');
print '';
- print ' ';
print '';
// Hide version link
@@ -559,7 +551,6 @@ if ($mode == 'other') {
print ''.$langs->trans("HideVersionLink").' ';
print $form->selectyesno('MAIN_HIDE_VERSION',$conf->global->MAIN_HIDE_VERSION,1);
print ' ';
- print ' ';
print ' ';
*/
@@ -569,7 +560,6 @@ if ($mode == 'other') {
print '';
print ' ';
print ' ';
- print ' ';
print '';
// Hide wiki link on login page
@@ -578,7 +568,6 @@ if ($mode == 'other') {
print ajax_constantonoff("MAIN_HELP_DISABLELINK", array(), $conf->entity, 0, 0, 1, 0, 0, 0, '', 'other');
//print $form->selectyesno('MAIN_HELP_DISABLELINK', isset($conf->global->MAIN_HELP_DISABLELINK) ? $conf->global->MAIN_HELP_DISABLELINK : 0, 1);
print '';
- print ' ';
print '';
// Disable javascript and ajax
@@ -586,8 +575,6 @@ if ($mode == 'other') {
print ajax_constantonoff("MAIN_DISABLE_JAVASCRIPT", array(), $conf->entity, 0, 0, 1, 0, 0, 0, '', 'other');
print ' ' . $langs->trans("DisableJavascriptNote") . ' ';
print '';
- print '';
- print ' ';
print '';
print '
' . "\n";
diff --git a/htdocs/admin/system/dolibarr.php b/htdocs/admin/system/dolibarr.php
index d10e789f39c..e58cf45dd7e 100644
--- a/htdocs/admin/system/dolibarr.php
+++ b/htdocs/admin/system/dolibarr.php
@@ -435,7 +435,8 @@ foreach ($configfileparameters as $key => $value) {
if (empty($valuetoshow)) {
print img_warning("EditConfigFileToAddEntry", 'dolibarr_main_instance_unique_id');
}
- print ' ('.$langs->trans("HashForPing").'='.md5('dolibarr'.$valuetoshow).') ';
+ print '';
+ print ' => '.$langs->trans("HashForPing").' '.md5('dolibarr'.$valuetoshow).' '."\n";
} elseif ($newkey == 'dolibarr_main_prod') {
print ${$newkey};
diff --git a/htdocs/api/class/api_documents.class.php b/htdocs/api/class/api_documents.class.php
index 9bf7dd7c117..81ba8e3b09d 100644
--- a/htdocs/api/class/api_documents.class.php
+++ b/htdocs/api/class/api_documents.class.php
@@ -611,6 +611,16 @@ class Documents extends DolibarrApi
require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
$object = new FactureFournisseur($this->db);
+ } elseif ($modulepart == 'commande' || $modulepart == 'order') {
+ $modulepart = 'commande';
+
+ require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
+ $object = new Commande($this->db);
+ } elseif ($modulepart == 'commande_fournisseur' || $modulepart == 'supplier_order') {
+ $modulepart = 'supplier_order';
+
+ require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
+ $object = new CommandeFournisseur($this->db);
} elseif ($modulepart == 'project') {
require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
$object = new Project($this->db);
@@ -669,7 +679,7 @@ class Documents extends DolibarrApi
}
// Special cases that need to use get_exdir to get real dir of object
- // If future, all object should use this to define path of documents.
+ // In future, all object should use this to define path of documents.
if ($modulepart == 'supplier_invoice') {
$tmpreldir = get_exdir($object->id, 2, 0, 0, $object, 'invoice_supplier');
}
diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php
index f6989d90d59..07e041a8fd1 100644
--- a/htdocs/comm/propal/card.php
+++ b/htdocs/comm/propal/card.php
@@ -1646,17 +1646,17 @@ if ($action == 'create') {
print '';
// Validaty duration
- print ''.$langs->trans("ValidityDuration").' '.img_picto('', 'clock').' '.$langs->trans("days").' ';
+ print ''.$langs->trans("ValidityDuration").' '.img_picto('', 'clock', 'class="paddingright"').' '.$langs->trans("days").' ';
// Terms of payment
print ''.$langs->trans('PaymentConditionsShort').' ';
- print img_picto('', 'paiment');
+ print img_picto('', 'payment', 'class="pictofixedwidth"');
$form->select_conditions_paiements((GETPOSTISSET('cond_reglement_id') && GETPOST('cond_reglement_id') != 0) ? GETPOST('cond_reglement_id', 'int') : $soc->cond_reglement_id, 'cond_reglement_id', -1, 1);
print ' ';
// Mode of payment
print ''.$langs->trans('PaymentMode').' ';
- print img_picto('', 'bank').' ';
+ print img_picto('', 'bank', 'class="pictofixedwidth"');
$form->select_types_paiements((GETPOSTISSET('mode_reglement_id') ? GETPOST('mode_reglement_id', 'int') : $soc->mode_reglement_id), 'mode_reglement_id', 'CRDT', 0, 1, 0, 0, 1, 'maxwidth200 widthcentpercentminusx');
print ' ';
@@ -1679,7 +1679,7 @@ if ($action == 'create') {
print ' ('.$langs->trans('AfterOrder').')';
}
print '';
- print img_picto('', 'clock').' ';
+ print img_picto('', 'clock', 'class="pictofixedwidth"');
$form->selectAvailabilityDelay('', 'availability_id', '', 1, 'maxwidth200 widthcentpercentminusx');
print ' ';
@@ -1741,7 +1741,7 @@ if ($action == 'create') {
print '';
print ''.$langs->trans("DefaultModel").' ';
print '';
- print img_picto('', 'pdf').' ';
+ print img_picto('', 'pdf', 'class="pictofixedwidth"');
$liste = ModelePDFPropales::liste_modeles($db);
$preselected = (!empty($conf->global->PROPALE_ADDON_PDF_ODT_DEFAULT) ? $conf->global->PROPALE_ADDON_PDF_ODT_DEFAULT : getDolGlobalString("PROPALE_ADDON_PDF"));
print $form->selectarray('model', $liste, $preselected, 0, 0, 0, '', 0, 0, 0, '', 'maxwidth200 widthcentpercentminusx', 1);
@@ -1752,7 +1752,7 @@ if ($action == 'create') {
print ' ';
print ''.$form->editfieldkey('Currency', 'multicurrency_code', '', $object, 0).' ';
print '';
- print $form->selectMultiCurrency($currency_code, 'multicurrency_code', 0);
+ print img_picto('', 'currency', 'class="pictofixedwidth"').$form->selectMultiCurrency($currency_code, 'multicurrency_code', 0);
print ' ';
}
diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php
index 53b6d40d6b0..d33ea387947 100644
--- a/htdocs/commande/card.php
+++ b/htdocs/commande/card.php
@@ -1670,7 +1670,7 @@ if ($action == 'create' && $usercancreate) {
// Terms of the settlement
print ''.$langs->trans('PaymentConditionsShort').' ';
- print img_picto('', 'paiment');
+ print img_picto('', 'payment', 'class="pictofixedwidth"');
$form->select_conditions_paiements($cond_reglement_id, 'cond_reglement_id', - 1, 1);
print ' ';
@@ -1759,10 +1759,10 @@ if ($action == 'create' && $usercancreate) {
// Template to use by default
print ''.$langs->trans('DefaultModel').' ';
print '';
- print img_picto('', 'pdf', 'class="pictofixedwidth"');
include_once DOL_DOCUMENT_ROOT.'/core/modules/commande/modules_commande.php';
$liste = ModelePDFCommandes::liste_modeles($db);
$preselected = $conf->global->COMMANDE_ADDON_PDF;
+ print img_picto('', 'pdf', 'class="pictofixedwidth"');
print $form->selectarray('model', $liste, $preselected, 0, 0, 0, '', 0, 0, 0, '', 'maxwidth200 widthcentpercentminusx', 1);
print " ";
@@ -1771,7 +1771,7 @@ if ($action == 'create' && $usercancreate) {
print '';
print ''.$form->editfieldkey("Currency", 'multicurrency_code', '', $object, 0).' ';
print '';
- print $form->selectMultiCurrency($currency_code, 'multicurrency_code');
+ print img_picto('', 'currency', 'class="pictofixedwidth"').$form->selectMultiCurrency($currency_code, 'multicurrency_code');
print ' ';
}
diff --git a/htdocs/compta/bank/card.php b/htdocs/compta/bank/card.php
index 8ca3272dd78..0c61cf0a3c2 100644
--- a/htdocs/compta/bank/card.php
+++ b/htdocs/compta/bank/card.php
@@ -778,13 +778,13 @@ if ($action == 'create') {
print '';
if ($conf->prelevement->enabled) {
- print ''.$langs->trans("ICS").' ('.$langs->trans("StandingOrder").') ';
+ print ''.$form->textwithpicto($langs->trans("ICS"), $langs->trans("ICS").' ('.$langs->trans("UsedFor", $langs->transnoentitiesnoconv("StandingOrder")).')').' ';
print ''.$object->ics.' ';
print ' ';
}
if ($conf->paymentbybanktransfer->enabled) {
- print ''.$langs->trans("ICS").' ('.$langs->trans("BankTransfer").') ';
+ print ''.$form->textwithpicto($langs->trans("IDS"), $langs->trans("IDS").' ('.$langs->trans("UsedFor", $langs->transnoentitiesnoconv("BankTransfer")).')').' ';
print ''.$object->ics_transfer.' ';
print ' ';
@@ -1082,12 +1082,12 @@ if ($action == 'create') {
print ' ';
if ($conf->prelevement->enabled) {
- print ''.$langs->trans("ICS").' ('.$langs->trans("StandingOrder").') ';
+ print ''.$form->textwithpicto($langs->trans("ICS"), $langs->trans("ICS").' ('.$langs->trans("UsedFor", $langs->transnoentitiesnoconv("StandingOrder")).')').' ';
print ' ';
}
if ($conf->paymentbybanktransfer->enabled) {
- print ''.$langs->trans("ICS").' ('.$langs->trans("BankTransfer").') ';
+ print ''.$form->textwithpicto($langs->trans("IDS"), $langs->trans("IDS").' ('.$langs->trans("UsedFor", $langs->transnoentitiesnoconv("BankTransfer")).')').' ';
print ' ';
print ''.$langs->trans("SEPAXMLPlacePaymentTypeInformationInCreditTransfertransactionInformation").' ';
diff --git a/htdocs/compta/facture/class/api_invoices.class.php b/htdocs/compta/facture/class/api_invoices.class.php
index 551edb05731..3623a36cbb9 100644
--- a/htdocs/compta/facture/class/api_invoices.class.php
+++ b/htdocs/compta/facture/class/api_invoices.class.php
@@ -1724,8 +1724,8 @@ class Invoices extends DolibarrApi
*
* Return an array with invoice informations
*
- * @param int $id ID of template invoice
- * @param int $contact_list 0:Return array contains all properties, 1:Return array contains just id, 1: Return array contains just id, -1: Do not return contacts/adddesses
+ * @param int $id ID of template invoice
+ * @param int $contact_list 0:Return array contains all properties, 1:Return array contains just id, -1: Do not return contacts/adddesses
* @return array|mixed data without useless information
*
* @url GET templates/{id}
diff --git a/htdocs/compta/localtax/card.php b/htdocs/compta/localtax/card.php
index 35c6aa399fe..9bd37eafa36 100644
--- a/htdocs/compta/localtax/card.php
+++ b/htdocs/compta/localtax/card.php
@@ -32,8 +32,8 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/vat.lib.php';
$langs->loadLangs(array('compta', 'banks', 'bills'));
$id = GETPOST("id", 'int');
-$action = GETPOST("action", "alpha");
-$cancel = GETPOST('cancel');
+$action = GETPOST("action", "aZ09");
+$cancel = GETPOST('cancel', 'aZ09');
$refund = GETPOST("refund", "int");
if (empty($refund)) {
@@ -143,7 +143,7 @@ $form = new Form($db);
$title = $langs->trans("LT".$object->ltt)." - ".$langs->trans("Card");
$help_url = '';
-llxHeader("", $title, $helpurl);
+llxHeader('', $title, $helpurl);
if ($action == 'create') {
print load_fiche_titre($langs->transcountry($lttype == 2 ? "newLT2Payment" : "newLT1Payment", $mysoc->country_code));
@@ -157,11 +157,13 @@ if ($action == 'create') {
print '';
+ // Date of payment
print "";
print ''.$langs->trans("DatePayment").' ';
print $form->selectDate($datep, "datep", '', '', '', 'add', 1, 1);
print ' ';
+ // End date of period
print ''.$form->textwithpicto($langs->trans("PeriodEndDate"), $langs->trans("LastDayTaxIsRelatedTo")).' ';
print $form->selectDate($datev, "datev", '', '', '', 'add', 1, 1);
print ' ';
@@ -173,20 +175,24 @@ if ($action == 'create') {
print ''.$langs->trans("Amount").' ';
if (!empty($conf->banque->enabled)) {
- print ''.$langs->trans("Account").' ';
- $form->select_comptes(GETPOST("accountid", "int"), "accountid", 0, "courant=1", 2); // Affiche liste des comptes courant
- print ' ';
-
+ // Type payment
print ''.$langs->trans("PaymentMode").' ';
- $form->select_types_paiements(GETPOST("paiementtype"), "paiementtype");
+ $form->select_types_paiements(GETPOST("paiementtype"), "paiementtype", '', 0, 1, 0, 0, 1, 'maxwidth500 widthcentpercentminusx');
print " \n";
print " ";
+ // Bank account
+ print ''.$langs->trans("Account").' ';
+ print img_picto('', 'bank_account', 'pictofixedwidth');
+ $form->select_comptes(GETPOST("accountid", "int"), "accountid", 0, "courant=1", 2, '', 0, 'maxwidth500 widthcentpercentminusx'); // Affiche liste des comptes courant
+ print ' ';
+
// Number
print ''.$langs->trans('Numero');
print ' ('.$langs->trans("ChequeOrTransferNumber").') ';
print ' '."\n";
}
+
// Other attributes
$parameters = array();
$reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
diff --git a/htdocs/compta/localtax/list.php b/htdocs/compta/localtax/list.php
index 6590e250832..6f6fc303262 100644
--- a/htdocs/compta/localtax/list.php
+++ b/htdocs/compta/localtax/list.php
@@ -63,6 +63,7 @@ if ($result) {
$i = 0;
$total = 0;
+ print ''; // You can use div-table-responsive-no-min if you dont need reserved height for your table
print '
';
print '';
print ''.$langs->trans("Ref").' ';
@@ -85,7 +86,7 @@ if ($result) {
print ''.dol_print_date($db->jdate($obj->datep), 'day')." \n";
$total = $total + $obj->amount;
- print "".price($obj->amount)." ";
+ print ''.price($obj->amount).' ';
print " \n";
$i++;
@@ -94,6 +95,8 @@ if ($result) {
print ''.price($total).' ';
print "
";
+ print '
';
+
$db->free($result);
} else {
dol_print_error($db);
diff --git a/htdocs/compta/paiement/class/paiement.class.php b/htdocs/compta/paiement/class/paiement.class.php
index c5f40896a18..ae4064462e2 100644
--- a/htdocs/compta/paiement/class/paiement.class.php
+++ b/htdocs/compta/paiement/class/paiement.class.php
@@ -419,7 +419,8 @@ class Paiement extends CommonObject
}
if ($error) {
- setEventMessages($discount->error, $discount->errors, 'errors');
+ $this->error = $discount->error;
+ $this->errors = $discount->errors;
$error++;
}
}
@@ -460,7 +461,8 @@ class Paiement extends CommonObject
$result = $invoice->generateDocument($invoice->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
if ($result < 0) {
- setEventMessages($invoice->error, $invoice->errors, 'errors');
+ $this->error = $invoice->error;
+ $this->errors = $invoice->errors;
$error++;
}
}
diff --git a/htdocs/compta/paiement_vat.php b/htdocs/compta/paiement_vat.php
index ce224735927..28bc838c296 100644
--- a/htdocs/compta/paiement_vat.php
+++ b/htdocs/compta/paiement_vat.php
@@ -207,14 +207,15 @@ if ($action == 'create') {
print '';
print ''.$langs->trans("PaymentMode").' ';
- $form->select_types_paiements(GETPOSTISSET("paiementtype") ? GETPOST("paiementtype", "int") : $tva->paiementtype, "paiementtype");
+ $form->select_types_paiements(GETPOSTISSET("paiementtype") ? GETPOST("paiementtype", "int") : $tva->paiementtype, "paiementtype", '', 0, 1, 0, 0, 1, 'maxwidth500 widthcentpercentminusx');
print " \n";
print ' ';
print '';
print ''.$langs->trans('AccountToDebit').' ';
print '';
- $form->select_comptes(GETPOST("accountid") ? GETPOST("accountid", "int") : $tva->accountid, "accountid", 0, '', 1); // Show opend bank account list
+ print img_picto('', 'bank_account', 'pictofixedwidth');
+ $form->select_comptes(GETPOST("accountid", "int") ? GETPOST("accountid", "int") : $tva->accountid, "accountid", 0, '', 1, '', 0, 'maxwidth500 widthcentpercentminusx'); // Show opend bank account list
print ' ';
// Number
@@ -225,7 +226,7 @@ if ($action == 'create') {
print '';
print ''.$langs->trans("Comments").' ';
- print ' ';
+ print ' ';
print ' ';
print '
';
@@ -238,6 +239,7 @@ if ($action == 'create') {
$num = 1;
$i = 0;
+ print ''; // You can use div-table-responsive-no-min if you dont need reserved height for your table
print '
";
+ print '
';
// Bouton Save payment
print ' '.$langs->trans("ClosePaidVATAutomatically");
diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php
index 36d3afd42ad..4f9eb4e456e 100644
--- a/htdocs/compta/prelevement/class/bonprelevement.class.php
+++ b/htdocs/compta/prelevement/class/bonprelevement.class.php
@@ -922,7 +922,7 @@ class BonPrelevement extends CommonObject
$sql = "SELECT substring(ref from char_length(ref) - 1)"; // To extract "YYMMXX" from "TYYMMXX"
$sql .= " FROM ".MAIN_DB_PREFIX."prelevement_bons";
- $sql .= " WHERE ref LIKE '%".$this->db->escape($ref)."%'";
+ $sql .= " WHERE ref LIKE '_".$this->db->escape($ref)."%'";
$sql .= " AND entity = ".((int) $conf->entity);
$sql .= " ORDER BY ref DESC LIMIT 1";
@@ -933,7 +933,7 @@ class BonPrelevement extends CommonObject
$row = $this->db->fetch_row($resql);
// Build the new ref
- $ref = "T".$ref.str_pad(dol_substr("00".(intval($row[0]) + 1), 0, 2), 2, "0", STR_PAD_LEFT);
+ $ref = "T".$ref.sprintf("%02d", (intval($row[0]) + 1));
// $conf->abc->dir_output may be:
// /home/ldestailleur/git/dolibarr_15.0/documents/abc/
diff --git a/htdocs/compta/tva/card.php b/htdocs/compta/tva/card.php
index 538b561e7fe..ed37c72c1c4 100644
--- a/htdocs/compta/tva/card.php
+++ b/htdocs/compta/tva/card.php
@@ -460,7 +460,7 @@ if ($action == 'create') {
print '
';
print '';
- //print " \n";
+ print " \n";
// Label
if ($refund == 1) {
@@ -490,14 +490,15 @@ if ($action == 'create') {
// Type payment
print ''.$langs->trans("PaymentMode").' ';
- $form->select_types_paiements(GETPOST("type_payment"), "type_payment");
+ $form->select_types_paiements(GETPOST("type_payment", 'int'), "type_payment", '', 0, 1, 0, 0, 1, 'maxwidth500 widthcentpercentminusx');
print " \n";
print " ";
if (!empty($conf->banque->enabled)) {
+ // Bank account
print ''.$langs->trans("BankAccount").' ';
print img_picto('', 'bank_account', 'pictofixedwidth');
- $form->select_comptes(GETPOST("accountid", 'int'), "accountid", 0, "courant=1", 1); // List of bank account available
+ $form->select_comptes(GETPOST("accountid", 'int'), "accountid", 0, "courant=1", 1, '', 0, 'maxwidth500 widthcentpercentminusx'); // List of bank account available
print ' ';
}
@@ -509,7 +510,7 @@ if ($action == 'create') {
// Comments
print '';
print ''.$langs->trans("Comments").' ';
- print ' ';
+ print ' ';
print ' ';
// Other attributes
diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php
index b9812d8eec3..749b4dddb13 100644
--- a/htdocs/core/class/html.form.class.php
+++ b/htdocs/core/class/html.form.class.php
@@ -5872,6 +5872,7 @@ class Form
}
$out .= '';
+
// Make select dynamic
include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
$out .= ajax_combobox($htmlname);
@@ -7753,13 +7754,6 @@ class Form
}
}
- // Add code for jquery to use multiselect
- if ($addjscombo && $jsbeautify) {
- // Enhance with select2
- include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
- $out .= ajax_combobox($htmlname, array(), 0, 0, 'resolve', $show_empty < 0 ? (string) $show_empty : '-1');
- }
-
$out .= 'gravatar->enabled) && $email && empty($noexternsourceoverwrite)) {
// see https://gravatar.com/site/implement/images/php/
$ret .= '';
- $ret .= ' '; // gravatar need md5 hash
+ $ret .= ' '; // gravatar need md5 hash
} else {
if ($nophoto == 'company') {
- $ret .= ''.img_picto('', 'company').'
';
+ $ret .= ''.img_picto('', 'company').'
';
} else {
- $ret .= ' ';
+ $ret .= ' ';
}
}
}
diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php
index 1d3faca93cb..acb7d5b5f2a 100644
--- a/htdocs/core/class/html.formfile.class.php
+++ b/htdocs/core/class/html.formfile.class.php
@@ -246,10 +246,10 @@ class FormFile
$out .= ''.$options.' ';
}
$out .= '';
- $out .= ' ';
- $out .= '';
+ $out .= ' ';
+ $out .= '';
$out .= $langs->trans("SaveUploadedFileWithMask", preg_replace('/__file__/', $langs->transnoentitiesnoconv("OriginFileName"), $savingdocmask), $langs->transnoentitiesnoconv("OriginFileName"));
- $out .= ' ';
+ $out .= '';
$out .= ' ';
$out .= '';
}
diff --git a/htdocs/core/class/html.formprojet.class.php b/htdocs/core/class/html.formprojet.class.php
index aa7a38969be..27a8c9de3eb 100644
--- a/htdocs/core/class/html.formprojet.class.php
+++ b/htdocs/core/class/html.formprojet.class.php
@@ -56,28 +56,34 @@ class FormProjets
/**
* Output a combo list with projects qualified for a third party / user
*
- * @param int $socid Id third party (-1=all, 0=only projects not linked to a third party, id=projects not linked or linked to third party id)
- * @param string $selected Id project preselected ('' or id of project)
- * @param string $htmlname Name of HTML field
- * @param int $maxlength Maximum length of label
- * @param int $option_only Return only html options lines without the select tag
- * @param int $show_empty Add an empty line
- * @param int $discard_closed Discard closed projects (0=Keep, 1=hide completely, 2=Disable). Use a negative value to not show the "discarded" tooltip.
- * @param int $forcefocus Force focus on field (works with javascript only)
- * @param int $disabled Disabled
- * @param int $mode 0 for HTML mode and 1 for JSON mode
- * @param string $filterkey Key to filter
- * @param int $nooutput No print output. Return it only.
- * @param int $forceaddid Force to add project id in list, event if not qualified
- * @param string $morecss More css
- * @param int $htmlid Html id to use instead of htmlname
- * @return string Return html content
+ * @param int $socid Id third party (-1=all, 0=only projects not linked to a third party, id=projects not linked or linked to third party id)
+ * @param string|Project $selected Id of preselected project or Project (or ''). Note: If you know the ref, you can also provide it into $selected_input_value to save one request in some cases.
+ * @param string $htmlname Name of HTML field
+ * @param int $maxlength Maximum length of label
+ * @param int $option_only Return only html options lines without the select tag
+ * @param int $show_empty Add an empty line
+ * @param int $discard_closed Discard closed projects (0=Keep, 1=hide completely, 2=Disable). Use a negative value to not show the "discarded" tooltip.
+ * @param int $forcefocus Force focus on field (works with javascript only)
+ * @param int $disabled Disabled
+ * @param int $mode 0 for HTML mode and 1 for JSON mode
+ * @param string $filterkey Key to filter
+ * @param int $nooutput No print output. Return it only.
+ * @param int $forceaddid Force to add project id in list, event if not qualified
+ * @param string $morecss More css
+ * @param int $htmlid Html id to use instead of htmlname
+ * @return string Return html content
*/
public function select_projects($socid = -1, $selected = '', $htmlname = 'projectid', $maxlength = 16, $option_only = 0, $show_empty = 1, $discard_closed = 0, $forcefocus = 0, $disabled = 0, $mode = 0, $filterkey = '', $nooutput = 0, $forceaddid = 0, $morecss = '', $htmlid = '')
{
// phpcs:enable
global $langs, $conf, $form;
+ $selected_input_value = '';
+ if (is_object($selected)) {
+ $selected_input_value = $selected->ref;
+ $selected = $selected->id;
+ }
+
$out = '';
if (!empty($conf->use_javascript_ajax) && !empty($conf->global->PROJECT_USE_SEARCH_TO_SELECT)) {
@@ -89,22 +95,20 @@ class FormProjets
$project->fetch($selected);
$selected_input_value = $project->ref;
}
- $urloption = 'socid='.$socid.'&htmlname='.$htmlname.'&discardclosed='.$discard_closed;
+ $urloption = 'socid='.((int) $socid).'&htmlname='.urlencode($htmlname).'&discardclosed='.((int) $discard_closed);
+
+ $out .= ' ';
+
$out .= ajax_autocompleter($selected, $htmlname, DOL_URL_ROOT.'/projet/ajax/projects.php', $urloption, $conf->global->PROJECT_USE_SEARCH_TO_SELECT, 0, array(
// 'update' => array(
// 'projectid' => 'id'
// )
));
-
- $out .= ' ';
} else {
$out .= $this->select_projects_list($socid, $selected, $htmlname, $maxlength, $option_only, $show_empty, abs($discard_closed), $forcefocus, $disabled, 0, $filterkey, 1, $forceaddid, $htmlid, $morecss);
}
if ($discard_closed > 0) {
- if (class_exists('Form')) {
- if (!is_object($form)) {
- $form = new Form($this->db);
- }
+ if (!empty($form)) {
$out .= $form->textwithpicto('', $langs->trans("ClosedProjectsAreHidden"));
}
}
diff --git a/htdocs/core/class/rssparser.class.php b/htdocs/core/class/rssparser.class.php
index c3c434d1aed..93224b9f04d 100644
--- a/htdocs/core/class/rssparser.class.php
+++ b/htdocs/core/class/rssparser.class.php
@@ -227,11 +227,16 @@ class RssParser
} else {
try {
$result = getURLContent($this->_urlRSS, 'GET', '', 1, array(), array('http', 'https'), 0);
+
if (!empty($result['content'])) {
$str = $result['content'];
+ } elseif (!empty($result['curl_error_msg'])) {
+ $this->error = 'Error retrieving URL '.$this->_urlRSS.' - '.$result['curl_error_msg'];
+ return -1;
}
} catch (Exception $e) {
- print 'Error retrieving URL '.$this->_urlRSS.' - '.$e->getMessage();
+ $this->error = 'Error retrieving URL '.$this->_urlRSS.' - '.$e->getMessage();
+ return -2;
}
}
@@ -248,7 +253,8 @@ class RssParser
}
$xmlparser = xml_parser_create('');
- if (!is_resource($xmlparser)) {
+
+ if (!is_resource($xmlparser) && !is_object($xmlparser)) {
$this->error = "ErrorFailedToCreateParser";
return -1;
}
@@ -256,10 +262,11 @@ class RssParser
xml_set_object($xmlparser, $this);
xml_set_element_handler($xmlparser, 'feed_start_element', 'feed_end_element');
xml_set_character_data_handler($xmlparser, 'feed_cdata');
+
$status = xml_parse($xmlparser, $str);
xml_parser_free($xmlparser);
$rss = $this;
- //var_dump($rss->_format);exit;
+ //var_dump($status.' '.$rss->_format);exit;
}
}
diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php
index 24557d1e90e..51741179753 100644
--- a/htdocs/core/lib/functions.lib.php
+++ b/htdocs/core/lib/functions.lib.php
@@ -3730,7 +3730,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $
'bank_account', 'barcode', 'bank', 'bell', 'bill', 'billa', 'billr', 'billd', 'bookmark', 'bom', 'briefcase-medical', 'bug', 'building',
'card', 'calendar', 'calendarmonth', 'calendarweek', 'calendarday', 'calendarperuser', 'calendarpertype',
'cash-register', 'category', 'chart', 'check', 'clock', 'close_title', 'cog', 'collab', 'company', 'contact', 'country', 'contract', 'conversation', 'cron', 'cubes',
- 'multicurrency',
+ 'currency', 'multicurrency',
'delete', 'dolly', 'dollyrevert', 'donation', 'download', 'dynamicprice',
'edit', 'ellipsis-h', 'email', 'entity', 'eraser', 'establishment', 'expensereport', 'external-link-alt', 'external-link-square-alt',
'filter', 'file-code', 'file-export', 'file-import', 'file-upload', 'autofill', 'folder', 'folder-open', 'folder-plus',
@@ -3789,7 +3789,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $
'switch_off'=>'toggle-off', 'switch_on'=>'toggle-on', 'switch_on_red'=>'toggle-on', 'check'=>'check', 'bookmark'=>'star',
'bank'=>'university', 'close_title'=>'times', 'delete'=>'trash', 'filter'=>'filter',
'list-alt'=>'list-alt', 'calendar'=>'calendar-alt', 'calendarmonth'=>'calendar-alt', 'calendarweek'=>'calendar-week', 'calendarday'=>'calendar-day', 'calendarperuser'=>'table',
- 'intervention'=>'ambulance', 'invoice'=>'file-invoice-dollar', 'multicurrency'=>'dollar-sign', 'order'=>'file-invoice',
+ 'intervention'=>'ambulance', 'invoice'=>'file-invoice-dollar', 'currency'=>'dollar-sign', 'multicurrency'=>'dollar-sign', 'order'=>'file-invoice',
'error'=>'exclamation-triangle', 'warning'=>'exclamation-triangle',
'other'=>'square',
'playdisabled'=>'play', 'pdf'=>'file-pdf', 'poll'=>'check-double', 'pos'=>'cash-register', 'preview'=>'binoculars', 'project'=>'project-diagram', 'projectpub'=>'project-diagram', 'projecttask'=>'tasks', 'propal'=>'file-signature',
@@ -3866,7 +3866,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $
'ecm'=>'infobox-action', 'eventorganization'=>'infobox-project',
'hrm'=>'infobox-adherent', 'group'=>'infobox-adherent', 'intervention'=>'infobox-contrat',
'incoterm'=>'infobox-supplier_proposal',
- 'multicurrency'=>'infobox-bank_account',
+ 'currency'=>'infobox-bank_account', 'multicurrency'=>'infobox-bank_account',
'members'=>'infobox-adherent', 'member'=>'infobox-adherent', 'money-bill-alt'=>'infobox-bank_account',
'order'=>'infobox-commande',
'user'=>'infobox-adherent', 'users'=>'infobox-adherent',
diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php
index c963c74c8b6..9bc0a59cf86 100644
--- a/htdocs/core/lib/usergroups.lib.php
+++ b/htdocs/core/lib/usergroups.lib.php
@@ -367,6 +367,7 @@ function showSkins($fuser, $edit = 0, $foruserprofile = false)
$url = 'https://www.dolistore.com/9-skins';
print '';
print $langs->trans('DownloadMoreSkins');
+ print img_picto('', 'globe', 'class="paddingleft"');
print ' ';
print '';
}
@@ -435,7 +436,9 @@ function showSkins($fuser, $edit = 0, $foruserprofile = false)
$colorbacktitle1 = '';
$colortexttitle = '';
$colorbacklineimpair1 = '';
+ $colorbacklineimpair2 = '';
$colorbacklinepair1 = '';
+ $colorbacklinepair2 = '';
$colortextlink = '';
$colorbacklinepairhover = '';
$colorbacklinepairhover = '';
@@ -746,7 +749,7 @@ function showSkins($fuser, $edit = 0, $foruserprofile = false)
print ''.$langs->trans("BackgroundTableLineOddColor").' ';
print '';
if ($edit) {
- print $formother->selectColor(colorArrayToHex(colorStringToArray((!empty($conf->global->THEME_ELDY_LINEIMPAIR1) ? $conf->global->THEME_ELDY_LINEIMPAIR1 : ''), array()), ''), 'THEME_ELDY_LINEIMPAIR1', '', 1, '', '', 'colorbacklinepair2').' ';
+ print $formother->selectColor(colorArrayToHex(colorStringToArray((!empty($conf->global->THEME_ELDY_LINEIMPAIR1) ? $conf->global->THEME_ELDY_LINEIMPAIR1 : ''), array()), ''), 'THEME_ELDY_LINEIMPAIR1', '', 1, '', '', 'colorbacklineimpair2').' ';
} else {
$color = colorArrayToHex(colorStringToArray($conf->global->THEME_ELDY_LINEIMPAIR1, array()), '');
if ($color) {
@@ -770,7 +773,7 @@ function showSkins($fuser, $edit = 0, $foruserprofile = false)
print ' '.$langs->trans("BackgroundTableLineEvenColor").' ';
print '';
if ($edit) {
- print $formother->selectColor(colorArrayToHex(colorStringToArray((!empty($conf->global->THEME_ELDY_LINEPAIR1) ? $conf->global->THEME_ELDY_LINEPAIR1 : ''), array()), ''), 'THEME_ELDY_LINEPAIR1', '', 1, '', '', 'colorbacklineimpair2').' ';
+ print $formother->selectColor(colorArrayToHex(colorStringToArray((!empty($conf->global->THEME_ELDY_LINEPAIR1) ? $conf->global->THEME_ELDY_LINEPAIR1 : ''), array()), ''), 'THEME_ELDY_LINEPAIR1', '', 1, '', '', 'colorbacklinepair2').' ';
} else {
$color = colorArrayToHex(colorStringToArray($conf->global->THEME_ELDY_LINEPAIR1, array()), '');
if ($color) {
diff --git a/htdocs/core/modules/modPartnership.class.php b/htdocs/core/modules/modPartnership.class.php
index 3bec23d0d37..c08cf66db06 100644
--- a/htdocs/core/modules/modPartnership.class.php
+++ b/htdocs/core/modules/modPartnership.class.php
@@ -219,19 +219,21 @@ class modPartnership extends DolibarrModules
// Label of tables
'tablib'=>array("PartnershipType"),
// Request to select fields
- 'tabsql'=>array('SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'c_partnership_type as f WHERE f.entity = '.$conf->entity),
+ 'tabsql'=>array('SELECT f.rowid as rowid, f.code, f.label, f.keyword, f.active FROM '.MAIN_DB_PREFIX.'c_partnership_type as f WHERE f.entity = '.((int) $conf->entity)),
// Sort order
'tabsqlsort'=>array("label ASC"),
// List of fields (result of select to show dictionary)
- 'tabfield'=>array("code,label"),
+ 'tabfield'=>array("code,label,keyword"),
// List of fields (list of fields to edit a record)
- 'tabfieldvalue'=>array("code,label"),
+ 'tabfieldvalue'=>array("code,label,keyword"),
// List of fields (list of fields for insert)
- 'tabfieldinsert'=>array("code,label"),
+ 'tabfieldinsert'=>array("code,label,keyword"),
// Name of columns with primary key (try to always name it 'rowid')
'tabrowid'=>array("rowid"),
// Condition to show each dictionary
- 'tabcond'=>array($conf->partnership->enabled)
+ 'tabcond'=>array($conf->partnership->enabled),
+ // Help tooltip for each fields of the dictionary
+ 'tabhelp'=>array(array('keyword'=>$langs->trans('KeywordToCheckInWebsite')))
);
// Boxes/Widgets
@@ -428,7 +430,7 @@ class modPartnership extends DolibarrModules
$sql = array();
// Document templates
- $moduledir = 'partnership';
+ $moduledir = dol_sanitizeFileName('partnership');
$myTmpObjects = array();
$myTmpObjects['Partnership'] = array('includerefgeneration'=>0, 'includedocgeneration'=>0);
@@ -437,8 +439,8 @@ class modPartnership extends DolibarrModules
continue;
}
if ($myTmpObjectArray['includerefgeneration']) {
- $src = DOL_DOCUMENT_ROOT.'/install/doctemplates/partnership/template_partnerships.odt';
- $dirodt = DOL_DATA_ROOT.'/doctemplates/partnership';
+ $src = DOL_DOCUMENT_ROOT.'/install/doctemplates/'.$moduledir.'/template_partnerships.odt';
+ $dirodt = DOL_DATA_ROOT.'/doctemplates/'.$moduledir;
$dest = $dirodt.'/template_partnerships.odt';
if (file_exists($src) && !file_exists($dest)) {
diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php
index 7e5746bf9bb..0aa8eb93d9d 100644
--- a/htdocs/fourn/facture/card.php
+++ b/htdocs/fourn/facture/card.php
@@ -1904,7 +1904,7 @@ if ($action == 'create') {
$currency_code = $conf->currency;
$societe = '';
- if (GETPOST('socid') > 0) {
+ if (GETPOST('socid', 'int') > 0) {
$societe = new Societe($db);
$societe->fetch(GETPOST('socid', 'int'));
if (!empty($conf->multicurrency->enabled) && !empty($societe->multicurrency_code)) {
@@ -3466,10 +3466,9 @@ if ($action == 'create') {
// Remainder to pay
print ' ';
print '';
- if ($resteapayeraffiche >= 0) {
- print $langs->trans('RemainderToPay');
- } else {
- print $langs->trans('ExcessPaid');
+ print $langs->trans('RemainderToPay');
+ if ($resteapayeraffiche < 0) {
+ print ' ('.$langs->trans('NegativeIfExcessPaid').')';
}
print ' ';
print ' ';
@@ -3479,10 +3478,9 @@ if ($action == 'create') {
if ($object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) {
print '';
print '';
- if ($resteapayeraffiche <= 0) {
- print $langs->trans('RemainderToPayBackMulticurrency');
- } else {
- print $langs->trans('ExcessPaidMulticurrency');
+ print $langs->trans('RemainderToPayMulticurrency');
+ if ($resteapayeraffiche < 0) {
+ print ' ('.$langs->trans('NegativeIfExcessPaid').')';
}
print ' ';
print ' ';
@@ -3503,10 +3501,9 @@ if ($action == 'create') {
// Remainder to pay back
print '';
print '';
- if ($resteapayeraffiche <= 0) {
- print $langs->trans('RemainderToPayBack');
- } else {
- print $langs->trans('ExcessPaid');
+ print $langs->trans('RemainderToPayBack');
+ if ($resteapayeraffiche > 0) {
+ print ' ('.$langs->trans('NegativeIfExcessRefunded').')';
}
print ' ';
print '';
@@ -3516,10 +3513,9 @@ if ($action == 'create') {
if ($object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) {
print '';
print '';
- if ($resteapayeraffiche <= 0) {
- print $langs->trans('RemainderToPayBackMulticurrency');
- } else {
- print $langs->trans('ExcessPaidMulticurrency');
+ print $langs->trans('RemainderToPayBackMulticurrency');
+ if ($resteapayeraffiche> 0) {
+ print ' ('.$langs->trans('NegativeIfExcessRefunded').')';
}
print ' ';
print ' ';
diff --git a/htdocs/install/fileconf.php b/htdocs/install/fileconf.php
index 33c000e4475..16d8a919dbe 100644
--- a/htdocs/install/fileconf.php
+++ b/htdocs/install/fileconf.php
@@ -615,12 +615,13 @@ jQuery(document).ready(function() {
function init_needroot()
{
+ console.log("init_needroot force_install_noedit=");
/*alert(jQuery("#db_create_database").prop("checked")); */
if (jQuery("#db_create_database").is(":checked") || jQuery("#db_create_user").is(":checked"))
{
jQuery(".hideroot").show();
+ if (empty($force_install_noedit)) { ?>
jQuery(".needroot").removeAttr('disabled');
}
diff --git a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql
index 39560240475..7170ebb62f4 100644
--- a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql
+++ b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql
@@ -334,4 +334,8 @@ ALTER TABLE llx_actioncomm MODIFY COLUMN note mediumtext;
DELETE FROM llx_boxes WHERE box_id IN (select rowid FROM llx_boxes_def WHERE file IN ('box_bom.php@bom', 'box_bom.php'));
DELETE FROM llx_boxes_def WHERE file IN ('box_bom.php@bom', 'box_bom.php');
-ALTER TABLE llx_takepos_floor_tables ADD UNIQUE(entity,label);
\ No newline at end of file
+ALTER TABLE llx_takepos_floor_tables ADD UNIQUE(entity,label);
+
+ALTER TABLE llx_partnership ADD COLUMN url_to_check varchar(255);
+ALTER TABLE llx_c_partnership_type ADD COLUMN keyword varchar(128);
+
diff --git a/htdocs/install/mysql/migration/repair.sql b/htdocs/install/mysql/migration/repair.sql
index 070f3a2c5da..4add688b880 100644
--- a/htdocs/install/mysql/migration/repair.sql
+++ b/htdocs/install/mysql/migration/repair.sql
@@ -559,6 +559,13 @@ DELETE FROM llx_rights_def WHERE module = 'hrm' AND perms = 'employee';
-- Sequence to fix the content of llx_bank.amount_main_currency
+-- Note: amount is amount in currency of bank account
+-- Note: pamount is always amount into the main currency
+-- Note: pmulticurrencyamount is in currency of invoice
+-- Note: amount_main_currency must be amount in main currency
-- DROP TABLE tmp_bank;
-- CREATE TABLE tmp_bank SELECT b.rowid, b.amount, p.rowid as pid, p.amount as pamount, p.multicurrency_amount as pmulticurrencyamount FROM llx_bank as b INNER JOIN llx_bank_url as bu ON bu.fk_bank=b.rowid AND bu.type = 'payment' INNER JOIN llx_paiement as p ON bu.url_id = p.rowid WHERE p.multicurrency_amount <> 0 AND p.multicurrency_amount <> p.amount;
-- UPDATE llx_bank as b SET b.amount_main_currency = (SELECT tb.pamount FROM tmp_bank as tb WHERE tb.rowid = b.rowid) WHERE b.amount_main_currency IS NULL;
+-- DROP TABLE tmp_bank2;
+-- CREATE TABLE tmp_bank2 SELECT b.rowid, b.amount, p.rowid as pid, p.amount as pamount, p.multicurrency_amount as pmulticurrencyamount FROM llx_bank as b INNER JOIN llx_bank_url as bu ON bu.fk_bank=b.rowid AND bu.type = 'payment_supplier' INNER JOIN llx_paiementfourn as p ON bu.url_id = p.rowid WHERE p.multicurrency_amount <> 0 AND p.multicurrency_amount <> p.amount;
+-- UPDATE llx_bank as b SET b.amount_main_currency = (SELECT tb.pamount FROM tmp_bank2 as tb WHERE tb.rowid = b.rowid) WHERE b.amount_main_currency IS NULL;
diff --git a/htdocs/install/mysql/tables/llx_c_partnership_type.key.sql b/htdocs/install/mysql/tables/llx_c_partnership_type-partnership.key.sql
similarity index 100%
rename from htdocs/install/mysql/tables/llx_c_partnership_type.key.sql
rename to htdocs/install/mysql/tables/llx_c_partnership_type-partnership.key.sql
diff --git a/htdocs/install/mysql/tables/llx_c_partnership_type.sql b/htdocs/install/mysql/tables/llx_c_partnership_type-partnership.sql
similarity index 92%
rename from htdocs/install/mysql/tables/llx_c_partnership_type.sql
rename to htdocs/install/mysql/tables/llx_c_partnership_type-partnership.sql
index 99841f967cb..fe4dd904662 100644
--- a/htdocs/install/mysql/tables/llx_c_partnership_type.sql
+++ b/htdocs/install/mysql/tables/llx_c_partnership_type-partnership.sql
@@ -31,6 +31,7 @@ create table llx_c_partnership_type
entity integer DEFAULT 1 NOT NULL,
code varchar(32) NOT NULL,
label varchar(128) NOT NULL,
+ keyword varchar(128), -- a keyword to check into url of partner website or a dedicated url defined into partneship record
active tinyint DEFAULT 1 NOT NULL
)ENGINE=innodb;
diff --git a/htdocs/install/mysql/tables/llx_partnership-partnership.sql b/htdocs/install/mysql/tables/llx_partnership-partnership.sql
index e3a5cb37e05..8f83e2e82e5 100644
--- a/htdocs/install/mysql/tables/llx_partnership-partnership.sql
+++ b/htdocs/install/mysql/tables/llx_partnership-partnership.sql
@@ -34,8 +34,9 @@ CREATE TABLE llx_partnership(
note_private text,
note_public text,
last_main_doc varchar(255),
- count_last_url_check_error integer DEFAULT '0',
- last_check_backlink datetime NULL,
+ url_to_check varchar(255), -- url to check to find a specific keyword (defined into llx_c_partnership) to keep status of partnership valid
+ count_last_url_check_error integer DEFAULT '0', -- last result of check of keyword into url
+ last_check_backlink datetime NULL, -- date of last check of keyword into url
import_key varchar(14),
model_pdf varchar(255)
) ENGINE=innodb;
\ No newline at end of file
diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang
index 1dc7d4e2092..bbb46d83900 100644
--- a/htdocs/langs/en_US/admin.lang
+++ b/htdocs/langs/en_US/admin.lang
@@ -1925,7 +1925,7 @@ ConfFileMustContainCustom=Installing or building an external module from applica
HighlightLinesOnMouseHover=Highlight table lines when mouse move passes over
HighlightLinesColor=Highlight color of the line when the mouse passes over (use 'ffffff' for no highlight)
HighlightLinesChecked=Highlight color of the line when it is checked (use 'ffffff' for no highlight)
-UseBorderOnTable=Active border on tables
+UseBorderOnTable=Show left-right borders on tables
BtnActionColor=Color of the action button
TextBtnActionColor=Text color of the action button
TextTitleColor=Text color of Page title
@@ -2143,7 +2143,7 @@ DeleteEmailCollector=Delete email collector
ConfirmDeleteEmailCollector=Are you sure you want to delete this email collector?
RecipientEmailsWillBeReplacedWithThisValue=Recipient emails will be always replaced with this value
AtLeastOneDefaultBankAccountMandatory=At least 1 default bank account must be defined
-RESTRICT_ON_IP=Allow access to some host IP only (wildcard not allowed, use space between values). Empty means every hosts can access.
+RESTRICT_ON_IP=Allow API access to only certain client IPs (wildcard not allowed, use space between values). Empty means every clients can access.
IPListExample=127.0.0.1 192.168.0.2 [::1]
BaseOnSabeDavVersion=Based on the library SabreDAV version
NotAPublicIp=Not a public IP
@@ -2234,3 +2234,4 @@ TemplateforBusinessCards=Template for a business card in different size
InventorySetup= Inventory Setup
ExportUseLowMemoryMode=Use a low memory mode
ExportUseLowMemoryModeHelp=Use the low memory mode to execute the exec of the dump (compression is done through a pipe instead of into the PHP memory). This method does not allow to check that file is completed and error message can't be reported if it fails.
+HashForPing=Hash used for ping
diff --git a/htdocs/langs/en_US/members.lang b/htdocs/langs/en_US/members.lang
index 8646c40b98f..faa2e0d0fcd 100644
--- a/htdocs/langs/en_US/members.lang
+++ b/htdocs/langs/en_US/members.lang
@@ -15,7 +15,7 @@ ErrorMemberIsAlreadyLinkedToThisThirdParty=Another member (name: %s , logi
ErrorUserPermissionAllowsToLinksToItselfOnly=For security reasons, you must be granted permissions to edit all users to be able to link a member to a user that is not yours.
SetLinkToUser=Link to a Dolibarr user
SetLinkToThirdParty=Link to a Dolibarr third party
-MembersCards=Business cards for members
+MembersCards=Generation of cards for members
MembersList=List of members
MembersListToValid=List of draft members (to be validated)
MembersListValid=List of valid members
@@ -163,7 +163,7 @@ MoreActionsOnSubscription=Complementary action suggested by default when recordi
MoreActionBankDirect=Create a direct entry on bank account
MoreActionBankViaInvoice=Create an invoice, and a payment on bank account
MoreActionInvoiceOnly=Create an invoice with no payment
-LinkToGeneratedPages=Generate visit cards
+LinkToGeneratedPages=Generation of business cards or address sheets
LinkToGeneratedPagesDesc=This screen allows you to generate PDF files with business cards for all your members or a particular member.
DocForAllMembersCards=Generate business cards for all members
DocForOneMemberCards=Generate business cards for a particular member
diff --git a/htdocs/langs/en_US/partnership.lang b/htdocs/langs/en_US/partnership.lang
index f542bfab670..9c11e1cda2e 100644
--- a/htdocs/langs/en_US/partnership.lang
+++ b/htdocs/langs/en_US/partnership.lang
@@ -59,6 +59,7 @@ BacklinkNotFoundOnPartnerWebsite=Backlink not found on partner website
ConfirmClosePartnershipAsk=Are you sure you want to cancel this partnership?
PartnershipType=Partnership type
PartnershipRefApproved=Partnership %s approved
+KeywordToCheckInWebsite=If you want to check that a given keyword is present into the website of each partner, define this keyword here
#
# Template Mail
@@ -89,4 +90,5 @@ PartnershipDraft=Draft
PartnershipAccepted=Accepted
PartnershipRefused=Refused
PartnershipCanceled=Canceled
-PartnershipManagedFor=Partners are
\ No newline at end of file
+PartnershipManagedFor=Partners are
+
diff --git a/htdocs/langs/en_US/users.lang b/htdocs/langs/en_US/users.lang
index 888c9f52161..5bfbec87294 100644
--- a/htdocs/langs/en_US/users.lang
+++ b/htdocs/langs/en_US/users.lang
@@ -123,4 +123,8 @@ ForceUserHolidayValidator=Force leave request validator
ValidatorIsSupervisorByDefault=By default, the validator is the supervisor of the user. Keep empty to keep this behaviour.
UserPersonalEmail=Personal email
UserPersonalMobile=Personal mobile phone
-WarningNotLangOfInterface=Warning, this is the main language the user speak, not the language of the interface he choosed to see. To change the interface language visible by this user, go on tab %s
\ No newline at end of file
+WarningNotLangOfInterface=Warning, this is the main language the user speak, not the language of the interface he choosed to see. To change the interface language visible by this user, go on tab %s
+DateLastLogin=Date last login
+DatePreviousLogin=Date previous login
+IPLastLogin=IP last login
+IPPreviousLogin=IP previous login
diff --git a/htdocs/langs/en_US/withdrawals.lang b/htdocs/langs/en_US/withdrawals.lang
index 9d145ef354d..75cee952bcd 100644
--- a/htdocs/langs/en_US/withdrawals.lang
+++ b/htdocs/langs/en_US/withdrawals.lang
@@ -137,6 +137,7 @@ SEPAFRST=SEPA FRST
ExecutionDate=Execution date
CreateForSepa=Create direct debit file
ICS=Creditor Identifier - ICS
+IDS=Debitor Identifier
END_TO_END="EndToEndId" SEPA XML tag - Unique id assigned per transaction
USTRD="Unstructured" SEPA XML tag
ADDDAYS=Add days to Execution Date
@@ -154,4 +155,5 @@ ErrorCompanyHasDuplicateDefaultBAN=Company with id %s has more than one default
ErrorICSmissing=Missing ICS in Bank account %s
TotalAmountOfdirectDebitOrderDiffersFromSumOfLines=Total amount of direct debit order differs from sum of lines
WarningSomeDirectDebitOrdersAlreadyExists=Warning: There is already some pending Direct Debit orders (%s) requested for an amount of %s
-WarningSomeCreditTransferAlreadyExists=Warning: There is already some pending Credit Transfer (%s) requested for an amount of %s
\ No newline at end of file
+WarningSomeCreditTransferAlreadyExists=Warning: There is already some pending Credit Transfer (%s) requested for an amount of %s
+UsedFor=Used for %s
\ No newline at end of file
diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php
index 805d7b9e105..e2dd5f0f2b8 100644
--- a/htdocs/main.inc.php
+++ b/htdocs/main.inc.php
@@ -109,10 +109,11 @@ function testSqlAndScriptInject($val, $type)
// We check string because some hacks try to obfuscate evil strings by inserting non printable chars. Example: 'java(ascci09)scr(ascii00)ipt' is processed like 'javascript' (whatever is place of evil ascii char)
// We should use dol_string_nounprintableascii but function is not yet loaded/available
// Example of valid UTF8 chars:
- // utf8=utf8mb3: '\x0A', '\x0D', '\x7E'
+ // utf8=utf8mb3: '\x09', '\x0A', '\x0D', '\x7E'
// utf8=utf8mb3: '\xE0\xA0\x80'
// utf8mb4: '\xF0\x9D\x84\x9E' (but this may be refused by the database insert if pagecode is utf8=utf8mb3)
- $newval = preg_replace('/[\x00-\x09\x0B-\x0C\x0E-\x1F\x7F]/u', '', $val); // /u operator makes UTF8 valid characters being ignored so are not included into the replace
+ $newval = preg_replace('/[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F]/u', '', $val); // /u operator makes UTF8 valid characters being ignored so are not included into the replace
+
// Note that $newval may also be completely empty '' when non valid UTF8 are found.
if ($newval != $val) {
// If $val has changed after removing non valid UTF8 chars, it means we have an evil string.
diff --git a/htdocs/modulebuilder/template/core/modules/modMyModule.class.php b/htdocs/modulebuilder/template/core/modules/modMyModule.class.php
index b1caea730f9..d843687157a 100644
--- a/htdocs/modulebuilder/template/core/modules/modMyModule.class.php
+++ b/htdocs/modulebuilder/template/core/modules/modMyModule.class.php
@@ -222,6 +222,8 @@ class modMyModule extends DolibarrModules
'tabrowid'=>array("rowid", "rowid", "rowid"),
// Condition to show each dictionary
'tabcond'=>array($conf->mymodule->enabled, $conf->mymodule->enabled, $conf->mymodule->enabled)
+ // Help tooltip for each fields of the dictionary
+ 'tabhelp'=>array(array('code'=>$langs->trans('CodeTooltipHelp')))
);
*/
diff --git a/htdocs/partnership/class/partnership.class.php b/htdocs/partnership/class/partnership.class.php
index b673856d124..7d7d6a65d14 100644
--- a/htdocs/partnership/class/partnership.class.php
+++ b/htdocs/partnership/class/partnership.class.php
@@ -119,9 +119,10 @@ class Partnership extends CommonObject
'date_partnership_start' => array('type'=>'date', 'label'=>'DatePartnershipStart', 'enabled'=>'1', 'position'=>52, 'notnull'=>1, 'visible'=>1,),
'date_partnership_end' => array('type'=>'date', 'label'=>'DatePartnershipEnd', 'enabled'=>'1', 'position'=>53, 'notnull'=>0, 'visible'=>1,),
'status' => array('type'=>'smallint', 'label'=>'Status', 'enabled'=>'1', 'position'=>54, 'notnull'=>0, 'visible'=>2, 'index'=>1, 'arrayofkeyval'=>array('-1'=>'','0'=>'Draft', '1'=>'Accepted', '2'=>'Refused', '9'=>'Terminated'),),
- 'count_last_url_check_error' => array('type'=>'integer', 'label'=>'CountLastUrlCheckError', 'enabled'=>'1', 'position'=>63, 'notnull'=>0, 'visible'=>-2, 'default'=>'0',),
- 'last_check_backlink' => array('type'=>'datetime', 'label'=>'LastCheckBacklink', 'enabled'=>'1', 'position'=>65, 'notnull'=>0, 'visible'=>-2,),
- 'reason_decline_or_cancel' => array('type'=>'text', 'label'=>'ReasonDeclineOrCancel', 'enabled'=>'1', 'position'=>64, 'notnull'=>0, 'visible'=>-2,),
+ 'url_to_check' => array('type'=>'varchar(255)', 'label'=>'UrlToCheck', 'enabled'=>'1', 'position'=>70, 'notnull'=>0, 'visible'=>-1),
+ 'count_last_url_check_error' => array('type'=>'integer', 'label'=>'CountLastUrlCheckError', 'enabled'=>'1', 'position'=>71, 'notnull'=>0, 'visible'=>-2, 'default'=>'0',),
+ 'last_check_backlink' => array('type'=>'datetime', 'label'=>'LastCheckBacklink', 'enabled'=>'1', 'position'=>72, 'notnull'=>0, 'visible'=>-2,),
+ 'reason_decline_or_cancel' => array('type'=>'text', 'label'=>'ReasonDeclineOrCancel', 'enabled'=>'1', 'position'=>73, 'notnull'=>0, 'visible'=>-2,),
// fk_member and fk_soc are added into constructor
);
diff --git a/htdocs/product/card.php b/htdocs/product/card.php
index efa14b1e582..fa69bbf0399 100644
--- a/htdocs/product/card.php
+++ b/htdocs/product/card.php
@@ -1564,8 +1564,8 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
// Quality control
if (!empty($conf->global->PRODUCT_LOT_ENABLE_QUALITY_CONTROL)) {
- print ''.$langs->trans("LifeTime").' ';
- print ''.$langs->trans("QCFrequency").' ';
+ print ''.$langs->trans("LifeTime").' ';
+ print ''.$langs->trans("QCFrequency").' ';
}
// Other attributes
@@ -2611,19 +2611,19 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
// Custom code
if (!$object->isService() && empty($conf->global->PRODUCT_DISABLE_CUSTOM_INFO)) {
- print ''.$langs->trans("CustomCode").' '.$object->customcode.' ';
+ print ''.$langs->trans("CustomCode").' '.$object->customcode.' ';
// Origin country code
print ''.$langs->trans("Origin").' '.getCountry($object->country_id, 0, $db);
if (!empty($object->state_id)) {
print ' - '.getState($object->state_id, 0, $db);
}
- print ' ';
+ print ' ';
}
// Quality Control
if (!empty($conf->global->PRODUCT_LOT_ENABLE_QUALITY_CONTROL)) {
- print ''.$langs->trans("LifeTime").' '.$object->lifetime.' ';
+ print ''.$langs->trans("LifeTime").' '.$object->lifetime.' ';
print ''.$langs->trans("QCFrequency").' '.$object->qc_frequency.' ';
}
diff --git a/htdocs/projet/admin/project.php b/htdocs/projet/admin/project.php
index adef0826992..37a2bb246ce 100644
--- a/htdocs/projet/admin/project.php
+++ b/htdocs/projet/admin/project.php
@@ -766,6 +766,7 @@ $form = new Form($db);
print '