diff --git a/dev/iso-normes/format_FEC-Lien_outil_de_test_agréé.pdf b/dev/iso-normes/format_FEC-Lien_outil_de_test_agréé.pdf
new file mode 100644
index 00000000000..1c0d0c91e73
Binary files /dev/null and b/dev/iso-normes/format_FEC-Lien_outil_de_test_agréé.pdf differ
diff --git a/dev/iso-normes/format_FEC.pdf b/dev/iso-normes/format_FEC.pdf
index 2b577030550..ad62797a190 100644
Binary files a/dev/iso-normes/format_FEC.pdf and b/dev/iso-normes/format_FEC.pdf differ
diff --git a/dev/skeletons/modMyModule.class.php b/dev/skeletons/modMyModule.class.php
index a54aac470e5..ed8f8ed976e 100644
--- a/dev/skeletons/modMyModule.class.php
+++ b/dev/skeletons/modMyModule.class.php
@@ -166,7 +166,11 @@ class modMyModule extends DolibarrModules
// Add here list of php file(s) stored in core/boxes that contains class to show a box.
$this->boxes = array(); // List of boxes
// Example:
- //$this->boxes=array(array(0=>array('file'=>'myboxa.php','note'=>'','enabledbydefaulton'=>'Home'),1=>array('file'=>'myboxb.php','note'=>''),2=>array('file'=>'myboxc.php','note'=>'')););
+ //$this->boxes=array(
+ // 0=>array('file'=>'myboxa.php@mymodule','note'=>'','enabledbydefaulton'=>'Home'),
+ // 1=>array('file'=>'myboxb.php@mymodule','note'=>''),
+ // 2=>array('file'=>'myboxc.php@mymodule','note'=>'')
+ //);
// Cronjobs
$this->cronjobs = array(); // List of cron jobs entries to add
diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php
index b6f412d5480..951a07d3171 100644
--- a/htdocs/accountancy/bookkeeping/list.php
+++ b/htdocs/accountancy/bookkeeping/list.php
@@ -44,13 +44,14 @@ $search_doc_ref = GETPOST("search_doc_ref");
$search_account = GETPOST("search_account");
$search_thirdparty = GETPOST("search_thirdparty");
$search_journal = GETPOST("search_journal");
+$limit = $conf->liste_limit;
if ($sortorder == "")
$sortorder = "ASC";
if ($sortfield == "")
$sortfield = "bk.rowid";
-$offset = $conf->liste_limit * $page;
+$offset = $limit * $page;
$formventilation = new FormVentilation($db);
$formother = new FormOther($db);
diff --git a/htdocs/accountancy/bookkeeping/listbyyear.php b/htdocs/accountancy/bookkeeping/listbyyear.php
index ce6d10f9730..fe185fd1118 100644
--- a/htdocs/accountancy/bookkeeping/listbyyear.php
+++ b/htdocs/accountancy/bookkeeping/listbyyear.php
@@ -36,6 +36,7 @@ $langs->load("accountancy");
$page = GETPOST("page");
$sortorder = GETPOST("sortorder");
$sortfield = GETPOST("sortfield");
+$limit = $conf->liste_limit;
// Filter
$year = GETPOST("year", 'int');
@@ -52,7 +53,7 @@ if ($sortorder == "")
if ($sortfield == "")
$sortfield = "bk.rowid";
-$offset = $conf->liste_limit * $page;
+$offset = $limit * $page;
llxHeader('', $langs->trans("Bookkeeping"));
diff --git a/htdocs/admin/livraison.php b/htdocs/admin/livraison.php
index f9cee8a75f3..04183bed336 100644
--- a/htdocs/admin/livraison.php
+++ b/htdocs/admin/livraison.php
@@ -503,7 +503,7 @@ print ' ';
print ' ';
print '
';
print $langs->trans("FreeLegalTextOnDeliveryReceipts").' ('.$langs->trans("AddCRIfTooLong").') ';
-print '';
+$variablename='DELIVERY_FREE_TEXT';
if (empty($conf->global->PDF_ALLOW_HTML_FOR_FREE_TEXT))
{
print '';
diff --git a/htdocs/admin/sms.php b/htdocs/admin/sms.php
index 604b426b800..05fe548daff 100644
--- a/htdocs/admin/sms.php
+++ b/htdocs/admin/sms.php
@@ -124,10 +124,12 @@ if ($action == 'send' && ! $_POST['cancel'])
if ($result)
{
setEventMessages($langs->trans("SmsSuccessfulySent",$smsfrom,$sendto), null, 'mesgs');
+ setEventMessages($smsfile->error, $smsfile->errors, 'mesgs');
}
else
{
setEventMessages($langs->trans("ResultKo"), null, 'errors');
+ setEventMessages($smsfile->error, $smsfile->errors, 'errors');
}
$action='';
diff --git a/htdocs/comm/mailing/list.php b/htdocs/comm/mailing/list.php
index cc7bafa9f5d..20796db24f4 100644
--- a/htdocs/comm/mailing/list.php
+++ b/htdocs/comm/mailing/list.php
@@ -32,9 +32,10 @@ $result=restrictedArea($user,'mailing');
$sortfield = GETPOST("sortfield",'alpha');
$sortorder = GETPOST("sortorder",'alpha');
+$limit = $conf->liste_limit;
$page = GETPOST("page",'int');
if ($page == -1) { $page = 0; }
-$offset = $conf->liste_limit * $page;
+$offset = $limit * $page;
$pageprev = $page - 1;
$pagenext = $page + 1;
if (! $sortorder) $sortorder="DESC";
diff --git a/htdocs/comm/multiprix.php b/htdocs/comm/multiprix.php
index 645bdc580b4..fbaf00e53db 100644
--- a/htdocs/comm/multiprix.php
+++ b/htdocs/comm/multiprix.php
@@ -105,7 +105,10 @@ if ($_socid > 0)
print 'price_level)
print 'selected';
- print '>'.$i.' ';
+ print '>'.$i;
+ $keyforlabel='PRODUIT_MULTIPRICES_LABEL'.$i;
+ if (! empty($conf->global->$keyforlabel)) print ' - '.$langs->trans($conf->global->$keyforlabel);
+ print '';
}
print '';
print ' ';
diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php
index 250687a5c02..cda28c80b37 100644
--- a/htdocs/comm/propal/class/propal.class.php
+++ b/htdocs/comm/propal/class/propal.class.php
@@ -2901,8 +2901,7 @@ class Propal extends CommonObject
/**
- * \class PropaleLigne
- * \brief Class to manage commercial proposal lines
+ * Class to manage commercial proposal lines
*/
class PropaleLigne extends CommonObjectLine
{
diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php
index b35aa1628f3..b7caa472425 100644
--- a/htdocs/commande/list.php
+++ b/htdocs/commande/list.php
@@ -67,13 +67,13 @@ $result = restrictedArea($user, 'commande', $id,'');
$sortfield = GETPOST("sortfield",'alpha');
$sortorder = GETPOST("sortorder",'alpha');
$page = GETPOST("page",'int');
+$limit = $conf->liste_limit;
if ($page == -1) { $page = 0; }
-$offset = $conf->liste_limit * $page;
+$offset = $limit * $page;
$pageprev = $page - 1;
$pagenext = $page + 1;
if (! $sortfield) $sortfield='c.rowid';
if (! $sortorder) $sortorder='DESC';
-$limit = $conf->liste_limit;
$viewstatut=GETPOST('viewstatut');
diff --git a/htdocs/compta/deplacement/list.php b/htdocs/compta/deplacement/list.php
index c3c5f7dd80b..7c849f67f50 100644
--- a/htdocs/compta/deplacement/list.php
+++ b/htdocs/compta/deplacement/list.php
@@ -46,13 +46,13 @@ $search_company=GETPOST('search_company','alpha');
$sortfield = GETPOST("sortfield",'alpha');
$sortorder = GETPOST("sortorder",'alpha');
$page = GETPOST("page",'int');
+$limit = $conf->liste_limit;
if ($page == -1) { $page = 0; }
-$offset = $conf->liste_limit * $page;
+$offset = $limit * $page;
$pageprev = $page - 1;
$pagenext = $page + 1;
if (! $sortorder) $sortorder="DESC";
if (! $sortfield) $sortfield="d.dated";
-$limit = $conf->liste_limit;
$year=GETPOST("year");
$month=GETPOST("month");
diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php
index 9ce11ee5abf..4d3c194bce1 100644
--- a/htdocs/compta/facture.php
+++ b/htdocs/compta/facture.php
@@ -2837,7 +2837,7 @@ else if ($id > 0 || ! empty($ref))
print '';
print '';
if ($action == 'editthirdparty') {
- $form->form_thirdparty($_SERVER['PHP_SELF'] . '?facid=' . $object->id, $object->socid, 'socid');
+ $form->form_thirdparty($_SERVER['PHP_SELF'] . '?facid=' . $object->id, $object->socid, 'socid','client>0');
} else {
print ' ' . $soc->getNomUrl(1, 'compta');
print ' ';
diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php
index 707ad32eec7..0d0d1835732 100644
--- a/htdocs/compta/facture/list.php
+++ b/htdocs/compta/facture/list.php
@@ -77,14 +77,14 @@ if ($option == 'late') $filter = 'paye:0';
$sortfield = GETPOST("sortfield",'alpha');
$sortorder = GETPOST("sortorder",'alpha');
+$limit = $conf->liste_limit;
$page = GETPOST("page",'int');
if ($page == -1) {
$page = 0;
}
-$offset = $conf->liste_limit * $page;
+$offset = $limit * $page;
if (! $sortorder) $sortorder='DESC';
if (! $sortfield) $sortfield='f.datef';
-$limit = $conf->liste_limit;
$pageprev = $page - 1;
$pagenext = $page + 1;
diff --git a/htdocs/compta/paiement/cheque/list.php b/htdocs/compta/paiement/cheque/list.php
index c322863efc1..f4451178e71 100644
--- a/htdocs/compta/paiement/cheque/list.php
+++ b/htdocs/compta/paiement/cheque/list.php
@@ -43,12 +43,12 @@ $search_account = GETPOST('search_account','int');
$search_amount = GETPOST('search_amount','alpha');
$sortfield = GETPOST("sortfield",'alpha');
$sortorder = GETPOST("sortorder",'alpha');
+$limit = $conf->liste_limit;
$page = GETPOST("page",'int');
if ($page == -1) { $page = 0; }
-$offset = $conf->liste_limit * $page;
+$offset = $limit * $page;
$pageprev = $page - 1;
$pagenext = $page + 1;
-$limit = $conf->liste_limit;
if (! $sortorder) $sortorder="DESC";
if (! $sortfield) $sortfield="dp";
diff --git a/htdocs/compta/paiement/list.php b/htdocs/compta/paiement/list.php
index 6e3d31364ce..0a5c2cd1572 100644
--- a/htdocs/compta/paiement/list.php
+++ b/htdocs/compta/paiement/list.php
@@ -57,12 +57,12 @@ $search_amount=GETPOST("search_amount");
$search_company=GETPOST("search_company");
$sortfield = GETPOST("sortfield",'alpha');
$sortorder = GETPOST("sortorder",'alpha');
+$limit = $conf->liste_limit;
$page = GETPOST("page",'int');
if ($page == -1) { $page = 0; }
-$offset = $conf->liste_limit * $page;
+$offset = $limit * $page;
$pageprev = $page - 1;
$pagenext = $page + 1;
-$limit = $conf->liste_limit;
if (! $sortorder) $sortorder="DESC";
if (! $sortfield) $sortfield="p.rowid";
diff --git a/htdocs/compta/ventilation/list.php b/htdocs/compta/ventilation/list.php
index 03a1b658cd2..264673049ad 100644
--- a/htdocs/compta/ventilation/list.php
+++ b/htdocs/compta/ventilation/list.php
@@ -47,12 +47,12 @@ llxHeader('','Ventilation');
$sortfield = GETPOST("sortfield",'alpha');
$sortorder = GETPOST("sortorder",'alpha');
+$limit = $conf->liste_limit;
$page = GETPOST("page",'int');
if ($page == -1) { $page = 0; }
-$offset = $conf->liste_limit * $page;
+$offset = $limit * $page;
$pageprev = $page - 1;
$pagenext = $page + 1;
-$limit = $conf->liste_limit;
$sql = "SELECT f.facnumber, f.rowid as facid, l.fk_product, l.description, f.total as price, l.rowid, l.fk_code_ventilation,";
$sql.= " p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.fk_product_type as type";
diff --git a/htdocs/core/class/CSMSFile.class.php b/htdocs/core/class/CSMSFile.class.php
index b6819fdd87f..4456df76f83 100644
--- a/htdocs/core/class/CSMSFile.class.php
+++ b/htdocs/core/class/CSMSFile.class.php
@@ -149,9 +149,10 @@ class CSMSFile
$sms->message=$this->message;
$res=$sms->SmsSend();
+ $this->error = $sms->error;
+ $this->errors = $sms->errors;
if ($res <= 0)
{
- $this->error=$sms->error;
dol_syslog("CSMSFile::sendfile: sms send error=".$this->error, LOG_ERR);
}
else
diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php
index 18580c4b6cc..a5643c26dc5 100644
--- a/htdocs/core/class/html.form.class.php
+++ b/htdocs/core/class/html.form.class.php
@@ -2017,8 +2017,8 @@ class Form
{
$dur=array("h"=>$langs->trans("Hour"),"d"=>$langs->trans("Day"),"w"=>$langs->trans("Week"),"m"=>$langs->trans("Month"),"y"=>$langs->trans("Year"));
}
- $opt.= ' - '.$duration_value.' '.$langs->trans($dur[$duration_unit]);
- $outval.=' - '.$duration_value.' '.$langs->transnoentities($dur[$duration_unit]);
+ $opt.= ' - '.$duration_value.' '.($dur[$duration_unit]?$langs->trans($dur[$duration_unit]):'');
+ $outval.=' - '.$duration_value.' '.($dur[$duration_unit]?$langs->transnoentities($dur[$duration_unit]):'');
}
$opt.= "\n";
diff --git a/htdocs/core/lib/accounting.lib.php b/htdocs/core/lib/accounting.lib.php
index 6e6da6bd686..502e83010f7 100644
--- a/htdocs/core/lib/accounting.lib.php
+++ b/htdocs/core/lib/accounting.lib.php
@@ -91,6 +91,19 @@ function accounting_prepare_head(AccountingAccount $object)
return $head;
}
+/**
+ * Return accounting account without zero on the right
+ *
+ * @param string $account Accounting account
+ * @return string String without zero on the right
+ */
+function clean_account($account)
+{
+ $account = rtrim($account,"0");
+
+ return $account;
+}
+
/**
* Return general accounting account with defined length
*
@@ -131,7 +144,7 @@ function length_accountg($account)
*/
function length_accounta($accounta)
{
- global $conf, $langs;
+ global $conf;
$a = $conf->global->ACCOUNTING_LENGTH_AACCOUNT;
diff --git a/htdocs/don/list.php b/htdocs/don/list.php
index 0a91e59593d..9477e91837e 100644
--- a/htdocs/don/list.php
+++ b/htdocs/don/list.php
@@ -34,13 +34,13 @@ $langs->load("donations");
$sortfield = GETPOST("sortfield",'alpha');
$sortorder = GETPOST("sortorder",'alpha');
$page = GETPOST("page",'int');
+$limit = $conf->liste_limit;
if ($page == -1) { $page = 0; }
-$offset = $conf->liste_limit * $page;
+$offset = $limit * $page;
$pageprev = $page - 1;
$pagenext = $page + 1;
if (! $sortorder) $sortorder="DESC";
if (! $sortfield) $sortfield="d.datedon";
-$limit = $conf->liste_limit;
$statut=isset($_GET["statut"])?$_GET["statut"]:"-1";
$search_all=GETPOST('sall','alpha');
diff --git a/htdocs/expedition/card.php b/htdocs/expedition/card.php
index 36d85366805..dfe848808c8 100644
--- a/htdocs/expedition/card.php
+++ b/htdocs/expedition/card.php
@@ -224,7 +224,7 @@ if (empty($reshook))
$ret=$object->addline($entrepot_id,GETPOST($idl,'int'),GETPOST($qty,'int'));
if ($ret < 0)
{
- $mesg=''.$object->error.'
';
+ setEventMessages($object->error, $object->errors, 'errors');
$error++;
}
}
@@ -237,7 +237,7 @@ if (empty($reshook))
$ret=$object->addline_batch($batch_line[$i]);
if ($ret < 0)
{
- $mesg=''.$object->error.'
';
+ setEventMessages($object->error, $object->errors, 'errors');
$error++;
}
}
@@ -249,14 +249,14 @@ if (empty($reshook))
$ret=$object->create($user); // This create shipment (like Odoo picking) and line of shipments. Stock movement will when validating shipment.
if ($ret <= 0)
{
- $mesg=''.$object->error.'
';
+ setEventMessages($object->error, $object->errors, 'errors');
$error++;
}
}
}
else
{
- $mesg=''.$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Qty")).'
';
+ setEventMessages($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("QtyToShip")), null, 'errors');
$error++;
}
@@ -287,7 +287,7 @@ if (empty($reshook))
}
else
{
- $mesg=$object->error;
+ setEventMessages($object->error, $object->errors, 'errors');
}
}
@@ -337,19 +337,18 @@ if (empty($reshook))
}
else
{
- $langs->load("errors");
- setEventMessages($langs->trans($object->error), null, 'errors');
+ setEventMessages($object->error, $object->errors, 'errors');
}
}
-
- else if ($action == 'reopen' && (! empty($user->rights->expedition->creer) || ! empty($user->rights->expedition->shipping_advance->validate)))
+ // TODO add alternative status
+ /*else if ($action == 'reopen' && (! empty($user->rights->expedition->creer) || ! empty($user->rights->expedition->shipping_advance->validate)))
{
$result = $object->setStatut(0);
if ($result < 0)
{
- $mesg = $object->error;
+ setEventMessages($object->error, $object->errors, 'errors');
}
- }
+ }*/
else if ($action == 'setdate_livraison' && $user->rights->expedition->creer)
{
@@ -360,7 +359,7 @@ if (empty($reshook))
$result=$object->set_date_livraison($user,$datedelivery);
if ($result < 0)
{
- $mesg=''.$object->error.'
';
+ setEventMessages($object->error, $object->errors, 'errors');
}
}
@@ -485,8 +484,6 @@ if ($action == 'create')
setEventMessages($langs->trans("ErrorBadParameters"), null, 'errors');
}
- dol_htmloutput_mesg($mesg);
-
if ($origin)
{
$classname = ucfirst($origin);
@@ -928,8 +925,6 @@ else if ($id || $ref)
if ($object->id > 0)
{
- dol_htmloutput_mesg($mesg);
-
if (!empty($object->origin))
{
$typeobject = $object->origin;
@@ -943,8 +938,6 @@ else if ($id || $ref)
$head=shipping_prepare_head($object);
dol_fiche_head($head, 'shipping', $langs->trans("Shipment"), 0, 'sending');
- dol_htmloutput_mesg($mesg);
-
/*
* Confirmation de la suppression
*/
diff --git a/htdocs/expedition/class/expedition.class.php b/htdocs/expedition/class/expedition.class.php
index d7bfc9aed98..08b53bf9e25 100644
--- a/htdocs/expedition/class/expedition.class.php
+++ b/htdocs/expedition/class/expedition.class.php
@@ -1068,6 +1068,7 @@ class Expedition extends CommonObject
break;
}
}
+ if ($error) break; // break for loop incase of error
}
}
}
diff --git a/htdocs/expedition/list.php b/htdocs/expedition/list.php
index 5339538901e..bee47fe25bd 100644
--- a/htdocs/expedition/list.php
+++ b/htdocs/expedition/list.php
@@ -43,15 +43,14 @@ $optioncss = GETPOST('optioncss','alpha');
$sortfield = GETPOST('sortfield','alpha');
$sortorder = GETPOST('sortorder','alpha');
$page = GETPOST('page','int');
+$limit = $conf->liste_limit;
if ($page == -1) { $page = 0; }
-$offset = $conf->liste_limit * $page;
+$offset = $limit * $page;
$pageprev = $page - 1;
$pagenext = $page + 1;
-$limit = $conf->liste_limit;
if (! $sortfield) $sortfield="e.ref";
if (! $sortorder) $sortorder="DESC";
-$limit = $conf->liste_limit;
$viewstatut=GETPOST('viewstatut');
diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php
index 502125faf61..0d1dc22971a 100644
--- a/htdocs/expensereport/list.php
+++ b/htdocs/expensereport/list.php
@@ -93,15 +93,15 @@ $sortfield = GETPOST("sortfield");
$page = GETPOST("page");
if (!$sortorder) $sortorder="DESC";
if (!$sortfield) $sortfield="d.date_debut";
+$limit = $conf->liste_limit;
if ($page == -1) {
$page = 0 ;
}
-$offset = $conf->liste_limit * $page;
+$offset = $limit * $page;
$pageprev = $page - 1;
$pagenext = $page + 1;
-$limit = $conf->liste_limit;
$sql = "SELECT d.rowid, d.ref, d.fk_user_author, d.total_ht, d.total_tva, d.total_ttc, d.fk_statut as status,";
$sql.= " d.date_debut, d.date_fin,";
diff --git a/htdocs/fichinter/list.php b/htdocs/fichinter/list.php
index 896d8c6a4fa..35224cb7780 100644
--- a/htdocs/fichinter/list.php
+++ b/htdocs/fichinter/list.php
@@ -44,9 +44,10 @@ $result = restrictedArea($user, 'ficheinter', $fichinterid,'fichinter');
$sortfield = GETPOST('sortfield','alpha');
$sortorder = GETPOST('sortorder','alpha');
+$limit = $conf->liste_limit;
$page = GETPOST('page','int');
if ($page == -1) { $page = 0; }
-$offset = $conf->liste_limit * $page;
+$offset = $limit * $page;
$pageprev = $page - 1;
$pagenext = $page + 1;
if (! $sortorder) $sortorder="DESC";
@@ -55,7 +56,6 @@ if (! $sortfield)
if (empty($conf->global->FICHINTER_DISABLE_DETAILS)) $sortfield="fd.date";
else $sortfield="f.ref";
}
-$limit = $conf->liste_limit;
$search_ref=GETPOST('search_ref')?GETPOST('search_ref','alpha'):GETPOST('search_inter','alpha');
$search_company=GETPOST('search_company','alpha');
diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php
index 1888cdc8adc..236eca113ff 100644
--- a/htdocs/fourn/class/fournisseur.commande.class.php
+++ b/htdocs/fourn/class/fournisseur.commande.class.php
@@ -996,7 +996,7 @@ class CommandeFournisseur extends CommonOrder
{
$result = -1;
$this->error = $langs->trans('NotAuthorized');
- $this->errors[] = $lanfs->trans('NotAuthorized');
+ $this->errors[] = $langs->trans('NotAuthorized');
dol_syslog(get_class($this)."::commande User not Authorized", LOG_ERR);
}
return $result ;
diff --git a/htdocs/install/mysql/migration/3.9.0-4.0.0.sql b/htdocs/install/mysql/migration/3.9.0-4.0.0.sql
new file mode 100644
index 00000000000..f8a74fec247
--- /dev/null
+++ b/htdocs/install/mysql/migration/3.9.0-4.0.0.sql
@@ -0,0 +1,25 @@
+--
+-- Be carefull to requests order.
+-- This file must be loaded by calling /install/index.php page
+-- when current version is 4.0.0 or higher.
+--
+-- To rename a table: ALTER TABLE llx_table RENAME TO llx_table_new;
+-- To add a column: ALTER TABLE llx_table ADD COLUMN newcol varchar(60) NOT NULL DEFAULT '0' AFTER existingcol;
+-- To rename a column: ALTER TABLE llx_table CHANGE COLUMN oldname newname varchar(60);
+-- To drop a column: ALTER TABLE llx_table DROP COLUMN oldname;
+-- To change type of field: ALTER TABLE llx_table MODIFY COLUMN name varchar(60);
+-- To drop a foreign key: ALTER TABLE llx_table DROP FOREIGN KEY fk_name;
+-- To drop an index: -- VMYSQL4.0 DROP INDEX nomindex on llx_table
+-- To drop an index: -- VPGSQL8.0 DROP INDEX nomindex
+-- To restrict request to Mysql version x.y minimum use -- VMYSQLx.y
+-- To restrict request to Pgsql version x.y minimum use -- VPGSQLx.y
+-- To make pk to be auto increment (mysql): VMYSQL4.3 ALTER TABLE llx_c_shipment_mode CHANGE COLUMN rowid rowid INTEGER NOT NULL AUTO_INCREMENT;
+-- To make pk to be auto increment (postgres): VPGSQL8.2 NOT POSSIBLE. MUST DELETE/CREATE TABLE
+-- To set a field as NULL: VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN name DROP NOT NULL;
+-- To set a field as default NULL: VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN name SET DEFAULT NULL;
+-- Note: fields with type BLOB/TEXT can't have default value.
+-- -- VPGSQL8.2 DELETE FROM llx_usergroup_user WHERE fk_user NOT IN (SELECT rowid from llx_user);
+-- -- VMYSQL4.1 DELETE FROM llx_usergroup_user WHERE fk_usergroup NOT IN (SELECT rowid from llx_usergroup);
+
+
+ALTER TABLE llx_accounting_bookkeeping ADD COLUMN validated tinyint DEFAULT 0 NOT NULL;
diff --git a/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql b/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql
index 660dd4745b3..dca4b70a5d5 100644
--- a/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql
+++ b/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql
@@ -35,5 +35,6 @@ CREATE TABLE llx_accounting_bookkeeping
fk_user_author integer NOT NULL,
import_key varchar(14),
code_journal varchar(10) DEFAULT NULL,
- piece_num integer NOT NULL
+ piece_num integer NOT NULL,
+ validated tinyint DEFAULT 0 NOT NULL -- 0 line not validated / 1 line validated (No deleting / No modification)
) ENGINE=innodb;
diff --git a/htdocs/opensurvey/list.php b/htdocs/opensurvey/list.php
index 4844d9f8e59..fe73419c98b 100644
--- a/htdocs/opensurvey/list.php
+++ b/htdocs/opensurvey/list.php
@@ -38,9 +38,10 @@ $status=GETPOST('status');
$sortfield = GETPOST("sortfield",'alpha');
$sortorder = GETPOST("sortorder",'alpha');
+$limit = $conf->liste_limit;
$page = GETPOST("page",'int');
if ($page == -1) { $page = 0; }
-$offset = $conf->liste_limit * $page;
+$offset = $limit * $page;
$pageprev = $page - 1;
$pagenext = $page + 1;
if (! $sortfield) $sortfield="p.date_fin";
@@ -48,8 +49,6 @@ if (! $sortorder) $sortorder="DESC";
if ($page < 0) {
$page = 0;
}
-$limit = $conf->liste_limit;
-$offset = $limit * $page;
$langs->load("opensurvey");
diff --git a/htdocs/product/card.php b/htdocs/product/card.php
index 5f60724a135..80deacdea88 100644
--- a/htdocs/product/card.php
+++ b/htdocs/product/card.php
@@ -151,21 +151,21 @@ if (empty($reshook))
else $errors[] = 'FailedToValidateBarCode';
$error++;
- setEventMessage($errors,'errors');
+ setEventMessages($errors, null, 'errors');
}
}
if ($action == 'setaccountancy_code_buy') {
$result = $object->setAccountancyCode('buy', GETPOST('accountancy_code_buy'));
- if ($result < 0) setEventMessage(join(',',$object->errors), 'errors');
+ if ($result < 0) setEventMessages(join(',',$object->errors), null, 'errors');
$action="";
}
if ($action == 'setaccountancy_code_sell')
{
$result = $object->setAccountancyCode('sell', GETPOST('accountancy_code_sell'));
- if ($result < 0) setEventMessage(join(',',$object->errors), 'errors');
+ if ($result < 0) setEventMessages(join(',',$object->errors), null, 'errors');
$action="";
}
@@ -176,17 +176,23 @@ if (empty($reshook))
if (! GETPOST('label'))
{
- setEventMessage($langs->trans('ErrorFieldRequired',$langs->transnoentities('Label')), 'errors');
+ setEventMessages($langs->trans('ErrorFieldRequired',$langs->transnoentities('Label')), null, 'errors');
$action = "create";
$error++;
}
if (empty($ref))
{
- setEventMessage($langs->trans('ErrorFieldRequired',$langs->transnoentities('Ref')), 'errors');
+ setEventMessages($langs->trans('ErrorFieldRequired',$langs->transnoentities('Ref')), null, 'errors');
$action = "create";
$error++;
}
-
+ if (! empty(GETPOST('duration_value')) && empty(GETPOST('duration_unit')))
+ {
+ setEventMessage($langs->trans('ErrorFieldRequired',$langs->transnoentities('Unit')), 'errors');
+ $action = "create";
+ $error++;
+ }
+
if (! $error)
{
$units = GETPOST('units', 'int');
@@ -226,7 +232,8 @@ if (empty($reshook))
if ($result < 0)
{
$error++;
- setEventMessage('Failed to get bar code type information '.$stdobject->error, 'errors');
+ $mesg='Failed to get bar code type information ';
+ setEventMessages($mesg.$stdobject->error, $mesg.$stdobject->errors, 'errors');
}
$object->barcode_type_code = $stdobject->barcode_type_code;
$object->barcode_type_coder = $stdobject->barcode_type_coder;
@@ -295,8 +302,8 @@ if (empty($reshook))
}
else
{
- if (count($object->errors)) setEventMessage($object->errors, 'errors');
- else setEventMessage($langs->trans($object->error), 'errors');
+ if (count($object->errors)) setEventMessages($object->error, $object->errors, 'errors');
+ else setEventMessages($langs->trans($object->error), null, 'errors');
$action = "create";
}
}
@@ -358,7 +365,8 @@ if (empty($reshook))
if ($result < 0)
{
$error++;
- setEventMessage('Failed to get bar code type information '.$stdobject->error, 'errors');
+ $mesg='Failed to get bar code type information ';
+ setEventMessages($mesg.$stdobject->error, $mesg.$stdobject->errors, 'errors');
}
$object->barcode_type_code = $stdobject->barcode_type_code;
$object->barcode_type_coder = $stdobject->barcode_type_coder;
@@ -383,15 +391,15 @@ if (empty($reshook))
}
else
{
- if (count($object->errors)) setEventMessage($object->errors, 'errors');
- else setEventMessage($langs->trans($object->error), 'errors');
+ if (count($object->errors)) setEventMessages($object->error, $object->errors, 'errors');
+ else setEventMessages($langs->trans($object->error), null, 'errors');
$action = 'edit';
}
}
else
{
- if (count($object->errors)) setEventMessage($object->errors, 'errors');
- else setEventMessage($langs->trans("ErrorProductBadRefOrLabel"), 'errors');
+ if (count($object->errors)) setEventMessages($object->error, $object->errors, 'errors');
+ else setEventMessages($langs->trans("ErrorProductBadRefOrLabel"), null, 'errors');
$action = 'edit';
}
}
@@ -405,7 +413,7 @@ if (empty($reshook))
{
if (! GETPOST('clone_content') && ! GETPOST('clone_prices') )
{
- setEventMessage($langs->trans("NoCloneOptionsSpecified"), 'errors');
+ setEventMessages($langs->trans("NoCloneOptionsSpecified"), null, 'errors');
}
else
{
@@ -432,7 +440,7 @@ if (empty($reshook))
if ($result < 1)
{
$db->rollback();
- setEventMessage($langs->trans('ErrorProductClone'), 'errors');
+ setEventMessages($langs->trans('ErrorProductClone'), null, 'errors');
header("Location: ".$_SERVER["PHP_SELF"]."?id=".$originalId);
exit;
}
@@ -459,7 +467,7 @@ if (empty($reshook))
$mesg=$langs->trans("ErrorProductAlreadyExists",$object->ref);
$mesg.=' ref.'">'.$langs->trans("ShowCardHere").' .';
- setEventMessage($mesg, 'errors');
+ setEventMessages($mesg, null, 'errors');
$object->fetch($id);
}
else
@@ -467,12 +475,12 @@ if (empty($reshook))
$db->rollback();
if (count($object->errors))
{
- setEventMessage($object->errors, 'errors');
+ setEventMessages($object->error, $object->errors, 'errors');
dol_print_error($db,$object->errors);
}
else
{
- setEventMessage($langs->trans($object->error), 'errors');
+ setEventMessages($langs->trans($object->error), null, 'errors');
dol_print_error($db,$object->error);
}
}
@@ -503,7 +511,7 @@ if (empty($reshook))
}
else
{
- setEventMessage($langs->trans($object->error), 'errors');
+ setEventMessages($langs->trans($object->error), null, 'errors');
$reload = 0;
$action='';
}
@@ -629,7 +637,7 @@ if (empty($reshook))
return;
}
- setEventMessage($langs->trans("ErrorUnknown") . ": $result", 'errors');
+ setEventMessages($langs->trans("ErrorUnknown") . ": $result", null, 'errors');
} elseif (GETPOST('commandeid') > 0) {
$result = $commande->addline(
$desc,
@@ -701,7 +709,7 @@ if (empty($reshook))
}
else {
$action="";
- setEventMessage($langs->trans("WarningSelectOneDocument"), 'warnings');
+ setEventMessages($langs->trans("WarningSelectOneDocument"), null, 'warnings');
}
}
diff --git a/htdocs/product/document.php b/htdocs/product/document.php
index ecb3d12bb52..8a4c68990c6 100644
--- a/htdocs/product/document.php
+++ b/htdocs/product/document.php
@@ -105,7 +105,7 @@ if (empty($reshook))
$filetomerge->file_name=$filename;
$result=$filetomerge->delete_by_file($user);
if ($result<0) {
- setEventMessage($filetomerge->error,'errors');
+ setEventMessages($filetomerge->error, $filetomerge->errors, 'errors');
}
}
}
@@ -137,7 +137,7 @@ if ($action=='filemerge')
$result=$filetomerge->delete_by_product($user, $object->id);
}
if ($result<0) {
- setEventMessage($filetomerge->error,'errors');
+ setEventMessages($filetomerge->error, $filetomerge->errors, 'errors');
}
// for each file checked add it to the product
@@ -152,7 +152,7 @@ if ($action=='filemerge')
$result=$filetomerge->create($user);
if ($result<0) {
- setEventMessage($filetomerge->error,'errors');
+ setEventMessages($filetomerge->error, $filetomerge->errors, 'errors');
}
}
}
diff --git a/htdocs/product/fournisseurs.php b/htdocs/product/fournisseurs.php
index 04007d2ede1..1f5e35a043a 100644
--- a/htdocs/product/fournisseurs.php
+++ b/htdocs/product/fournisseurs.php
@@ -101,7 +101,7 @@ if (empty($reshook))
if ($result > 0)
{
$object->cost_price = price2num($cost_price);
- setEventMessage($langs->trans("RecordSaved"));
+ setEventMessages($langs->trans("RecordSaved"), null, 'mesgs');
}
else
{
@@ -119,7 +119,7 @@ if (empty($reshook))
$action = '';
$result=$object->remove_product_fournisseur_price($rowid);
if($result > 0){
- setEventMessage($langs->trans("PriceRemoved"));
+ setEventMessages($langs->trans("PriceRemoved"), null, 'mesgs');
}else{
$error++;
setEventMessages($object->error, $object->errors, 'errors');
@@ -151,7 +151,7 @@ if (empty($reshook))
{
$error++;
$langs->load("errors");
- setEventMessage($langs->trans("ErrorFieldMustBeANumeric",'eeee'), 'errors');
+ setEventMessages($langs->trans("ErrorFieldMustBeANumeric",'eeee'), null, 'errors');
}
if (empty($quantity))
{
@@ -199,12 +199,12 @@ if (empty($reshook))
$object->fetch($object->product_id_already_linked);
$productLink = $object->getNomUrl(1,'supplier');
- setEventMessage($langs->trans("ReferenceSupplierIsAlreadyAssociatedWithAProduct",$productLink), 'errors');
+ setEventMessages($langs->trans("ReferenceSupplierIsAlreadyAssociatedWithAProduct",$productLink), null, 'errors');
}
else if ($ret < 0)
{
$error++;
- setEventMessage($object->error, 'errors');
+ setEventMessages($object->error, $object->errors, 'errors');
}
}
@@ -220,7 +220,7 @@ if (empty($reshook))
{
$error++;
- setEventMessage($object->error, $object->errors, 'errors');
+ setEventMessages($object->error, $object->errors, 'errors');
}
else
{
@@ -231,7 +231,7 @@ if (empty($reshook))
$price_result = $priceparser->parseProductSupplier($id, $price_expression, $quantity, $tva_tx);
if ($price_result < 0) { //Expression is not valid
$error++;
- setEventMessage($priceparser->translatedError(), 'errors');
+ setEventMessages($priceparser->translatedError(), null, 'errors');
}
}
if (! $error && ! empty($conf->dynamicprices->enabled)) {
@@ -239,7 +239,7 @@ if (empty($reshook))
if ($ret < 0)
{
$error++;
- setEventMessage($object->error, 'errors');
+ setEventMessages($object->error, $object->errors, 'errors');
}
}
}
diff --git a/htdocs/product/list.php b/htdocs/product/list.php
index b656b88efc6..5924a89956b 100644
--- a/htdocs/product/list.php
+++ b/htdocs/product/list.php
@@ -61,7 +61,7 @@ $sortfield = GETPOST("sortfield",'alpha');
$sortorder = GETPOST("sortorder",'alpha');
$page = GETPOST("page",'int');
if ($page == -1) { $page = 0; }
-$offset = $liste_limit * $page;
+$offset = $limit * $page;
$pageprev = $page - 1;
$pagenext = $page + 1;
if (! $sortfield) $sortfield="p.ref";
@@ -293,7 +293,7 @@ else
// Displays product removal confirmation
if (GETPOST('delprod')) {
- setEventMessage($langs->trans("ProductDeleted", GETPOST('delprod')));
+ setEventMessages($langs->trans("ProductDeleted", GETPOST('delprod')), null, 'mesgs');
}
if ($sref) $param="&sref=".$sref;
diff --git a/htdocs/product/price.php b/htdocs/product/price.php
index 2a770841c60..e5b93d981af 100644
--- a/htdocs/product/price.php
+++ b/htdocs/product/price.php
@@ -6,7 +6,7 @@
* Copyright (C) 2006 Andre Cianfarani
* Copyright (C) 2014 Florian Henry
* Copyright (C) 2014 Juanjo Menent
- * Copyright (C) 2014 Philippe Grand
+ * Copyright (C) 2014-2015 Philippe Grand
* Copyright (C) 2014 Ion agorria
* Copyright (C) 2015 Alexandre Spangaro
* Copyright (C) 2015 Marcos García
@@ -131,7 +131,7 @@ if (empty($reshook))
if ($priceparser->parseProduct($object) < 0) {
$error ++;
- setEventMessage($priceparser->translatedError(), 'errors');
+ setEventMessages($priceparser->translatedError(), null, 'errors');
}
}
}
@@ -194,7 +194,7 @@ if (empty($reshook))
$newprice_min = price2num($val['price_min'], 'MU');
if (!empty($conf->global->PRODUCT_MINIMUM_RECOMMENDED_PRICE) && $newprice_min < $maxpricesupplier) {
- setEventMessage($langs->trans("MinimumPriceLimit", price($maxpricesupplier, 0, '', 1, - 1, - 1, 'auto')), 'errors');
+ setEventMessages($langs->trans("MinimumPriceLimit", price($maxpricesupplier, 0, '', 1, - 1, - 1, 'auto')), null, 'errors');
$error ++;
break;
}
@@ -203,7 +203,7 @@ if (empty($reshook))
if ($res < 0) {
$error ++;
- setEventMessage($object->error, 'errors');
+ setEventMessages($object->error, $object->errors, 'errors');
break;
}
}
@@ -211,12 +211,12 @@ if (empty($reshook))
if (!$error && $object->update($object->id, $user) < 0) {
$error++;
- setEventMessage($object->error, 'errors');
+ setEventMessages($object->error, $object->errors, 'errors');
}
if (empty($error)) {
$action = '';
- setEventMessage($langs->trans("RecordSaved"));
+ setEventMessages($langs->trans("RecordSaved"), null, 'mesgs');
$db->commit();
} else {
$action = 'edit_price';
@@ -229,7 +229,7 @@ if (empty($reshook))
{
$result = $object->log_price_delete($user, $_GET ["lineid"]);
if ($result < 0) {
- setEventMessage($object->error, 'errors');
+ setEventMessages($object->error, $object->errors, 'errors');
}
}
@@ -341,7 +341,7 @@ if (empty($reshook))
if (! empty($conf->global->PRODUCT_MINIMUM_RECOMMENDED_PRICE) && $prodcustprice->price_min<$maxpricesupplier)
{
- setEventMessage($langs->trans("MinimumPriceLimit",price($maxpricesupplier,0,'',1,-1,-1,'auto')),'errors');
+ setEventMessages($langs->trans("MinimumPriceLimit",price($maxpricesupplier,0,'',1,-1,-1,'auto')), null, 'errors');
$error++;
$action='add_customer_price';
}
@@ -351,9 +351,9 @@ if (empty($reshook))
$result = $prodcustprice->create($user, 0, $update_child_soc);
if ($result < 0) {
- setEventMessage($prodcustprice->error, 'errors');
+ setEventMessages($prodcustprice->error, $prodcustprice->errors, 'errors');
} else {
- setEventMessage($langs->trans('RecordSaved'), 'mesgs');
+ setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
}
$action = '';
@@ -367,9 +367,9 @@ if (empty($reshook))
$result = $prodcustprice->delete($user);
if ($result < 0) {
- setEventMessage($prodcustprice->error, 'mesgs');
+ setEventMessages($prodcustprice->error, $prodcustprice->errors, 'mesgs');
} else {
- setEventMessage($langs->trans('RecordDeleted'), 'errors');
+ setEventMessages($langs->trans('RecordDeleted'), null, 'errors');
}
$action = '';
}
@@ -391,7 +391,7 @@ if (empty($reshook))
if ($prodcustprice->price_min<$maxpricesupplier && !empty($conf->global->PRODUCT_MINIMUM_RECOMMENDED_PRICE))
{
- setEventMessage($langs->trans("MinimumPriceLimit",price($maxpricesupplier,0,'',1,-1,-1,'auto')),'errors');
+ setEventMessages($langs->trans("MinimumPriceLimit",price($maxpricesupplier,0,'',1,-1,-1,'auto')), null, 'errors');
$error++;
$action='update_customer_price';
}
@@ -401,9 +401,9 @@ if (empty($reshook))
$result = $prodcustprice->update($user, 0, $update_child_soc);
if ($result < 0) {
- setEventMessage($prodcustprice->error, 'errors');
+ setEventMessages($prodcustprice->error, $prodcustprice->errors, 'errors');
} else {
- setEventMessage($langs->trans('Save'), 'mesgs');
+ setEventMessages($langs->trans('Save'), null, 'mesgs');
}
$action = '';
@@ -1257,7 +1257,7 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES))
$result = $prodcustprice->fetch(GETPOST('lineid', 'int'));
if ($result < 0) {
- setEventMessage($prodcustprice->error, 'errors');
+ setEventMessages($prodcustprice->error, $prodcustprice->errors, 'errors');
}
print '