Browse Source

Merge branch 'develop' of https://github.com/Dolibarr/dolibarr.git into develop_mc

Regis Houssin 8 years ago
parent
commit
bfd6116e5b
100 changed files with 621 additions and 509 deletions
  1. 1 1
      htdocs/accountancy/admin/fiscalyear.php
  2. 1 1
      htdocs/accountancy/admin/importaccounts.php
  3. 1 1
      htdocs/accountancy/admin/productaccount.php
  4. 78 67
      htdocs/accountancy/journal/bankjournal.php
  5. 159 152
      htdocs/accountancy/journal/expensereportsjournal.php
  6. 1 1
      htdocs/adherents/list.php
  7. 1 1
      htdocs/adherents/type.php
  8. 1 1
      htdocs/admin/defaultvalues.php
  9. 1 1
      htdocs/admin/translation.php
  10. 1 1
      htdocs/bookmarks/list.php
  11. 1 1
      htdocs/comm/action/document.php
  12. 1 1
      htdocs/comm/action/index.php
  13. 1 1
      htdocs/comm/action/pertype.php
  14. 1 1
      htdocs/comm/action/peruser.php
  15. 1 1
      htdocs/comm/card.php
  16. 1 1
      htdocs/comm/mailing/cibles.php
  17. 1 1
      htdocs/comm/mailing/list.php
  18. 1 1
      htdocs/comm/propal/document.php
  19. 1 1
      htdocs/comm/propal/list.php
  20. 1 1
      htdocs/commande/customer.php
  21. 1 1
      htdocs/commande/document.php
  22. 1 1
      htdocs/commande/list.php
  23. 1 1
      htdocs/compta/bank/bankentries.php
  24. 1 1
      htdocs/compta/bank/index.php
  25. 1 1
      htdocs/compta/bank/releve.php
  26. 1 1
      htdocs/compta/bank/various_payment/document.php
  27. 1 1
      htdocs/compta/bank/various_payment/index.php
  28. 1 1
      htdocs/compta/charges/index.php
  29. 1 1
      htdocs/compta/clients.php
  30. 1 1
      htdocs/compta/deplacement/document.php
  31. 1 1
      htdocs/compta/deplacement/index.php
  32. 1 1
      htdocs/compta/deplacement/list.php
  33. 1 1
      htdocs/compta/facture/document.php
  34. 1 1
      htdocs/compta/facture/fiche-rec.php
  35. 1 1
      htdocs/compta/facture/list.php
  36. 1 1
      htdocs/compta/paiement/avalider.php
  37. 1 1
      htdocs/compta/paiement/cheque/list.php
  38. 1 1
      htdocs/compta/paiement/list.php
  39. 1 1
      htdocs/compta/prelevement/bons.php
  40. 1 1
      htdocs/compta/prelevement/card.php
  41. 1 1
      htdocs/compta/prelevement/demandes.php
  42. 1 1
      htdocs/compta/prelevement/factures.php
  43. 1 1
      htdocs/compta/prelevement/list.php
  44. 1 1
      htdocs/compta/recap-compta.php
  45. 1 1
      htdocs/compta/resultat/clientfourn.php
  46. 1 1
      htdocs/compta/salaries/document.php
  47. 1 1
      htdocs/compta/salaries/index.php
  48. 1 1
      htdocs/compta/sociales/index.php
  49. 1 1
      htdocs/compta/sociales/payments.php
  50. 18 15
      htdocs/compta/tva/card.php
  51. 63 37
      htdocs/compta/tva/class/tva.class.php
  52. 10 1
      htdocs/compta/tva/info.php
  53. 1 1
      htdocs/compta/tva/reglement.php
  54. 1 1
      htdocs/contact/agenda.php
  55. 1 1
      htdocs/contrat/document.php
  56. 1 1
      htdocs/contrat/list.php
  57. 1 1
      htdocs/contrat/services.php
  58. 1 1
      htdocs/core/ajax/ajaxdirpreview.php
  59. 14 14
      htdocs/core/class/conf.class.php
  60. 7 3
      htdocs/core/class/hookmanager.class.php
  61. 26 25
      htdocs/core/menus/standard/eldy.lib.php
  62. 1 1
      htdocs/cron/list.php
  63. 1 1
      htdocs/don/document.php
  64. 1 1
      htdocs/don/list.php
  65. 1 1
      htdocs/ecm/docdir.php
  66. 1 1
      htdocs/ecm/docfile.php
  67. 1 1
      htdocs/ecm/docmine.php
  68. 1 1
      htdocs/ecm/index.php
  69. 1 1
      htdocs/ecm/index_auto.php
  70. 1 1
      htdocs/ecm/search.php
  71. 1 1
      htdocs/expedition/list.php
  72. 1 1
      htdocs/expensereport/document.php
  73. 1 1
      htdocs/expensereport/index.php
  74. 1 1
      htdocs/expensereport/list.php
  75. 1 1
      htdocs/fichinter/document.php
  76. 1 1
      htdocs/fichinter/list.php
  77. 1 1
      htdocs/fourn/commande/document.php
  78. 1 1
      htdocs/fourn/commande/list.php
  79. 1 1
      htdocs/fourn/contact.php
  80. 1 1
      htdocs/fourn/facture/impayees.php
  81. 1 1
      htdocs/fourn/facture/paiement.php
  82. 1 1
      htdocs/ftp/index.php
  83. 1 1
      htdocs/holiday/document.php
  84. 1 0
      htdocs/install/mysql/data/llx_accounting.sql
  85. 2 0
      htdocs/install/mysql/migration/5.0.0-6.0.0.sql
  86. 3 3
      htdocs/install/mysql/tables/llx_accounting_journal.sql
  87. 1 0
      htdocs/install/mysql/tables/llx_tva.sql
  88. 0 80
      htdocs/install/upgrade.php
  89. 153 28
      htdocs/install/upgrade2.php
  90. 1 0
      htdocs/langs/en_US/banks.lang
  91. 1 0
      htdocs/langs/en_US/install.lang
  92. 1 1
      htdocs/loan/index.php
  93. 1 1
      htdocs/margin/agentMargins.php
  94. 1 1
      htdocs/margin/customerMargins.php
  95. 1 1
      htdocs/margin/productMargins.php
  96. 1 1
      htdocs/margin/tabs/productMargins.php
  97. 1 1
      htdocs/margin/tabs/thirdpartyMargins.php
  98. 1 1
      htdocs/modulebuilder/template/myobject_list.php
  99. 1 1
      htdocs/opensurvey/list.php
  100. 1 1
      htdocs/product/document.php

+ 1 - 1
htdocs/accountancy/admin/fiscalyear.php

@@ -32,7 +32,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST('sortfield','alpha');
 $sortorder = GETPOST('sortorder','alpha');
 $page = GETPOST('page','int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/accountancy/admin/importaccounts.php

@@ -43,7 +43,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):(empty($conf->global->ACCOUNTIN
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/accountancy/admin/productaccount.php

@@ -74,7 +74,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):(empty($conf->global->ACCOUNTIN
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 78 - 67
htdocs/accountancy/journal/bankjournal.php

@@ -63,12 +63,10 @@ $langs->load('bills');
 $langs->load('donations');
 $langs->load("accountancy");
 $langs->load("trips");
-$langs->load("hrm");
+$langs->load("salaries");
 
-// Old system menu
-$id_bank_account = GETPOST('id_account', 'int');
 // Multi journal
-$code_journal = GETPOST('code_journal', 'alpha');
+$id_journal = GETPOST('id_journal', 'int');
 
 $date_startmonth = GETPOST('date_startmonth');
 $date_startday = GETPOST('date_startday');
@@ -81,7 +79,7 @@ $action = GETPOST('action','aZ09');
 $now = dol_now();
 
 // Security check
-if ($user->societe_id > 0 && empty($id_bank_account))
+if ($user->societe_id > 0 && empty($id_journal))
 	accessforbidden();
 
 
@@ -112,16 +110,16 @@ $p = explode(":", $conf->global->MAIN_INFO_SOCIETE_COUNTRY);
 $idpays = $p[0];
 
 $sql  = "SELECT b.rowid, b.dateo as do, b.datev as dv, b.amount, b.label, b.rappro, b.num_releve, b.num_chq, b.fk_type,";
-$sql .= " ba.courant, ba.ref as baref, ba.account_number,";
+$sql .= " ba.courant, ba.ref as baref, ba.account_number, ba.fk_accountancy_journal,";
 $sql .= " soc.code_compta, soc.code_compta_fournisseur, soc.rowid as socid, soc.nom as name, bu1.type as typeop,";
-$sql .= " u.accountancy_code, u.rowid as userid, u.lastname as name, u.firstname as firstname, bu2.type as typeop";
+$sql .= " u.accountancy_code, u.rowid as userid, u.lastname as lastname, u.firstname as firstname, bu2.type as typeop";
 $sql .= " FROM " . MAIN_DB_PREFIX . "bank as b";
 $sql .= " JOIN " . MAIN_DB_PREFIX . "bank_account as ba on b.fk_account=ba.rowid";
 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url as bu1 ON bu1.fk_bank = b.rowid AND bu1.type='company'";
 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url as bu2 ON bu2.fk_bank = b.rowid AND bu2.type='user'";
 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "societe as soc on bu1.url_id=soc.rowid";
 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "user as u on bu2.url_id=u.rowid";
-$sql .= " WHERE ba.rowid=" . $id_bank_account;
+$sql .= " WHERE ba.fk_accountancy_journal=" . $id_journal;
 $sql .= ' AND ba.entity IN ('.getEntity('bank_account', 0).')';        // We don't share object for accountancy
 if ($date_start && $date_end)
 	$sql .= " AND b.dateo >= '" . $db->idate($date_start) . "' AND b.dateo <= '" . $db->idate($date_end) . "'";
@@ -139,20 +137,8 @@ $paymentsalstatic = new PaymentSalary($db);
 $paymentexpensereportstatic = new PaymentExpenseReport($db);
 
 // Get code of finance journal
-$journal = '';
-$bankstatic = new Account($db);
-$bankstatic->fetch($id_bank_account);
-$bankstatic->rowid;
-$bankstatic->number;
-$bankstatic->label;
-$bankstatic->fk_accountancy_journal;
-
 $accountingjournalstatic = new AccountingJournal($db);
-if(! empty($id_bank_account)) {
-	$accountingjournalstatic->fetch($bankstatic->fk_accountancy_journal);
-} else {
-	$accountingjournalstatic->fetch('',$code_journal);
-}
+$accountingjournalstatic->fetch($id_journal);
 $journal = $accountingjournalstatic->code;
 
 dol_syslog("accountancy/journal/bankjournal.php", LOG_DEBUG);
@@ -180,7 +166,7 @@ if ($result) {
 	// one line for bank jounral = tabbq
 	// one line for thirdparty journal = tabtp
 	$i = 0;
-	while ( $i < $num ) 
+	while ( $i < $num )
 	{
 		$obj = $db->fetch_object($result);
 
@@ -194,16 +180,17 @@ if ($result) {
 		$tabcompany[$obj->rowid] = array (
 				'id' => $obj->socid,
 				'name' => $obj->name,
-		        'code_compta' => $compta_soc,
+				'code_compta' => $compta_soc,
 		);
 
 		$compta_user = (! empty($obj->accountancy_code) ? $obj->accountancy_code : $account_employee);
 
 		$tabuser[$obj->rowid] = array (
 				'id' => $obj->userid,
+				'name' => dolGetFirstLastname($obj->firstname, $obj->lastname),
 				'lastname' => $obj->lastname,
 				'firstname' => $obj->firstname,
-		        'accountancy_code' => $compta_user,
+				'accountancy_code' => $compta_user,
 		);
 
 		// Variable bookkeeping
@@ -220,12 +207,12 @@ if ($result) {
 
 		// get_url may return -1 which is not traversable
 		if (is_array($links)) {
-		    // Now loop on each link of record in bank.
+			// Now loop on each link of record in bank.
 			foreach ( $links as $key => $val ) {
 
-			    if (in_array($links[$key]['type'], array('sc', 'payment_sc', 'payment', 'payment_supplier', 'payment_vat', 'payment_expensereport', 'banktransfert', 'payment_donation')))     // So we excluded 'company' here
+			    if (in_array($links[$key]['type'], array('sc', 'payment_sc', 'payment', 'payment_supplier', 'payment_vat', 'payment_expensereport', 'banktransfert', 'payment_donation', 'payment_salary')))     // So we excluded 'company' here
 			    {
-			        // We save tabtype for a future use, to remember what kind of payment it is 
+			        // We save tabtype for a future use, to remember what kind of payment it is
 			        $tabtype[$obj->rowid] = $links[$key]['type'];
 			    }
 
@@ -294,7 +281,7 @@ if ($result) {
 					$paymentsalstatic->ref = $links[$key]['url_id'];
 					$paymentsalstatic->label = $links[$key]['label'];
 					$tabpay[$obj->rowid]["lib"] .= ' ' . $paymentsalstatic->getNomUrl(2);
-					// $tabtp[$obj->rowid][$account_employee] += $obj->amount;
+					$tabpay[$obj->rowid]["paymentsalid"] = $paymentsalstatic->id;
 				} else if ($links[$key]['type'] == 'payment_expensereport') {
 					$paymentexpensereportstatic->id = $links[$key]['url_id'];
 					$paymentexpensereportstatic->fk_expensereport = $links[$key]['url_id'];
@@ -309,7 +296,7 @@ if ($result) {
 
 		$tabbq[$obj->rowid][$compta_bank] += $obj->amount;
 
-		
+
 		// Check account number is ok
 		/*if ($action == 'writebookkeeping')        // Make test now in such a case
 		{
@@ -328,7 +315,7 @@ if ($result) {
     	        setEventMessages($langs->trans('ErrorAccountancyCodeOnThirdPartyNotDefined'), null, 'errors');
     		}
 		}*/
-		
+
 		// if($obj->socid)$tabtp[$obj->rowid][$compta_soc] += $obj->amount;
 
 		$i ++;
@@ -358,7 +345,7 @@ if (! $error && $action == 'writebookkeeping') {
 		if (! $errorforline)
 		{
 		    // Line into bank account
-    		foreach ( $tabbq[$key] as $k => $mt ) 
+    		foreach ( $tabbq[$key] as $k => $mt )
     		{
     			if ($mt) {
         		    $bookkeeping = new BookKeeping($db);
@@ -376,10 +363,10 @@ if (! $error && $action == 'writebookkeeping') {
         			$bookkeeping->code_journal = $journal;
         			$bookkeeping->fk_user_author = $user->id;
         			$bookkeeping->date_create = $now;
-        
+
         			if ($tabtype[$key] == 'payment') {
         			    $bookkeeping->code_tiers = $tabcompany[$key]['code_compta'];
-    
+
         				$sqlmid = 'SELECT fac.facnumber';
         				$sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture fac";
         				$sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiement_facture as payfac ON payfac.fk_facture=fac.rowid";
@@ -393,7 +380,7 @@ if (! $error && $action == 'writebookkeeping') {
         				}
         			} else if ($tabtype[$key] == 'payment_supplier') {
         			    $bookkeeping->code_tiers = $tabcompany[$key]['code_compta'];
-    
+
         				$sqlmid = 'SELECT facf.ref_supplier, facf.ref';
         				$sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture_fourn facf";
         				$sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn_facturefourn as payfacf ON payfacf.fk_facturefourn=facf.rowid";
@@ -407,7 +394,7 @@ if (! $error && $action == 'writebookkeeping') {
         				}
         			} else if ($tabtype[$key] == 'payment_expensereport') {
         			    $bookkeeping->code_tiers = $tabuser[$key]['accountancy_code'];
-    
+
         				$sqlmid = 'SELECT e.ref';
         				$sqlmid .= " FROM " . MAIN_DB_PREFIX . "expensereport as e";
         				$sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "payment_expensereport as payer ON payer.fk_expensereport=e.rowid";
@@ -418,14 +405,18 @@ if (! $error && $action == 'writebookkeeping') {
         					$objmid = $db->fetch_object($resultmid);
         					$bookkeeping->doc_ref = $objmid->ref; // Ref of expensereport
         				}
-        			} else if ($tabtype[$key] == 'payment_vat') {
-  			  			$bookkeeping->code_tiers = '';
-	  			  		$bookkeeping->doc_ref = $langs->trans("PaymentVat") . ' (' . $val["paymentvatid"] . ')'; // Rowid of vat payment
-        			} else if ($tabtype[$key] == 'payment_donation') {
-		  			  	$bookkeeping->code_tiers = '';
-			  			  $bookkeeping->doc_ref = $langs->trans("Donation") . ' (' . $val["paymentdonationid"] . ')'; // Rowid of donation
-        			}
-        
+					} else if ($tabtype[$key] == 'payment_vat') {
+						$bookkeeping->code_tiers = '';
+						$bookkeeping->doc_ref = $langs->trans("PaymentVat") . ' (' . $val["paymentvatid"] . ')'; // Rowid of vat payment
+					} else if ($tabtype[$key] == 'payment_donation') {
+						$bookkeeping->code_tiers = '';
+						$bookkeeping->doc_ref = $langs->trans("Donation") . ' (' . $val["paymentdonationid"] . ')'; // Rowid of donation
+					} else if ($tabtype[$key] == 'payment_salary') {
+						$bookkeeping->code_tiers = '';
+						$bookkeeping->label_compte = $tabuser[$key]['name'];
+						$bookkeeping->doc_ref = $langs->trans("SalaryPayment") . ' (' . $val["paymentsalid"] . ')'; // Ref of salary payment
+					}
+
         			$result = $bookkeeping->create($user);
         			if ($result < 0) {
         				if ($bookkeeping->error == 'BookkeepingRecordAlreadyExists')	// Already exists
@@ -465,7 +456,7 @@ if (! $error && $action == 'writebookkeeping') {
         			$bookkeeping->code_journal = $journal;
         			$bookkeeping->fk_user_author = $user->id;
         			$bookkeeping->date_create = $now;
-        
+
         			if (in_array($tabtype[$key], array('sc', 'payment_sc'))) {   // If payment is payment of social contribution
         				$bookkeeping->code_tiers = '';
         				$bookkeeping->numero_compte = $k;
@@ -495,26 +486,31 @@ if (! $error && $action == 'writebookkeeping') {
         					$objmid = $db->fetch_object($resultmid);
         					$bookkeeping->doc_ref = $objmid->ref_supplier . ' (' . $objmid->ref . ')';
         				}
-                $bookkeeping->code_tiers = $tabcompany[$key]['code_compta'];
-        				$bookkeeping->numero_compte = $k;
-    					} else if ($tabtype[$key] == 'payment_vat') {
-	  		  			$bookkeeping->code_tiers = '';
-		  		  		$bookkeeping->numero_compte = $k;
-			  		  	$bookkeeping->doc_ref = $langs->trans("PaymentVat") . ' (' . $val["paymentvatid"] . ')'; // Rowid of vat
-            	} else if ($tabtype[$key] == 'payment_donation') {
-					  	  $bookkeeping->code_tiers = '';
-						    $bookkeeping->numero_compte = $k;
-						    $bookkeeping->doc_ref = $langs->trans("Donation") . ' (' . $val["paymentdonationid"] . ')'; // Rowid of donation
-         			} else if ($tabtype[$key] == 'banktransfert') {
-  						  $bookkeeping->code_tiers = '';
-        				$bookkeeping->numero_compte = $k;
+						$bookkeeping->code_tiers = $tabcompany[$key]['code_compta'];
+						$bookkeeping->numero_compte = $k;
+					} else if ($tabtype[$key] == 'payment_vat') {
+						$bookkeeping->code_tiers = '';
+						$bookkeeping->numero_compte = $k;
+						$bookkeeping->doc_ref = $langs->trans("PaymentVat") . ' (' . $val["paymentvatid"] . ')'; // Rowid of vat
+					} else if ($tabtype[$key] == 'payment_donation') {
+						$bookkeeping->code_tiers = '';
+						$bookkeeping->numero_compte = $k;
+						$bookkeeping->doc_ref = $langs->trans("Donation") . ' (' . $val["paymentdonationid"] . ')'; // Rowid of donation
+					} else if ($tabtype[$key] == 'payment_salary') {
+						$bookkeeping->code_tiers = $tabuser[$key]['accountancy_code'];
+						$bookkeeping->numero_compte = $conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT;
+						$bookkeeping->label_compte = $tabuser[$key]['name'];
+						$bookkeeping->doc_ref = $langs->trans("SalaryPayment") . ' (' . $val["paymentsalid"] . ')'; // Rowid of salary payment
+					} else if ($tabtype[$key] == 'banktransfert') {
+						$bookkeeping->code_tiers = '';
+						$bookkeeping->numero_compte = $k;
         			} else {
         			    // FIXME Should be a temporary account ???
         				$bookkeeping->doc_ref = $k;
         				//$bookkeeping->numero_compte = $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER;
         				$bookkeeping->numero_compte = 'CodeNotDef';
         			}
-        
+
         			$result = $bookkeeping->create($user);
         			if ($result < 0) {
         				if ($bookkeeping->error == 'BookkeepingRecordAlreadyExists')	// Already exists
@@ -533,7 +529,7 @@ if (! $error && $action == 'writebookkeeping') {
     			}
     		}
 		}
-		
+
 		if (! $errorforline)
 		{
             $db->commit();
@@ -555,7 +551,7 @@ if (! $error && $action == 'writebookkeeping') {
 	{
 	    setEventMessages($langs->trans("GeneralLedgerSomeRecordWasNotRecorded"), null, 'warnings');
 	}
-	
+
 	$action = '';
 }
 
@@ -596,7 +592,7 @@ if ($action == 'export_csv') {
 			if ($reflabel == '(ExpenseReportPayment)') {
 				$reflabel = $langs->trans('Employee');
 			}
-			
+
 			$companystatic->id = $tabcompany[$key]['id'];
 			$companystatic->name = $tabcompany[$key]['name'];
 
@@ -740,18 +736,19 @@ if (empty($action) || $action == 'view') {
 	$invoicestatic = new Facture($db);
 	$invoicesupplierstatic = new FactureFournisseur($db);
 	$expensereportstatic = new ExpenseReport($db);
-  $vatstatic = new Tva($db);
+	$vatstatic = new Tva($db);
 	$donationstatic = new Don($db);
+	$salarystatic = new PaymentSalary($db);
 
 	llxHeader('', $langs->trans("FinanceJournal"));
 
-	$nom = $langs->trans("FinanceJournal") . ' - ' . $bankstatic->getNomUrl(1);
+	$nom = $langs->trans("FinanceJournal") . ' - ' . $accountingjournalstatic->getNomUrl(1);
 	$builddate = time();
 	//$description = $langs->trans("DescFinanceJournal") . '<br>';
 	$description.= $langs->trans("DescJournalOnlyBindedVisible").'<br>';
 	$period = $form->select_date($date_start, 'date_start', 0, 0, 0, '', 1, 0, 1) . ' - ' . $form->select_date($date_end, 'date_end', 0, 0, 0, '', 1, 0, 1);
 
-	$varlink = 'id_account=' . $id_bank_account;
+	$varlink = 'id_journal=' . $id_journal;
 
 	journalHead($nom, $nomlink, $period, $periodlink, $description, $builddate, $exportlink, array('action' => ''), '', $varlink);
 
@@ -764,7 +761,7 @@ if (empty($action) || $action == 'view') {
     print '<div class="tabsAction">';
 	print '<input type="button" class="butAction" value="' . $langs->trans("WriteBookKeeping") . '" onclick="writebookkeeping();" />';
     print '</div>';
-    
+
 	// TODO Avoid using js. We can use a direct link with $param
 	print '
 	<script type="text/javascript">
@@ -896,13 +893,27 @@ if (empty($action) || $action == 'view') {
 		    }
 		    else dol_print_error($db);
 		}
+		elseif ($tabtype[$key] == 'payment_salary')
+		{
+			$sqlmid = 'SELECT s.rowid as id';
+			$sqlmid .= " FROM " . MAIN_DB_PREFIX . "payment_salary as s";
+			$sqlmid .= " WHERE s.rowid=" . $val["paymentsalid"];
+			dol_syslog("accountancy/journal/bankjournal.php::sqlmid=" . $sqlmid, LOG_DEBUG);
+			$resultmid = $db->query($sqlmid);
+			if ($resultmid) {
+				$objmid = $db->fetch_object($resultmid);
+				$salarystatic->fetch($objmid->id);
+				$ref=$langs->trans("SalaryPayment").' '.$salarystatic->getNomUrl(1);
+			}
+			else dol_print_error($db);
+		}
 
 
 		/*$invoicestatic->id = $key;
 		$invoicestatic->ref = $val["ref"];
 		$invoicestatic->type = $val["type"];*/
 		// Bank
-		foreach ( $tabbq[$key] as $k => $mt ) 
+		foreach ( $tabbq[$key] as $k => $mt )
 		{
 		    print '<tr class="oddeven">';
 		    print "<td><!-- Bank bank.rowid=".$key."--></td>";
@@ -961,7 +972,7 @@ if (empty($action) || $action == 'view') {
         		{
         		    print '<span class="error">'.$langs->trans("WaitAccountNotDefined").'</span>';
         		}
-				else print length_accountg($conf->global->ACCOUNTING_ACCOUNT_SUSPENSE); 
+				else print length_accountg($conf->global->ACCOUNTING_ACCOUNT_SUSPENSE);
 				print "</td>";
 				print "<td>" . $reflabel . "</td>";
 				print "<td>&nbsp;</td>";

+ 159 - 152
htdocs/accountancy/journal/expensereportsjournal.php

@@ -3,7 +3,7 @@
  * Copyright (C) 2007-2010	Jean Heimburger		<jean@tiaris.info>
  * Copyright (C) 2011		Juanjo Menent		<jmenent@2byte.es>
  * Copyright (C) 2012		Regis Houssin		<regis@dolibarr.fr>
- * Copyright (C) 2013-2016	Alexandre Spangaro	<aspangaro@zendsi.com>
+ * Copyright (C) 2013-2017	Alexandre Spangaro	<aspangaro@zendsi.com>
  * Copyright (C) 2013-2016	Olivier Geffroy		<jeff@jeffinfo.com>
  * Copyright (C) 2013-2016	Florian Henry		<florian.henry@open-concept.pro>
  *
@@ -32,10 +32,11 @@ require '../../main.inc.php';
 require_once DOL_DOCUMENT_ROOT . '/core/lib/report.lib.php';
 require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php';
 require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php';
+require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingjournal.class.php';
+require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingaccount.class.php';
 require_once DOL_DOCUMENT_ROOT . '/expensereport/class/expensereport.class.php';
 require_once DOL_DOCUMENT_ROOT . '/user/class/user.class.php';
 require_once DOL_DOCUMENT_ROOT . '/accountancy/class/bookkeeping.class.php';
-require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingaccount.class.php';
 
 // Langs
 $langs->load("compta");
@@ -45,6 +46,9 @@ $langs->load("main");
 $langs->load("accountancy");
 $langs->load("trips");
 
+// Multi journal
+$id_journal = GETPOST('id_journal', 'int');
+
 $date_startmonth = GETPOST('date_startmonth');
 $date_startday = GETPOST('date_startday');
 $date_startyear = GETPOST('date_startyear');
@@ -64,6 +68,10 @@ $action = GETPOST('action','aZ09');
 /*
  * Actions
  */
+// Get code of finance journal
+$accountingjournalstatic = new AccountingJournal($db);
+$accountingjournalstatic->fetch($id_journal);
+$journal = $accountingjournalstatic->code;
 
 $year_current = strftime("%Y", dol_now());
 $pastmonth = strftime("%m", dol_now()) - 1;
@@ -157,161 +165,159 @@ if ($action == 'writebookkeeping') {
 	{
 		$errorforline = 0;
 
-	    $db->begin();
-	     
-        if (! $errorforline)
-        {
-    	    foreach ( $tabttc[$key] as $k => $mt ) {
-    			if ($mt) {
-        	        // get compte id and label
-        
-        			$bookkeeping = new BookKeeping($db);
-        			$bookkeeping->doc_date = $val["date"];
-        			$bookkeeping->doc_ref = $val["ref"];
-        			$bookkeeping->date_create = $now;
-        			$bookkeeping->doc_type = 'expense_report';
-        			$bookkeeping->fk_doc = $key;
-        			$bookkeeping->fk_docdet = $val["fk_expensereportdet"];
-        			$bookkeeping->code_tiers = $tabuser[$key]['user_accountancy_code'];
-        			$bookkeeping->label_compte = $tabuser[$key]['name'];
-        			$bookkeeping->numero_compte = $conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT;
-        			$bookkeeping->montant = $mt;
-        			$bookkeeping->sens = ($mt >= 0) ? 'C' : 'D';
-        			$bookkeeping->debit = ($mt <= 0) ? $mt : 0;
-        			$bookkeeping->credit = ($mt > 0) ? $mt : 0;
-        			$bookkeeping->code_journal = $conf->global->ACCOUNTING_EXPENSEREPORT_JOURNAL;
-        			$bookkeeping->fk_user_author = $user->id;
-        
-        			$result = $bookkeeping->create($user);
-        			if ($result < 0) {
-        			    if ($bookkeeping->error == 'BookkeepingRecordAlreadyExists')	// Already exists
-        			    {
-        			        $error++;
-        			        $errorforline++;
-        			        //setEventMessages('Transaction for ('.$bookkeeping->doc_type.', '.$bookkeeping->doc_ref.', '.$bookkeeping->fk_docdet.') were already recorded', null, 'warnings');
-        			    }
-        			    else
-        			    {
-        			        $error++;
-        			        $errorforline++;
-        			        setEventMessages($bookkeeping->error, $bookkeeping->errors, 'errors');
-        			    }
-        			}
-    			}
-    		}
-        }
-        
-        if (! $errorforline)
-        {
-            // Fees
-    		foreach ( $tabht[$key] as $k => $mt ) {
-    			$accountingaccount = new AccountingAccount($db);
-    			$accountingaccount->fetch(null, $k, true);
-    			if ($mt) {
-    				// get compte id and label
-    				$accountingaccount = new AccountingAccount($db);
-    				if ($accountingaccount->fetch(null, $k, true)) {
-    					$bookkeeping = new BookKeeping($db);
-    					$bookkeeping->doc_date = $val["date"];
-    					$bookkeeping->doc_ref = $val["ref"];
-    					$bookkeeping->date_create = $now;
-    					$bookkeeping->doc_type = 'expense_report';
-    					$bookkeeping->fk_doc = $key;
-    					$bookkeeping->fk_docdet = $val["fk_expensereportdet"];
-    					$bookkeeping->code_tiers = '';
-    					$bookkeeping->label_compte = $accountingaccount->label;
-    					$bookkeeping->numero_compte = $k;
-    					$bookkeeping->montant = $mt;
-    					$bookkeeping->sens = ($mt < 0) ? 'C' : 'D';
-    					$bookkeeping->debit = ($mt > 0) ? $mt : 0;
-    					$bookkeeping->credit = ($mt <= 0) ? $mt : 0;
-    					$bookkeeping->code_journal = $conf->global->ACCOUNTING_EXPENSEREPORT_JOURNAL;
-    					$bookkeeping->fk_user_author = $user->id;
-    
-    					$result = $bookkeeping->create($user);
-	        			if ($result < 0) {
-            			    if ($bookkeeping->error == 'BookkeepingRecordAlreadyExists')	// Already exists
-            			    {
-            			        $error++;
-            			        $errorforline++;
-            			        //setEventMessages('Transaction for ('.$bookkeeping->doc_type.', '.$bookkeeping->doc_ref.', '.$bookkeeping->fk_docdet.') were already recorded', null, 'warnings');
-            			    }
-            			    else
-            			    {
-            			        $error++;
-            			        $errorforline++;
-            			        setEventMessages($bookkeeping->error, $bookkeeping->errors, 'errors');
-            			    }
-	        			}
-    				}
-    			}
-    		}
-        }
-        
-        if (! $errorforline)
-        {
-            // VAT
-    		// var_dump($tabtva);
-    		foreach ( $tabtva[$key] as $k => $mt ) {
-    			if ($mt) {
-    				// get compte id and label
-    				$bookkeeping = new BookKeeping($db);
-    				$bookkeeping->doc_date = $val["date"];
-    				$bookkeeping->doc_ref = $val["ref"];
-    				$bookkeeping->date_create = $now;
-    				$bookkeeping->doc_type = 'expense_report';
-    				$bookkeeping->fk_doc = $key;
-    				$bookkeeping->fk_docdet = $val["fk_expensereportdet"];
-    				$bookkeeping->code_tiers = '';
-    				$bookkeeping->label_compte = $langs->trans("VAT"). ' '.$def_tva[$key];
-    				$bookkeeping->numero_compte = $k;
-    				$bookkeeping->montant = $mt;
-    				$bookkeeping->sens = ($mt < 0) ? 'C' : 'D';
-    				$bookkeeping->debit = ($mt > 0) ? $mt : 0;
-    				$bookkeeping->credit = ($mt <= 0) ? $mt : 0;
-    				$bookkeeping->code_journal = $conf->global->ACCOUNTING_EXPENSEREPORT_JOURNAL;
-    				$bookkeeping->fk_user_author = $user->id;
-    
-    				$result = $bookkeeping->create($user);
-    				if ($result < 0) {
-           			    if ($bookkeeping->error == 'BookkeepingRecordAlreadyExists')	// Already exists
-        			    {
-        			        $error++;
-        			        $errorforline++;
-        			        //setEventMessages('Transaction for ('.$bookkeeping->doc_type.', '.$bookkeeping->doc_ref.', '.$bookkeeping->fk_docdet.') were already recorded', null, 'warnings');
-        			    }
-        			    else
-        			    {
-        			        $error++;
-        			        $errorforline++;
-        			        setEventMessages($bookkeeping->error, $bookkeeping->errors, 'errors');
-        			    }
-    				}
-    			}
-    		}
-        }
-        
+		$db->begin();
+
+		if (! $errorforline)
+		{
+			foreach ( $tabttc[$key] as $k => $mt ) {
+				if ($mt) {
+					// get compte id and label
+					$bookkeeping = new BookKeeping($db);
+					$bookkeeping->doc_date = $val["date"];
+					$bookkeeping->doc_ref = $val["ref"];
+					$bookkeeping->date_create = $now;
+					$bookkeeping->doc_type = 'expense_report';
+					$bookkeeping->fk_doc = $key;
+					$bookkeeping->fk_docdet = $val["fk_expensereportdet"];
+					$bookkeeping->code_tiers = $tabuser[$key]['user_accountancy_code'];
+					$bookkeeping->label_compte = $tabuser[$key]['name'];
+					$bookkeeping->numero_compte = $conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT;
+					$bookkeeping->montant = $mt;
+					$bookkeeping->sens = ($mt >= 0) ? 'C' : 'D';
+					$bookkeeping->debit = ($mt <= 0) ? $mt : 0;
+					$bookkeeping->credit = ($mt > 0) ? $mt : 0;
+					$bookkeeping->code_journal = $journal;
+					$bookkeeping->fk_user_author = $user->id;
+
+					$result = $bookkeeping->create($user);
+					if ($result < 0) {
+						if ($bookkeeping->error == 'BookkeepingRecordAlreadyExists')	// Already exists
+						{
+							$error++;
+							$errorforline++;
+							//setEventMessages('Transaction for ('.$bookkeeping->doc_type.', '.$bookkeeping->doc_ref.', '.$bookkeeping->fk_docdet.') were already recorded', null, 'warnings');
+						}
+						else
+						{
+							$error++;
+							$errorforline++;
+							setEventMessages($bookkeeping->error, $bookkeeping->errors, 'errors');
+						}
+					}
+				}
+			}
+		}
+
+		if (! $errorforline)
+		{
+			// Fees
+			foreach ( $tabht[$key] as $k => $mt ) {
+				$accountingaccount = new AccountingAccount($db);
+				$accountingaccount->fetch(null, $k, true);
+				if ($mt) {
+					// get compte id and label
+					$accountingaccount = new AccountingAccount($db);
+					if ($accountingaccount->fetch(null, $k, true)) {
+						$bookkeeping = new BookKeeping($db);
+						$bookkeeping->doc_date = $val["date"];
+						$bookkeeping->doc_ref = $val["ref"];
+						$bookkeeping->date_create = $now;
+						$bookkeeping->doc_type = 'expense_report';
+						$bookkeeping->fk_doc = $key;
+						$bookkeeping->fk_docdet = $val["fk_expensereportdet"];
+						$bookkeeping->code_tiers = '';
+						$bookkeeping->label_compte = $accountingaccount->label;
+						$bookkeeping->numero_compte = $k;
+						$bookkeeping->montant = $mt;
+						$bookkeeping->sens = ($mt < 0) ? 'C' : 'D';
+						$bookkeeping->debit = ($mt > 0) ? $mt : 0;
+						$bookkeeping->credit = ($mt <= 0) ? $mt : 0;
+						$bookkeeping->code_journal = $journal;
+						$bookkeeping->fk_user_author = $user->id;
+
+						$result = $bookkeeping->create($user);
+						if ($result < 0) {
+							if ($bookkeeping->error == 'BookkeepingRecordAlreadyExists')	// Already exists
+							{
+								$error++;
+								$errorforline++;
+								//setEventMessages('Transaction for ('.$bookkeeping->doc_type.', '.$bookkeeping->doc_ref.', '.$bookkeeping->fk_docdet.') were already recorded', null, 'warnings');
+							}
+							else
+							{
+								$error++;
+								$errorforline++;
+								setEventMessages($bookkeeping->error, $bookkeeping->errors, 'errors');
+							}
+						}
+					}
+				}
+			}
+		}
+
 		if (! $errorforline)
 		{
-		    $db->commit();
+			// VAT
+			// var_dump($tabtva);
+			foreach ( $tabtva[$key] as $k => $mt ) {
+				if ($mt) {
+					// get compte id and label
+					$bookkeeping = new BookKeeping($db);
+					$bookkeeping->doc_date = $val["date"];
+					$bookkeeping->doc_ref = $val["ref"];
+					$bookkeeping->date_create = $now;
+					$bookkeeping->doc_type = 'expense_report';
+					$bookkeeping->fk_doc = $key;
+					$bookkeeping->fk_docdet = $val["fk_expensereportdet"];
+					$bookkeeping->code_tiers = '';
+					$bookkeeping->label_compte = $langs->trans("VAT"). ' '.$def_tva[$key];
+					$bookkeeping->numero_compte = $k;
+					$bookkeeping->montant = $mt;
+					$bookkeeping->sens = ($mt < 0) ? 'C' : 'D';
+					$bookkeeping->debit = ($mt > 0) ? $mt : 0;
+					$bookkeeping->credit = ($mt <= 0) ? $mt : 0;
+					$bookkeeping->code_journal = $journal;
+					$bookkeeping->fk_user_author = $user->id;
+
+					$result = $bookkeeping->create($user);
+					if ($result < 0) {
+						if ($bookkeeping->error == 'BookkeepingRecordAlreadyExists')	// Already exists
+						{
+							$error++;
+							$errorforline++;
+							//setEventMessages('Transaction for ('.$bookkeeping->doc_type.', '.$bookkeeping->doc_ref.', '.$bookkeeping->fk_docdet.') were already recorded', null, 'warnings');
+						}
+						else
+						{
+							$error++;
+							$errorforline++;
+							setEventMessages($bookkeeping->error, $bookkeeping->errors, 'errors');
+						}
+					}
+				}
+			}
+		}
+
+		if (! $errorforline)
+		{
+			$db->commit();
 		}
 		else
 		{
-		    $db->rollback();
+			$db->rollback();
 		}
-		
 	}
 
 	if (empty($error) && count($tabpay)) {
-	    setEventMessages($langs->trans("GeneralLedgerIsWritten"), null, 'mesgs');
+		setEventMessages($langs->trans("GeneralLedgerIsWritten"), null, 'mesgs');
 	}
 	elseif (count($tabpay) == $error)
 	{
-	    setEventMessages($langs->trans("NoNewRecordSaved"), null, 'warnings');
+		setEventMessages($langs->trans("NoNewRecordSaved"), null, 'warnings');
 	}
 	else
 	{
-	    setEventMessages($langs->trans("GeneralLedgerSomeRecordWasNotRecorded"), null, 'warnings');
+		setEventMessages($langs->trans("GeneralLedgerSomeRecordWasNotRecorded"), null, 'warnings');
 	}
 
 	$action='';
@@ -328,7 +334,6 @@ $userstatic = new User($db);
 // Export
 /*if ($action == 'export_csv') {
 	$sep = $conf->global->ACCOUNTING_EXPORT_SEPARATORCSV;
-	$journal = $conf->global->ACCOUNTING_EXPENSEREPORT_JOURNAL;
 
 	include DOL_DOCUMENT_ROOT . '/accountancy/tpl/export_journal.tpl.php';
 
@@ -448,7 +453,9 @@ if (empty($action) || $action == 'view') {
 
 	$period = $form->select_date($date_start, 'date_start', 0, 0, 0, '', 1, 0, 1) . ' - ' . $form->select_date($date_end, 'date_end', 0, 0, 0, '', 1, 0, 1);
 
-	journalHead($nom, $nomlink, $period, $periodlink, $description, $builddate, $exportlink, array('action' => ''));
+	$varlink = 'id_journal=' . $id_journal;
+
+	journalHead($nom, $nomlink, $period, $periodlink, $description, $builddate, $exportlink, array('action' => ''), '', $varlink);
 
 	/*if ($conf->global->ACCOUNTING_EXPORT_MODELCSV != 1 && $conf->global->ACCOUNTING_EXPORT_MODELCSV != 2) {
 		print '<input type="button" class="butActionRefused" style="float: right;" value="' . $langs->trans("Export") . '" disabled="disabled" title="' . $langs->trans('ExportNotSupported') . '"/>';
@@ -456,10 +463,10 @@ if (empty($action) || $action == 'view') {
 		print '<input type="button" class="butAction" style="float: right;" value="' . $langs->trans("Export") . '" onclick="launch_export();" />';
 	}*/
 
-    print '<div class="tabsAction">';
+	print '<div class="tabsAction">';
 	print '<input type="button" class="butAction" value="' . $langs->trans("WriteBookKeeping") . '" onclick="writebookkeeping();" />';
-    print '</div>';
-    
+	print '</div>';
+
 	print '
 	<script type="text/javascript">
 		function launch_export() {
@@ -556,9 +563,9 @@ if (empty($action) || $action == 'view') {
 
 		// Third party
 		foreach ( $tabttc[$key] as $k => $mt ) {
-		    print '<tr class="oddeven">';
-		    print "<td><!-- Thirdparty --></td>";
-		    print "<td>" . $date . "</td>";
+			print '<tr class="oddeven">';
+			print "<td><!-- Thirdparty --></td>";
+			print "<td>" . $date . "</td>";
 			print "<td>" . $expensereportstatic->getNomUrl(1) . "</td>";
 			$userstatic->id = $tabuser[$key]['id'];
 			$userstatic->name = $tabuser[$key]['name'];
@@ -566,14 +573,14 @@ if (empty($action) || $action == 'view') {
 			$accountoshow = length_accounta($k);
 			if (empty($accountoshow) || $accountoshow == 'NotDefined')
 			{
-			    print '<span class="error">'.$langs->trans("ThirdpartyAccountNotDefined").'</span>';
+				print '<span class="error">'.$langs->trans("ThirdpartyAccountNotDefined").'</span>';
 			}
 			else print $accountoshow;
 			print "</td>";
 			print "<td>" . $userstatic->getNomUrl(0, 'user', 16) . ' - ' . $langs->trans("Code_tiers") . "</td>";
 			print '<td align="right">' . ($mt < 0 ? - price(- $mt) : '') . "</td>";
 			print '<td align="right">' . ($mt >= 0 ? price($mt) : '') . "</td>";
-		    print "</tr>";
+			print "</tr>";
 		}
 	}
 

+ 1 - 1
htdocs/adherents/list.php

@@ -66,7 +66,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page ;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/adherents/type.php

@@ -48,7 +48,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page ;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/admin/defaultvalues.php

@@ -43,7 +43,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/admin/translation.php

@@ -49,7 +49,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/bookmarks/list.php

@@ -43,7 +43,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/comm/action/document.php

@@ -67,7 +67,7 @@ if ($id > 0)
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/comm/action/index.php

@@ -58,7 +58,7 @@ if (empty($filtert) && empty($conf->global->AGENDA_ALL_CALENDARS))
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page","int");
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
 $offset = $limit * $page;
 if (! $sortorder) $sortorder="ASC";

+ 1 - 1
htdocs/comm/action/pertype.php

@@ -54,7 +54,7 @@ if (empty($filtert) && empty($conf->global->AGENDA_ALL_CALENDARS))
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page","int");
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
 $offset = $limit * $page;
 if (! $sortorder) $sortorder="ASC";

+ 1 - 1
htdocs/comm/action/peruser.php

@@ -54,7 +54,7 @@ if (empty($filtert) && empty($conf->global->AGENDA_ALL_CALENDARS))
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page","int");
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
 $offset = $limit * $page;
 if (! $sortorder) $sortorder="ASC";

+ 1 - 1
htdocs/comm/card.php

@@ -66,7 +66,7 @@ $mode		= GETPOST("mode");
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/comm/mailing/cibles.php

@@ -43,7 +43,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST('sortfield','alpha');
 $sortorder = GETPOST('sortorder','alpha');
 $page = GETPOST('page','int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/comm/mailing/list.php

@@ -34,7 +34,7 @@ $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/comm/propal/document.php

@@ -54,7 +54,7 @@ $result = restrictedArea($user, 'propal', $id);
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/comm/propal/list.php

@@ -88,7 +88,7 @@ $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/commande/customer.php

@@ -49,7 +49,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/commande/document.php

@@ -53,7 +53,7 @@ $result=restrictedArea($user,'commande',$id,'');
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/commande/list.php

@@ -86,7 +86,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/bank/bankentries.php

@@ -103,7 +103,7 @@ $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
 $pageplusone = GETPOST("pageplusone",'int');
 if ($pageplusone) $page = $pageplusone - 1;
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/bank/index.php

@@ -59,7 +59,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/bank/releve.php

@@ -77,7 +77,7 @@ $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
 $pageplusone = GETPOST("pageplusone",'int');
 if ($pageplusone) $page = $pageplusone - 1;
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/bank/various_payment/document.php

@@ -46,7 +46,7 @@ $result = restrictedArea($user, 'salaries', $id, '');
 $sortfield = GETPOST('sortfield','alpha');
 $sortorder = GETPOST('sortorder','alpha');
 $page = GETPOST('page','int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/bank/various_payment/index.php

@@ -44,7 +44,7 @@ $search_account = GETPOST('search_account','int');
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/charges/index.php

@@ -52,7 +52,7 @@ $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/clients.php

@@ -47,7 +47,7 @@ $mode=GETPOST("mode");
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/deplacement/document.php

@@ -53,7 +53,7 @@ $result = restrictedArea($user, 'deplacement', $id, '');
 $sortfield = GETPOST('sortfield','alpha');
 $sortorder = GETPOST('sortorder','alpha');
 $page = GETPOST('page','int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/deplacement/index.php

@@ -39,7 +39,7 @@ $result = restrictedArea($user, 'deplacement','','');
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/deplacement/list.php

@@ -47,7 +47,7 @@ $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
 $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/facture/document.php

@@ -58,7 +58,7 @@ $result=restrictedArea($user,'facture',$id,'');
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/facture/fiche-rec.php

@@ -76,7 +76,7 @@ $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 if (! $sortorder) $sortorder='DESC';
 if (! $sortfield) $sortfield='f.titre';

+ 1 - 1
htdocs/compta/facture/list.php

@@ -102,7 +102,7 @@ $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 if (! $sortorder && ! empty($conf->global->INVOICE_DEFAULT_UNPAYED_SORT_ORDER) && $search_status == 1) $sortorder=$conf->global->INVOICE_DEFAULT_UNPAYED_SORT_ORDER;
 if (! $sortorder) $sortorder='DESC';

+ 1 - 1
htdocs/compta/paiement/avalider.php

@@ -42,7 +42,7 @@ $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
 $sortfield = GETPOST('sortfield','alpha');
 $sortorder = GETPOST('sortorder','alpha');
 $page = GETPOST('page','int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/paiement/cheque/list.php

@@ -47,7 +47,7 @@ $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/paiement/list.php

@@ -61,7 +61,7 @@ $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/prelevement/bons.php

@@ -41,7 +41,7 @@ $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
 $sortfield = GETPOST('sortfield','alpha');
 $sortorder = GETPOST('sortorder','alpha');
 $page = GETPOST('page','int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/prelevement/card.php

@@ -52,7 +52,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/prelevement/demandes.php

@@ -49,7 +49,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/prelevement/factures.php

@@ -48,7 +48,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/prelevement/list.php

@@ -44,7 +44,7 @@ $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
 $sortfield = GETPOST('sortfield','alpha');
 $sortorder = GETPOST('sortorder','alpha');
 $page = GETPOST('page','int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/recap-compta.php

@@ -44,7 +44,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST('sortfield','alpha');
 $sortorder = GETPOST('sortorder','alpha');
 $page = GETPOST('page','int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/resultat/clientfourn.php

@@ -56,7 +56,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/salaries/document.php

@@ -55,7 +55,7 @@ $result = restrictedArea($user, 'salaries', $id, '');
 $sortfield = GETPOST('sortfield','alpha');
 $sortorder = GETPOST('sortorder','alpha');
 $page = GETPOST('page','int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/salaries/index.php

@@ -48,7 +48,7 @@ $search_account = GETPOST('search_account','int');
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/sociales/index.php

@@ -46,7 +46,7 @@ $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/compta/sociales/payments.php

@@ -49,7 +49,7 @@ $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 18 - 15
htdocs/compta/tva/card.php

@@ -2,7 +2,7 @@
 /* Copyright (C) 2003      Rodolphe Quiedeville <rodolphe@quiedeville.org>
  * Copyright (C) 2004-2016 Laurent Destailleur  <eldy@users.sourceforge.net>
  * Copyright (C) 2005-2013 Regis Houssin        <regis.houssin@capnetworks.com>
- * Copyright (C) 2015	   Alexandre Spangaro   <aspangaro.dolibarr@gmail.com>
+ * Copyright (C) 2015-2017 Alexandre Spangaro   <aspangaro@zendsi.com>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -305,16 +305,17 @@ if ($id)
 
 	dol_fiche_head($head, 'card', $langs->trans("VATPayment"), 0, 'payment');
 
+	$linkback = '<a href="'.DOL_URL_ROOT.'/compta/tva/reglement.php">'.$langs->trans("BackToList").'</a>';
 
-	print '<table class="border" width="100%">';
+	dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', '');
 
-	print "<tr>";
-	print '<td class="titlefield">'.$langs->trans("Ref").'</td><td colspan="3">';
-	print $object->ref;
-	print '</td></tr>';
+	print '<div class="fichecenter">';
+	print '<div class="underbanner clearboth"></div>';
+
+	print '<table class="border" width="100%">';
 
 	// Label
-	print '<tr><td>'.$langs->trans("Label").'</td><td>'.$object->label.'</td></tr>';
+	print '<tr><td class="titlefield">'.$langs->trans("Label").'</td><td>'.$object->label.'</td></tr>';
 
 	print "<tr>";
 	print '<td>'.$langs->trans("DatePayment").'</td><td>';
@@ -335,23 +336,25 @@ if ($id)
 	{
 		if ($object->fk_account > 0)
 		{
- 		   	$bankline=new AccountLine($db);
-    		$bankline->fetch($object->fk_bank);
+			$bankline=new AccountLine($db);
+			$bankline->fetch($object->fk_bank);
 
-	    	print '<tr>';
-	    	print '<td>'.$langs->trans('BankTransactionLine').'</td>';
+			print '<tr>';
+			print '<td>'.$langs->trans('BankTransactionLine').'</td>';
 			print '<td>';
 			print $bankline->getNomUrl(1,0,'showall');
-	    	print '</td>';
-	    	print '</tr>';
+			print '</td>';
+			print '</tr>';
 		}
 	}
 
-        // Other attributes
-        $reshook=$hookmanager->executeHooks('formObjectOptions','',$object,$action);    // Note that $action and $object may have been modified by hook
+	// Other attributes
+	$reshook=$hookmanager->executeHooks('formObjectOptions','',$object,$action);    // Note that $action and $object may have been modified by hook
 
 	print '</table>';
 
+	print '</div>';
+
 	dol_fiche_end();
 
 	/*

+ 63 - 37
htdocs/compta/tva/class/tva.class.php

@@ -1,7 +1,7 @@
 <?php
 /* Copyright (C) 2002-2003 Rodolphe Quiedeville <rodolphe@quiedeville.org>
  * Copyright (C) 2004-2008 Laurent Destailleur  <eldy@users.sourceforge.net>
- * Copyright (C) 2011-2015 Alexandre Spangaro   <aspangaro.dolibarr@gmail.com>
+ * Copyright (C) 2011-2017 Alexandre Spangaro   <aspangaro@zendsi.com>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -34,6 +34,7 @@ class Tva extends CommonObject
 {
 	//public $element='tva';			//!< Id that identify managed objects
 	//public $table_element='tva';	//!< Name of table without prefix where object is stored
+	public $picto='payment';
 
 	var $tms;
 	var $datep;
@@ -73,6 +74,7 @@ class Tva extends CommonObject
     	global $conf, $langs;
 
 		$error=0;
+		$now=dol_now();
 
 		// Clean parameters
 		$this->amount=trim($this->amount);
@@ -89,7 +91,7 @@ class Tva extends CommonObject
 
 		// Insert request
 		$sql = "INSERT INTO ".MAIN_DB_PREFIX."tva(";
-		$sql.= "tms,";
+		$sql.= "datec,";
 		$sql.= "datep,";
 		$sql.= "datev,";
 		$sql.= "amount,";
@@ -101,7 +103,7 @@ class Tva extends CommonObject
 
         $sql.= ") VALUES (";
 
-		$sql.= " '".$this->db->idate($this->tms)."',";
+		$sql.= " '".$this->db->idate($now)."',";
 		$sql.= " '".$this->db->idate($this->datep)."',";
 		$sql.= " '".$this->db->idate($this->datev)."',";
 		$sql.= " '".$this->amount."',";
@@ -677,46 +679,70 @@ class Tva extends CommonObject
 	 *	@param	int		$id     Id of vat payment
 	 *	@return	int				<0 if KO, >0 if OK
 	 */
-    function info($id)
-    {
-        $sql = "SELECT t.rowid, t.tms as datec, t.fk_user_creat";
-        $sql.= " FROM ".MAIN_DB_PREFIX."tva as t";
-        $sql.= " WHERE t.rowid = ".$id;
+	function info($id)
+	{
+		$sql = "SELECT t.rowid, t.tms, t.datec, t.fk_user_creat";
+		$sql.= " FROM ".MAIN_DB_PREFIX."tva as t";
+		$sql.= " WHERE t.rowid = ".$id;
 
-        dol_syslog(get_class($this)."::info", LOG_DEBUG);
-        $result=$this->db->query($sql);
-        if ($result)
-        {
-            if ($this->db->num_rows($result))
-            {
-                $obj = $this->db->fetch_object($result);
+		dol_syslog(get_class($this)."::info", LOG_DEBUG);
+		$result=$this->db->query($sql);
+		if ($result)
+		{
+			if ($this->db->num_rows($result))
+			{
+				$obj = $this->db->fetch_object($result);
 
-                $this->id = $obj->rowid;
+				$this->id = $obj->rowid;
 
-                if ($obj->fk_user_creat) {
-                    $cuser = new User($this->db);
-                    $cuser->fetch($obj->fk_user_creat);
-                    $this->user_creation = $cuser;
-                }
+				if ($obj->fk_user_creat) {
+					$cuser = new User($this->db);
+					$cuser->fetch($obj->fk_user_creat);
+					$this->user_creation = $cuser;
+				}
 
-                if ($obj->fk_user_modif) {
-                    $muser = new User($this->db);
-                    $muser->fetch($obj->fk_user_modif);
-                    $this->user_modification = $muser;
-                }
+				if ($obj->fk_user_modif) {
+					$muser = new User($this->db);
+					$muser->fetch($obj->fk_user_modif);
+					$this->user_modification = $muser;
+				}
 
-                $this->date_creation     = $this->db->jdate($obj->datec);
-                $this->date_modification = $this->db->jdate($obj->datec);
-                $this->import_key        = $obj->import_key;
-            }
+				$this->date_creation     = $this->db->jdate($obj->datec);
+				$this->date_modification = $this->db->jdate($obj->tms);
+				$this->import_key        = $obj->import_key;
+			}
 
-            $this->db->free($result);
+			$this->db->free($result);
 
-        }
-        else
-        {
-            dol_print_error($this->db);
-        }
-    }
+		}
+		else
+		{
+			dol_print_error($this->db);
+		}
+	}
+
+	/**
+	 * Retourne le libelle du statut d'une facture (brouillon, validee, abandonnee, payee)
+	 *
+	 * @param	int		$mode       0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto
+	 * @return  string				Libelle
+	 */
+	function getLibStatut($mode=0)
+	{
+	    return $this->LibStatut($this->statut,$mode);
+	}
+	
+	/**
+	 * Renvoi le libelle d'un statut donne
+	 *
+	 * @param   int		$status     Statut
+	 * @param   int		$mode       0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto
+	 * @return	string  		    Libelle du statut
+	 */
+	function LibStatut($status,$mode=0)
+	{
+	    global $langs;	// TODO Renvoyer le libelle anglais et faire traduction a affichage
 
+	    return '';
+	}
 }

+ 10 - 1
htdocs/compta/tva/info.php

@@ -1,5 +1,5 @@
 <?php
-/* Copyright (C) 2016	Alexandre Spangaro	<aspangaro@zendsi.com>
+/* Copyright (C) 2016-2017  Alexandre Spangaro	<aspangaro@zendsi.com>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -53,12 +53,21 @@ $head = vat_prepare_head($object);
 
 dol_fiche_head($head, 'info', $langs->trans("VATPayment"), 0, 'payment');
 
+$linkback = '<a href="'.DOL_URL_ROOT.'/compta/tva/reglement.php">'.$langs->trans("BackToList").'</a>';
+
+dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', '');
+
+print '<div class="fichecenter">';
+print '<div class="underbanner clearboth"></div>';
+
 print '<table width="100%"><tr><td>';
 dol_print_object_info($object);
 print '</td></tr></table>';
 
 print '</div>';
 
+dol_fiche_end();
+
 llxFooter();
 
 $db->close();

+ 1 - 1
htdocs/compta/tva/reglement.php

@@ -50,7 +50,7 @@ $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/contact/agenda.php

@@ -93,7 +93,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/contrat/document.php

@@ -55,7 +55,7 @@ $result = restrictedArea($user, 'contrat', $id);
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/contrat/list.php

@@ -69,7 +69,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/contrat/services.php

@@ -37,7 +37,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/core/ajax/ajaxdirpreview.php

@@ -49,7 +49,7 @@ if (! isset($mode) || $mode != 'noajax')    // For ajax call
     $sortfield = GETPOST("sortfield",'alpha');
     $sortorder = GETPOST("sortorder",'alpha');
     $page = GETPOST("page",'int');
-    if ($page == -1) { $page = 0; }
+    if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
     $offset = $conf->liste_limit * $page;
     $pageprev = $page - 1;
     $pagenext = $page + 1;

+ 14 - 14
htdocs/core/class/conf.class.php

@@ -2,7 +2,7 @@
 /* Copyright (C) 2003-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
  * Copyright (C) 2003      Xavier Dutoit        <doli@sydesy.com>
  * Copyright (C) 2004-2016 Laurent Destailleur  <eldy@users.sourceforge.net>
- * Copyright (C) 2005-2012 Regis Houssin      	<regis.houssin@capnetworks.com>
+ * Copyright (C) 2005-2017 Regis Houssin      	<regis.houssin@capnetworks.com>
  * Copyright (C) 2006 	   Jean Heimburger    	<jean@tiaris.info>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -320,7 +320,7 @@ class Conf
 		// For backward compatibility
 		$this->user->dir_output=$rootforuser."/users";
 		$this->user->dir_temp=$rootforuser."/users/temp";
-		
+
 		// UserGroup
 		$this->usergroup->dir_output=$rootforuser."/usergroups";
 		$this->usergroup->dir_temp=$rootforuser."/usergroups/temp";
@@ -386,13 +386,13 @@ class Conf
 
 		$this->global->MAIN_ACTIVATE_HTML5=1;
         $this->global->MAIN_MAIL_USE_MULTI_PART=1;
-        
+
 		// societe
 		if (empty($this->global->SOCIETE_CODECLIENT_ADDON))       $this->global->SOCIETE_CODECLIENT_ADDON="mod_codeclient_leopard";
 		if (empty($this->global->SOCIETE_CODECOMPTA_ADDON))       $this->global->SOCIETE_CODECOMPTA_ADDON="mod_codecompta_panicum";
 
 		if (empty($this->global->CHEQUERECEIPTS_ADDON))           $this->global->CHEQUERECEIPTS_ADDON='mod_chequereceipt_mint';
-		
+
         // Security
 		if (empty($this->global->USER_PASSWORD_GENERATED)) $this->global->USER_PASSWORD_GENERATED='standard'; // Default password generator
         if (empty($this->global->MAIN_UMASK)) $this->global->MAIN_UMASK='0664';         // Default mask
@@ -425,7 +425,7 @@ class Conf
 		$this->currency=$this->global->MAIN_MONNAIE;
 
 		if (empty($conf->global->MAIN_BROWSER_NOTIFICATION_FREQUENCY)) $conf->global->MAIN_BROWSER_NOTIFICATION_FREQUENCY = 30;   // Less than 1 minutes to be sure
-		
+
 		// conf->global->ACCOUNTING_MODE = Option des modules Comptabilites (simple ou expert). Defini le mode de calcul des etats comptables (CA,...)
         if (empty($this->global->ACCOUNTING_MODE)) $this->global->ACCOUNTING_MODE='RECETTES-DEPENSES';  // By default. Can be 'RECETTES-DEPENSES' ou 'CREANCES-DETTES'
 
@@ -434,7 +434,7 @@ class Conf
 
         // MAIN_HTML_TITLE
         if (! isset($this->global->MAIN_HTML_TITLE)) $this->global->MAIN_HTML_TITLE='noapp,thirdpartynameonly,contactnameonly,projectnameonly';
-        
+
 		// conf->liste_limit = constante de taille maximale des listes
 		if (empty($this->global->MAIN_SIZE_LISTE_LIMIT)) $this->global->MAIN_SIZE_LISTE_LIMIT=25;
 		$this->liste_limit=$this->global->MAIN_SIZE_LISTE_LIMIT;
@@ -461,7 +461,7 @@ class Conf
 		$this->mailing->email_from=$this->email_from;
 		if (! empty($this->global->MAILING_EMAIL_FROM))	$this->mailing->email_from=$this->global->MAILING_EMAIL_FROM;
 		if (! isset($this->global->MAIN_EMAIL_ADD_TRACK_ID)) $this->global->MAIN_EMAIL_ADD_TRACK_ID=1;
-		
+
         // Format for date (used by default when not found or not searched in lang)
         $this->format_date_short="%d/%m/%Y";            // Format of day with PHP/C tags (strftime functions)
         $this->format_date_short_java="dd/MM/yyyy";     // Format of day with Java tags
@@ -485,7 +485,7 @@ class Conf
 		// Default pdf option
 		if (! isset($this->global->MAIN_PDF_DASH_BETWEEN_LINES)) $this->global->MAIN_PDF_DASH_BETWEEN_LINES=1;    // use dash between lines
         if (! isset($this->global->PDF_ALLOW_HTML_FOR_FREE_TEXT)) $this->global->PDF_ALLOW_HTML_FOR_FREE_TEXT=1;  // allow html content into free footer text
-		
+
 		// Set default value to MAIN_SHOW_LOGO
 		if (! isset($this->global->MAIN_SHOW_LOGO)) $this->global->MAIN_SHOW_LOGO=1;
 
@@ -500,7 +500,7 @@ class Conf
 
 		// By default, we open card if one found
 		if (! isset($this->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE)) $this->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE=1;
-		
+
 		// Define list of limited modules (value must be key found for "name" property of module, so for example 'supplierproposal' for Module "Supplier Proposal"
 		if (! isset($this->global->MAIN_MODULES_FOR_EXTERNAL)) $this->global->MAIN_MODULES_FOR_EXTERNAL='user,societe,propal,commande,facture,categorie,supplierproposal,fournisseur,contact,projet,contrat,ficheinter,expedition,agenda,resource,adherent';	// '' means 'all'. Note that contact is added here as it should be a module later.
 
@@ -568,12 +568,12 @@ class Conf
 		    $this->expensereport->payment		= new stdClass();
 		    $this->expensereport->payment->warning_delay=(isset($this->global->MAIN_DELAY_EXPENSEREPORTS_TO_PAY)?$this->global->MAIN_DELAY_EXPENSEREPORTS_TO_PAY:0)*24*60*60;
 		}
-		
+
 		if (! empty($this->global->PRODUIT_MULTIPRICES) && empty($this->global->PRODUIT_MULTIPRICES_LIMIT))
 		{
 		    $this->global->PRODUIT_MULTIPRICES_LIMIT = 5;
 		}
-		
+
 		// For modules that want to disable top or left menu
 		if (! empty($this->global->MAIN_HIDE_TOP_MENU)) $this->dol_hide_topmenu=$this->global->MAIN_HIDE_TOP_MENU;
 		if (! empty($this->global->MAIN_HIDE_LEFT_MENU)) $this->dol_hide_leftmenu=$this->global->MAIN_HIDE_LEFT_MENU;
@@ -581,11 +581,11 @@ class Conf
 		if (empty($this->global->MAIN_SIZE_SHORTLIST_LIMIT)) $this->global->MAIN_SIZE_SHORTLIST_LIMIT=3;
 
 		// Save inconsistent option
-		if (empty($conf->global->AGENDA_USE_EVENT_TYPE) && $conf->global->AGENDA_DEFAULT_FILTER_TYPE == 'AC_NON_AUTO')
+		if (empty($conf->global->AGENDA_USE_EVENT_TYPE) && (! isset($conf->global->AGENDA_DEFAULT_FILTER_TYPE) || $conf->global->AGENDA_DEFAULT_FILTER_TYPE == 'AC_NON_AUTO'))
 		{
 		    $conf->global->AGENDA_DEFAULT_FILTER_TYPE='0';    // 'AC_NON_AUTO' does not exists when AGENDA_DEFAULT_FILTER_TYPE is not on.
 		}
-		    
+
 		// For backward compatibility
 		if (isset($this->product))   $this->produit=$this->product;
 		if (isset($this->facture))   $this->invoice=$this->facture;
@@ -633,7 +633,7 @@ class Conf
 				$this->loghandlers[$handler] = $loghandlerinstance;
 			}
 		}
-		
+
 	}
 }
 

+ 7 - 3
htdocs/core/class/hookmanager.class.php

@@ -43,6 +43,8 @@ class HookManager
 	var $resArray=array();
 	// Printable result
 	var $resPrint='';
+	// Nb of qualified hook ran
+	var $resNbOfHooks=0;
 
 	/**
 	 * Constructor
@@ -188,7 +190,7 @@ class HookManager
         }
 
         // Init return properties
-        $this->resPrint=''; $this->resArray=array();
+        $this->resPrint=''; $this->resArray=array(); $this->resNbOfHooks=0;
 
         // Loop on each hook to qualify modules that have declared context
         $modulealreadyexecuted=array();
@@ -201,11 +203,13 @@ class HookManager
                 {
                 	//print "Before hook ".get_class($actionclassinstance)." method=".$method." hooktype=".$hooktype." results=".count($actionclassinstance->results)." resprints=".count($actionclassinstance->resprints)." resaction=".$resaction." result=".$result."<br>\n";
 
+                    // test to avoid running twice a hook, when a module implements several active contexts
+                    if (in_array($module,$modulealreadyexecuted)) continue;
+
                 	// jump to next module/class if method does not exist
                     if (! method_exists($actionclassinstance,$method)) continue;
 
-                    // test to avoid running twice a hook, when a module implements several active contexts
-                    if (in_array($module,$modulealreadyexecuted)) continue;
+                    $this->resNbOfHooks++;
 
                     dol_syslog(get_class($this).'::executeHooks a qualified hook was found for method='.$method.' module='.$module." action=".$action." context=".$context);
 

+ 26 - 25
htdocs/core/menus/standard/eldy.lib.php

@@ -1008,7 +1008,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
 					$sql = "SELECT rowid, code, label, nature";
 					$sql.= " FROM ".MAIN_DB_PREFIX."accounting_journal";
 					$sql.= " WHERE entity = ".$conf->entity;
-					$sql.= " ORDER BY nature";
+					$sql.= " ORDER BY label";
 
 					$resql = $db->query($sql);
 					if ($resql)
@@ -1018,30 +1018,31 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
 
 						if ($numr > 0)
 						{
-    						while ($i < $numr)
-    						{
-    							$objp = $db->fetch_object($resql);
-
-    							$nature='';
-    							// Must match array $sourceList defined into journals_list.php
-    							if ($objp->nature == 2) $nature="sells";
-    							if ($objp->nature == 3) $nature="purchases";
-    							if ($objp->nature == 4) $nature="bank";
-    							if ($objp->nature == 1) $nature="various";
-    							if ($objp->nature == 9) $nature="hasnew";
-
-    							// To enable when page exists
-    							if (empty($conf->global->MAIN_FEATURES_LEVEL))
-    							{
-    							    if ($nature == 'various' || $nature == 'hasnew') $nature='';
-    							}
-
-    							if ($nature)
-    							{
-                                    if ($usemenuhider || empty($leftmenu) || preg_match('/accountancy/',$leftmenu)) $newmenu->add('/accountancy/journal/'.$nature.'journal.php?mainmenu=accountancy&leftmenu=accountancy_journal&code_journal='.$objp->code,dol_trunc($objp->label,25),2,$user->rights->accounting->comptarapport->lire);
-    							}
-    							$i++;
-    						}
+							while ($i < $numr)
+							{
+								$objp = $db->fetch_object($resql);
+
+								$nature='';
+								// Must match array $sourceList defined into journals_list.php 
+								if ($objp->nature == 2) $nature="sells";
+								if ($objp->nature == 3) $nature="purchases";
+								if ($objp->nature == 4) $nature="bank";
+								if ($objp->nature == 5) $nature="expensereports";
+								if ($objp->nature == 1) $nature="various";
+								if ($objp->nature == 9) $nature="hasnew";
+
+								// To enable when page exists
+								if (empty($conf->global->MAIN_FEATURES_LEVEL))
+								{
+									if ($nature == 'various' || $nature == 'hasnew') $nature='';
+								}
+
+								if ($nature)
+								{
+									if ($usemenuhider || empty($leftmenu) || preg_match('/accountancy/',$leftmenu)) $newmenu->add('/accountancy/journal/'.$nature.'journal.php?mainmenu=accountancy&leftmenu=accountancy_journal&id_journal='.$objp->rowid,dol_trunc($objp->label,25),2,$user->rights->accounting->comptarapport->lire);
+								}
+								$i++;
+							}
 						}
 						else
 						{

+ 1 - 1
htdocs/cron/list.php

@@ -43,7 +43,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/don/document.php

@@ -59,7 +59,7 @@ $result = restrictedArea($user, 'don', $id, '');
 $sortfield = GETPOST('sortfield','alpha');
 $sortorder = GETPOST('sortorder','alpha');
 $page = GETPOST('page','int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/don/list.php

@@ -35,7 +35,7 @@ $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
 $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/ecm/docdir.php

@@ -60,7 +60,7 @@ $upload_dir = $conf->ecm->dir_output.'/'.$urlsection;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/ecm/docfile.php

@@ -54,7 +54,7 @@ if ($user->societe_id > 0)
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/ecm/docmine.php

@@ -41,7 +41,7 @@ $confirm=GETPOST('confirm','alpha');
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/ecm/index.php

@@ -58,7 +58,7 @@ $section_dir=GETPOST('section_dir');
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/ecm/index_auto.php

@@ -58,7 +58,7 @@ $section_dir=GETPOST('section_dir');
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/ecm/search.php

@@ -58,7 +58,7 @@ $upload_dir = $conf->ecm->dir_output.'/'.$section;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/expedition/list.php

@@ -59,7 +59,7 @@ $sortorder = GETPOST('sortorder','alpha');
 $page = GETPOST('page','int');
 if (! $sortfield) $sortfield="e.ref";
 if (! $sortorder) $sortorder="DESC";
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/expensereport/document.php

@@ -53,7 +53,7 @@ $result = restrictedArea($user, 'expensereport', $id, 'expensereport');
 $sortfield = GETPOST('sortfield','alpha');
 $sortorder = GETPOST('sortorder','alpha');
 $page = GETPOST('page','int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/expensereport/index.php

@@ -42,7 +42,7 @@ $result = restrictedArea($user, 'expensereport','','');
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/expensereport/list.php

@@ -55,7 +55,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST('sortfield','alpha');
 $sortorder = GETPOST('sortorder','alpha');
 $page = GETPOST('page','int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/fichinter/document.php

@@ -53,7 +53,7 @@ $result = restrictedArea($user, 'ficheinter', $id, 'fichinter');
 $sortfield = GETPOST('sortfield','alpha');
 $sortorder = GETPOST('sortorder','alpha');
 $page = GETPOST('page','int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/fichinter/list.php

@@ -61,7 +61,7 @@ $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
 $sortfield = GETPOST('sortfield','alpha');
 $sortorder = GETPOST('sortorder','alpha');
 $page = GETPOST('page','int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/fourn/commande/document.php

@@ -56,7 +56,7 @@ $result = restrictedArea($user, 'fournisseur', $id, '', 'commande');
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/fourn/commande/list.php

@@ -105,7 +105,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/fourn/contact.php

@@ -44,7 +44,7 @@ if ($user->societe_id > 0)
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/fourn/facture/impayees.php

@@ -57,7 +57,7 @@ $search_amount_no_tax = GETPOST('search_amount_no_tax','alpha');
 $search_amount_all_tax = GETPOST('search_amount_all_tax','alpha');
 
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/fourn/facture/paiement.php

@@ -56,7 +56,7 @@ $search_payment_num=GETPOST('search_payment_num','alpha');
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/ftp/index.php

@@ -51,7 +51,7 @@ $download_dir = $conf->ftp->dir_temp;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/holiday/document.php

@@ -54,7 +54,7 @@ $langs->load("holiday");
 $sortfield = GETPOST('sortfield','alpha');
 $sortorder = GETPOST('sortorder','alpha');
 $page = GETPOST('page','int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 0
htdocs/install/mysql/data/llx_accounting.sql

@@ -32,6 +32,7 @@ INSERT INTO llx_accounting_journal (code, label, nature, active) VALUES ('AC', '
 INSERT INTO llx_accounting_journal (code, label, nature, active) VALUES ('BQ', 'Journal de banque', 4, 1);
 INSERT INTO llx_accounting_journal (code, label, nature, active) VALUES ('OD', 'Journal des opérations diverses', 1, 1);
 INSERT INTO llx_accounting_journal (code, label, nature, active) VALUES ('AN', 'Journal des à-nouveaux', 9, 1);
+INSERT INTO llx_accounting_journal (code, label, nature, active) VALUES ('ER', 'Journal des notes de frais', 5, 1);
 --
 -- Descriptif des plans comptables FR PCG99-ABREGE
 --

+ 2 - 0
htdocs/install/mysql/migration/5.0.0-6.0.0.sql

@@ -168,6 +168,7 @@ INSERT INTO llx_accounting_journal (rowid, code, label, nature, active) VALUES (
 INSERT INTO llx_accounting_journal (rowid, code, label, nature, active) VALUES (3,'BQ', 'Bank journal', 4, 1);
 INSERT INTO llx_accounting_journal (rowid, code, label, nature, active) VALUES (4,'OD', 'Other journal', 1, 1);
 INSERT INTO llx_accounting_journal (rowid, code, label, nature, active) VALUES (5,'AN', 'Has new journal', 9, 1);
+INSERT INTO llx_accounting_journal (rowid, code, label, nature, active) VALUES (6,'ER', 'Expense report journal', 5, 1);
 -- Fix old entries
 UPDATE llx_accounting_journal SET nature = 1 where code = 'OD' and nature = 0;
 UPDATE llx_accounting_journal SET nature = 2 where code = 'VT' and nature = 1;
@@ -379,3 +380,4 @@ create table llx_loan_schedule
   fk_user_modif		integer           
 )ENGINE=innodb;
 
+ALTER TABLE llx_tva ADD COLUMN datec date AFTER tms;

+ 3 - 3
htdocs/install/mysql/tables/llx_accounting_journal.sql

@@ -20,9 +20,9 @@
 create table llx_accounting_journal
 (
   rowid             integer AUTO_INCREMENT PRIMARY KEY,
-  entity            integer DEFAULT 1,
-  code       		varchar(32) NOT NULL,
+  entity            integer DEFAULT 1 NOT NULL,
+  code              varchar(32) NOT NULL,
   label             varchar(128) NOT NULL,
-  nature			smallint DEFAULT 1 NOT NULL,			-- type of journals (1:various operations / 2:sale / 3:purchase / 4:bank / 9: has-new)
+  nature            smallint DEFAULT 1 NOT NULL,        -- type of journals (1:various operations / 2:sale / 3:purchase / 4:bank / 5:expense report / 9:has-new)
   active            smallint DEFAULT 0
 )ENGINE=innodb;

+ 1 - 0
htdocs/install/mysql/tables/llx_tva.sql

@@ -21,6 +21,7 @@ create table llx_tva
 (
   rowid           integer AUTO_INCREMENT PRIMARY KEY,
   tms             timestamp,
+  datec           datetime,                   -- Create date
   datep           date,                       -- date de paiement
   datev           date,                       -- date de valeur
   amount          real NOT NULL DEFAULT 0,

+ 0 - 80
htdocs/install/upgrade.php

@@ -234,86 +234,6 @@ if (! GETPOST('action','aZ09') || preg_match('/upgrade/i',GETPOST('action','aZ09
 	    flush();
     }
 
-    /*
-     * Delete duplicates in table categorie_association
-     */
-    if ($ok)
-    {
-	    $result = $db->DDLDescTable(MAIN_DB_PREFIX."categorie_association");
-	    if ($result)	// result defined for version 3.2 or -
-	    {
-		    $obj = $db->fetch_object($result);
-		    if ($obj)	// It table categorie_association exists
-		    {
-		    	$couples=array();
-			    $filles=array();
-			    $sql = "SELECT fk_categorie_mere, fk_categorie_fille";
-			    $sql.= " FROM ".MAIN_DB_PREFIX."categorie_association";
-			    dolibarr_install_syslog("upgrade: search duplicate");
-			    $resql = $db->query($sql);
-			    if ($resql)
-			    {
-			        $num=$db->num_rows($resql);
-			        while ($obj=$db->fetch_object($resql))
-			        {
-			            if (! isset($filles[$obj->fk_categorie_fille]))	// Only one record as child (a child has only on parent).
-			            {
-			                if ($obj->fk_categorie_mere != $obj->fk_categorie_fille)
-			                {
-			                    $filles[$obj->fk_categorie_fille]=1;	// Set record for this child
-			                    $couples[$obj->fk_categorie_mere.'_'.$obj->fk_categorie_fille]=array('mere'=>$obj->fk_categorie_mere, 'fille'=>$obj->fk_categorie_fille);
-			                }
-			            }
-			        }
-
-			        dolibarr_install_syslog("upgrade: result is num=" . $num . " count(couples)=" . count($couples));
-
-			        // If there is duplicates couples or child with two parents
-			        if (count($couples) > 0 && $num > count($couples))
-			        {
-			            $error=0;
-
-			            $db->begin();
-
-			            // We delete all
-			            $sql="DELETE FROM ".MAIN_DB_PREFIX."categorie_association";
-			            dolibarr_install_syslog("upgrade: delete association");
-			            $resqld=$db->query($sql);
-			            if ($resqld)
-			            {
-			            	// And we insert only each record once
-			                foreach($couples as $key => $val)
-			                {
-			                    $sql ="INSERT INTO ".MAIN_DB_PREFIX."categorie_association(fk_categorie_mere,fk_categorie_fille)";
-			                    $sql.=" VALUES(".$val['mere'].", ".$val['fille'].")";
-			                    dolibarr_install_syslog("upgrade: insert association");
-			                    $resqli=$db->query($sql);
-			                    if (! $resqli) $error++;
-			                }
-			            }
-
-			            if (! $error)
-			            {
-			                print '<tr><td>'.$langs->trans("RemoveDuplicates").'</td>';
-			                print '<td align="right">'.$langs->trans("Success").' ('.$num.'=>'.count($couples).')</td></tr>';
-			                $db->commit();
-			            }
-			            else
-			            {
-			                print '<tr><td>'.$langs->trans("RemoveDuplicates").'</td>';
-			                print '<td align="right">'.$langs->trans("Failed").'</td></tr>';
-			                $db->rollback();
-			            }
-			        }
-			    }
-			    else
-			    {
-			        print '<div class="error">'.$langs->trans("Error").' '.$db->lasterror().'</div>';
-			    }
-		    }
-	    }
-    }
-
 
 	/*
 	 * Remove deprecated indexes and constraints for Mysql

+ 153 - 28
htdocs/install/upgrade2.php

@@ -170,14 +170,14 @@ if (! GETPOST('action','aZ09') || preg_match('/upgrade/i',GETPOST('action','aZ09
      * Migration des donnees
      *
      ***************************************************************************************/
+    $db->begin();
+
     if (! $error)
     {
         // Current version is $conf->global->MAIN_VERSION_LAST_UPGRADE
         // Version to install is DOL_VERSION
         $dolibarrlastupgradeversionarray=preg_split('/[\.-]/',isset($conf->global->MAIN_VERSION_LAST_UPGRADE)?$conf->global->MAIN_VERSION_LAST_UPGRADE:$conf->global->MAIN_VERSION_LAST_INSTALL);
 
-        $db->begin();
-
         // Chaque action de migration doit renvoyer une ligne sur 4 colonnes avec
         // dans la 1ere colonne, la description de l'action a faire
         // dans la 4eme colonne, le texte 'OK' si fait ou 'AlreadyDone' si rien n'est fait ou 'Error'
@@ -342,6 +342,8 @@ if (! GETPOST('action','aZ09') || preg_match('/upgrade/i',GETPOST('action','aZ09
 
         	migrate_mode_reglement($db,$langs,$conf);
 
+        	migrate_clean_association($db,$langs,$conf);
+
             // Reload modules
             migrate_reload_modules($db,$langs,$conf);
 
@@ -426,11 +428,11 @@ if (! GETPOST('action','aZ09') || preg_match('/upgrade/i',GETPOST('action','aZ09
                 'MAIN_MODULE_PRINTING'=>'newboxdefonly',
             );
             migrate_reload_modules($db,$langs,$conf,$listofmodule);
-        
+
             // Reload menus (this must be always and only into last targeted version)
             migrate_reload_menu($db,$langs,$conf,$versionto);
         }
-        
+
         // Scripts for last version
         $afterversionarray=explode('.','5.0.9');
         $beforeversionarray=explode('.','6.0.9');
@@ -445,39 +447,72 @@ if (! GETPOST('action','aZ09') || preg_match('/upgrade/i',GETPOST('action','aZ09
             // Reload menus (this must be always and only into last targeted version)
             migrate_reload_menu($db,$langs,$conf,$versionto);
         }
+    }
+
 
-        // Can force activation of some module during migration with third paramater = MAIN_MODULE_XXX,MAIN_MODULE_YYY,...
-        if ($enablemodules)
+    // Can force activation of some module during migration with paramater 'enablemodules=MAIN_MODULE_XXX,MAIN_MODULE_YYY,...'
+    if (! $error && $enablemodules)
+    {
+        // Reload modules (this must be always and only into last targeted version)
+        $listofmodules=array();
+        $tmplistofmodules=explode(',', $enablemodules);
+        foreach($tmplistofmodules as $value)
         {
-            // Reload modules (this must be always and only into last targeted version)
-            $listofmodules=array();
-            $tmplistofmodules=explode(',', $enablemodules);
-            foreach($tmplistofmodules as $value)
-            {
-                $listofmodules[$value]='newboxdefonly';
-            }
-            migrate_reload_modules($db,$langs,$conf,$listofmodules,1);
+            $listofmodules[$value]='newboxdefonly';
         }
+        migrate_reload_modules($db,$langs,$conf,$listofmodules,1);
+    }
 
 
-        print '<tr><td colspan="4"><br>'.$langs->trans("MigrationFinished").'</td></tr>';
-
-        // On commit dans tous les cas.
-        // La procedure etant concue pour pouvoir passer plusieurs fois quelquesoit la situation.
-        $db->commit();
-        $db->close();
-
+    // Can call a dedicated external upgrade process
+    if (! $error)
+    {
+        $parameters=array('versionfrom'=>$versionfrom, 'versionto='.$versionto);
+        $object=new stdClass();
+        $action="upgrade";
+        $reshook=$hookmanager->executeHooks('doUpgrade2',$parameters, $object, $action);    // Note that $action and $object may have been modified by some hooks
+        if ($hookmanager->resNbOfHooks > 0)
+        {
+            if ($reshook < 0)
+            {
+                print '<tr><td colspan="4">';
+                print '<b>'.$langs->trans('UpgradeExternalModule').'</b>: ';
+                print $hookmanager->error;
+                print "<!-- (".$reshook.") -->";
+                print '</td></tr>';
+            }
+            else
+            {
+                print '<tr><td colspan="4">';
+                print '<b>'.$langs->trans('UpgradeExternalModule').'</b>: OK';
+                print "<!-- (".$reshook.") -->";
+                print '</td></tr>';
+            }
+        }
+        else
+        {
+            print '<tr><td colspan="4">';
+            print '<b>'.$langs->trans('UpgradeExternalModule').'</b>: '.$langs->trans("None");
+            print '</td></tr>';
+        }
+    }
 
-        // Actions for all versions (not in database)
-        migrate_delete_old_files($db, $langs, $conf);
-        migrate_delete_old_dir($db, $langs, $conf);
+    print '</table>';
 
+    // We always commit.
+    // Process is designed so we can run it several times whatever is situation.
+    $db->commit();
+    $db->close();
 
-        dol_mkdir(DOL_DATA_ROOT.'/bank');
-        migrate_directories($db, $langs, $conf, '/banque/bordereau', '/bank/checkdeposits');
-    }
+    // Actions for all versions (no database change, delete files and directories)
+    migrate_delete_old_files($db, $langs, $conf);
+    migrate_delete_old_dir($db, $langs, $conf);
+    // Actions for all versions (no database change, create directories)
+    dol_mkdir(DOL_DATA_ROOT.'/bank');
+    // Actions for all versions (no database change, rename directories)
+    migrate_directories($db, $langs, $conf, '/banque/bordereau', '/bank/checkdeposits');
 
-    print '</table>';
+    print '<div><br>'.$langs->trans("MigrationFinished").'</div>';
 }
 else
 {
@@ -3519,6 +3554,95 @@ function migrate_mode_reglement($db,$langs,$conf)
 	print '</td></tr>';
 }
 
+
+/**
+ * Delete duplicates in table categorie_association
+ *
+ * @param	DoliDB		$db			Database handler
+ * @param	Translate	$langs		Object langs
+ * @param	Conf		$conf		Object conf
+ * @param	string		$versionto	Version target
+ * @return	void
+ */
+function migrate_clean_association($db,$langs,$conf,$versionto)
+{
+    $result = $db->DDLDescTable(MAIN_DB_PREFIX."categorie_association");
+    if ($result)	// result defined for version 3.2 or -
+    {
+        $obj = $db->fetch_object($result);
+        if ($obj)	// It table categorie_association exists
+        {
+            $couples=array();
+            $filles=array();
+            $sql = "SELECT fk_categorie_mere, fk_categorie_fille";
+            $sql.= " FROM ".MAIN_DB_PREFIX."categorie_association";
+            dolibarr_install_syslog("upgrade: search duplicate");
+            $resql = $db->query($sql);
+            if ($resql)
+            {
+                $num=$db->num_rows($resql);
+                while ($obj=$db->fetch_object($resql))
+                {
+                    if (! isset($filles[$obj->fk_categorie_fille]))	// Only one record as child (a child has only on parent).
+                    {
+                        if ($obj->fk_categorie_mere != $obj->fk_categorie_fille)
+                        {
+                            $filles[$obj->fk_categorie_fille]=1;	// Set record for this child
+                            $couples[$obj->fk_categorie_mere.'_'.$obj->fk_categorie_fille]=array('mere'=>$obj->fk_categorie_mere, 'fille'=>$obj->fk_categorie_fille);
+                        }
+                    }
+                }
+
+                dolibarr_install_syslog("upgrade: result is num=" . $num . " count(couples)=" . count($couples));
+
+                // If there is duplicates couples or child with two parents
+                if (count($couples) > 0 && $num > count($couples))
+                {
+                    $error=0;
+
+                    $db->begin();
+
+                    // We delete all
+                    $sql="DELETE FROM ".MAIN_DB_PREFIX."categorie_association";
+                    dolibarr_install_syslog("upgrade: delete association");
+                    $resqld=$db->query($sql);
+                    if ($resqld)
+                    {
+                        // And we insert only each record once
+                        foreach($couples as $key => $val)
+                        {
+                            $sql ="INSERT INTO ".MAIN_DB_PREFIX."categorie_association(fk_categorie_mere,fk_categorie_fille)";
+                            $sql.=" VALUES(".$val['mere'].", ".$val['fille'].")";
+                            dolibarr_install_syslog("upgrade: insert association");
+                            $resqli=$db->query($sql);
+                            if (! $resqli) $error++;
+                        }
+                    }
+
+                    if (! $error)
+                    {
+                        print '<tr><td>'.$langs->trans("MigrationCategorieAssociation").'</td>';
+                        print '<td align="right">'.$langs->trans("RemoveDuplicates").' '.$langs->trans("Success").' ('.$num.'=>'.count($couples).')</td></tr>';
+                        $db->commit();
+                    }
+                    else
+                    {
+                        print '<tr><td>'.$langs->trans("MigrationCategorieAssociation").'</td>';
+                        print '<td align="right">'.$langs->trans("RemoveDuplicates").' '.$langs->trans("Failed").'</td></tr>';
+                        $db->rollback();
+                    }
+                }
+            }
+            else
+            {
+                print '<tr><td>'.$langs->trans("Error").'</td>';
+                print '<td align="right"><div class="error">'.$db->lasterror().'</div></td></tr>';
+            }
+        }
+    }
+}
+
+
 /**
  * Migrate categorie association
  *
@@ -4304,6 +4428,7 @@ function migrate_reload_menu($db,$langs,$conf,$versionto)
 
 
 
+
 /* A faire egalement: Modif statut paye et fk_facture des factures payes completement
 
 On recherche facture incorrecte:

+ 1 - 0
htdocs/langs/en_US/banks.lang

@@ -66,6 +66,7 @@ RemoveFromRubriqueConfirm=Are you sure you want to remove link between the entry
 ListBankTransactions=List of bank entries
 IdTransaction=Transaction ID
 BankTransactions=Bank entries
+BankTransaction=Bank entry
 ListTransactions=List entries
 ListTransactionsByCategory=List entries/category
 TransactionsToConciliate=Entries to reconcile

+ 1 - 0
htdocs/langs/en_US/install.lang

@@ -138,6 +138,7 @@ KeepDefaultValuesWamp=You use the Dolibarr setup wizard from DoliWamp, so values
 KeepDefaultValuesDeb=You use the Dolibarr setup wizard from a Linux package (Ubuntu, Debian, Fedora...), so values proposed here are already optimized. Only the password of the database owner to create must be completed. Change other parameters only if you know what you do.
 KeepDefaultValuesMamp=You use the Dolibarr setup wizard from DoliMamp, so values proposed here are already optimized. Change them only if you know what you do.
 KeepDefaultValuesProxmox=You use the Dolibarr setup wizard from a Proxmox virtual appliance, so values proposed here are already optimized. Change them only if you know what you do.
+UpgradeExternalModule=Run dedicated upgrade process of external modules
 
 #########
 # upgrade

+ 1 - 1
htdocs/loan/index.php

@@ -41,7 +41,7 @@ $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/margin/agentMargins.php

@@ -55,7 +55,7 @@ if (! $sortfield)
 	    $sortfield="u.lastname";
 }
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/margin/customerMargins.php

@@ -42,7 +42,7 @@ $result = restrictedArea($user, 'societe','','');
 $mesg = '';
 
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/margin/productMargins.php

@@ -64,7 +64,7 @@ if (! $sortfield)
 }
 
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/margin/tabs/productMargins.php

@@ -49,7 +49,7 @@ $mesg = '';
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/margin/tabs/thirdpartyMargins.php

@@ -42,7 +42,7 @@ $mesg = '';
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/modulebuilder/template/myobject_list.php

@@ -73,7 +73,7 @@ $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
 $sortfield = GETPOST('sortfield','alpha');
 $sortorder = GETPOST('sortorder','alpha');
 $page = GETPOST('page','int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/opensurvey/list.php

@@ -42,7 +42,7 @@ $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

+ 1 - 1
htdocs/product/document.php

@@ -57,7 +57,7 @@ $hookmanager->initHooks(array('productdocuments'));
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
 $page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
+if (empty($page) || $page == -1) { $page = 0; }     // If $page is not defined, or '' or -1
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;

Some files were not shown because too many files changed in this diff