From 79d376ee12cda707021ad4c55d791fdcc8c650d9 Mon Sep 17 00:00:00 2001
From: Laurent Destailleur <eldy@destailleur.fr>
Date: Fri, 14 Oct 2016 13:05:01 +0200
Subject: [PATCH] Debug accountancy module

---
 htdocs/accountancy/admin/card.php             |  12 +-
 htdocs/accountancy/admin/fiscalyear.php       |   4 +-
 htdocs/accountancy/admin/index.php            |  55 +++---
 .../class/html.formventilation.class.php      |   2 +-
 htdocs/accountancy/customer/card.php          |  13 +-
 htdocs/accountancy/customer/lines.php         |  80 ++++----
 htdocs/accountancy/customer/list.php          | 184 ++++++++---------
 htdocs/accountancy/supplier/card.php          |  18 +-
 htdocs/accountancy/supplier/lines.php         |  93 ++++++---
 htdocs/accountancy/supplier/list.php          | 187 +++++++++---------
 htdocs/core/lib/accounting.lib.php            |   9 +-
 htdocs/core/menus/init_menu_auguria.sql       |  10 +-
 htdocs/core/menus/standard/eldy.lib.php       |   5 +-
 .../install/mysql/migration/4.0.0-5.0.0.sql   |   5 +
 .../tables/llx_facture_fourn_det.key.sql      |   5 +-
 .../mysql/tables/llx_facturedet.key.sql       |   6 +-
 htdocs/langs/en_US/accountancy.lang           |  15 +-
 htdocs/langs/en_US/admin.lang                 |  18 +-
 htdocs/langs/en_US/main.lang                  |   2 +
 htdocs/product/class/product.class.php        |   6 +-
 20 files changed, 404 insertions(+), 325 deletions(-)

diff --git a/htdocs/accountancy/admin/card.php b/htdocs/accountancy/admin/card.php
index 1b3943ebd82..822a4d19bcd 100644
--- a/htdocs/accountancy/admin/card.php
+++ b/htdocs/accountancy/admin/card.php
@@ -37,6 +37,7 @@ $langs->load("accountancy");
 
 $mesg = '';
 $action = GETPOST('action');
+$backtopage = GETPOST('backtopage');
 $id = GETPOST('id', 'int');
 $rowid = GETPOST('rowid', 'int');
 $cancel = GETPOST('cancel');
@@ -51,6 +52,13 @@ $object = new AccountingAccount($db);
  * Action
  */
 
+if (GETPOST('cancel'))
+{
+	$urltogo=$backtopage?$backtopage:dol_buildpath('/accountancy/admin/account.php',1);
+	header("Location: ".$urltogo);
+	exit;
+}
+		
 if ($action == 'add' && $user->rights->accounting->chartofaccount)
 {
 	if (! $cancel) {
@@ -106,7 +114,9 @@ if ($action == 'add' && $user->rights->accounting->chartofaccount)
 		}
 		if (! $error)
 		{
-		    header("Location: account.php");
+		    setEventMessages("RecordCreatedSuccessfully",null,'mesgs');
+		    $urltogo=$backtopage?$backtopage:dol_buildpath('/accountancy/admin/account.php',1);
+		    header("Location: ".$urltogo);
 		    exit;
 		}
 	}
diff --git a/htdocs/accountancy/admin/fiscalyear.php b/htdocs/accountancy/admin/fiscalyear.php
index ff904ea96f2..4127f5e4ee2 100644
--- a/htdocs/accountancy/admin/fiscalyear.php
+++ b/htdocs/accountancy/admin/fiscalyear.php
@@ -80,7 +80,7 @@ $max = 100;
 
 $form = new Form($db);
 
-$title = $langs->trans('FiscalYears');
+$title = $langs->trans('AccountingPeriods');
 $helpurl = "";
 llxHeader('', $title, $helpurl);
 
@@ -106,7 +106,7 @@ if ($result) {
 
 	$i = 0;
 
-	$title = $langs->trans('FiscalYears');
+	$title = $langs->trans('AccountingPeriods');
 	print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $params, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit, 1);
 
 	// Load attribute_label
diff --git a/htdocs/accountancy/admin/index.php b/htdocs/accountancy/admin/index.php
index 84234b2d535..b013e8b7bd3 100644
--- a/htdocs/accountancy/admin/index.php
+++ b/htdocs/accountancy/admin/index.php
@@ -50,12 +50,12 @@ $action = GETPOST('action', 'alpha');
 
 // Parameters ACCOUNTING_* and others
 $list = array (
-		'ACCOUNTING_LIMIT_LIST_VENTILATION',
-		'ACCOUNTING_LENGTH_DESCRIPTION', // adjust size displayed for lines description for dol_trunc
-		'ACCOUNTING_LENGTH_DESCRIPTION_ACCOUNT', // adjust size displayed for select account description for dol_trunc
+		//'ACCOUNTING_LIMIT_LIST_VENTILATION',  Useless, we can change value dynamically, so we use default global setup
 		'ACCOUNTING_MANAGE_ZERO',
 		'ACCOUNTING_LENGTH_GACCOUNT',
-		'ACCOUNTING_LENGTH_AACCOUNT' 
+		'ACCOUNTING_LENGTH_AACCOUNT' ,
+		'ACCOUNTING_LENGTH_DESCRIPTION', // adjust size displayed for lines description for dol_trunc
+		'ACCOUNTING_LENGTH_DESCRIPTION_ACCOUNT', // adjust size displayed for select account description for dol_trunc
 );
 
 $list_account = array (
@@ -246,24 +246,20 @@ if (! empty($user->admin) || ! empty($user->rights->accountancy->chartofaccount)
     $var = true;
     
     print '<tr class="liste_titre">';
-    print '<td colspan="3">';
+    print '<td colspan="2">';
     print $langs->trans("Chartofaccounts") . '</td>';
     print "</tr>\n";
     $var = ! $var;
     print '<tr ' . $bc[$var] . '>';
     print "<td>" . $langs->trans("Selectchartofaccounts") . "</td>";
-    print "<td>";
+    print '<td align="right">';
     print '<select class="flat" name="chartofaccounts" id="chartofaccounts">';
-    
     $sql = "SELECT rowid, pcg_version, label, active";
     $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_system";
     $sql .= " WHERE active = 1";
-    
     dol_syslog('accountancy/admin/index.php:: $sql=' . $sql);
     $resql = $db->query($sql);
-    
     $var = true;
-    
     if ($resql) {
     	$num = $db->num_rows($resql);
     	$i = 0;
@@ -286,9 +282,8 @@ if (! empty($user->admin) || ! empty($user->rights->accountancy->chartofaccount)
 }
 
 
-/*
- *  Others params
- */
+// Others params
+
 print '<table class="noborder" width="100%">';
 print '<tr class="liste_titre">';
 print '<td colspan="2">' . $langs->trans('OtherOptions') . '</td>';
@@ -301,11 +296,11 @@ if (! empty($user->admin))
     print "<tr " . $bc[$var] . ">";
     print '<td>' . $langs->trans("ACCOUNTING_LIST_SORT_VENTILATION_TODO") . '</td>';
     if (! empty($conf->global->ACCOUNTING_LIST_SORT_VENTILATION_TODO)) {
-        print '<td align="center" colspan="2"><a href="' . $_SERVER['PHP_SELF'] . '?action=setlistsorttodo&value=0">';
+        print '<td align="right"><a href="' . $_SERVER['PHP_SELF'] . '?action=setlistsorttodo&value=0">';
         print img_picto($langs->trans("Activated"), 'switch_on');
         print '</a></td>';
     } else {
-        print '<td align="center" colspan="2"><a href="' . $_SERVER['PHP_SELF'] . '?action=setlistsorttodo&value=1">';
+        print '<td align="right"><a href="' . $_SERVER['PHP_SELF'] . '?action=setlistsorttodo&value=1">';
         print img_picto($langs->trans("Disabled"), 'switch_off');
         print '</a></td>';
     }
@@ -315,11 +310,11 @@ if (! empty($user->admin))
     print "<tr " . $bc[$var] . ">";
     print '<td>' . $langs->trans("ACCOUNTING_LIST_SORT_VENTILATION_DONE") . '</td>';
     if (! empty($conf->global->ACCOUNTING_LIST_SORT_VENTILATION_DONE)) {
-        print '<td align="center" colspan="2"><a href="' . $_SERVER['PHP_SELF'] . '?action=setlistsortdone&value=0">';
+        print '<td align="right"><a href="' . $_SERVER['PHP_SELF'] . '?action=setlistsortdone&value=0">';
         print img_picto($langs->trans("Activated"), 'switch_on');
         print '</a></td>';
     } else {
-        print '<td align="center" colspan="2"><a href="' . $_SERVER['PHP_SELF'] . '?action=setlistsortdone&value=1">';
+        print '<td align="right"><a href="' . $_SERVER['PHP_SELF'] . '?action=setlistsortdone&value=1">';
         print img_picto($langs->trans("Disabled"), 'switch_off');
         print '</a></td>';
     }
@@ -329,11 +324,11 @@ if (! empty($user->admin))
     print "<tr " . $bc[$var] . ">";
     print '<td>' . $langs->trans("BANK_DISABLE_DIRECT_INPUT") . '</td>';
     if (! empty($conf->global->BANK_DISABLE_DIRECT_INPUT)) {
-        print '<td align="center" colspan="2"><a href="' . $_SERVER['PHP_SELF'] . '?action=setdisabledirectinput&value=0">';
+        print '<td align="right"><a href="' . $_SERVER['PHP_SELF'] . '?action=setdisabledirectinput&value=0">';
         print img_picto($langs->trans("Activated"), 'switch_on');
         print '</a></td>';
     } else {
-        print '<td align="center" colspan="2"><a href="' . $_SERVER['PHP_SELF'] . '?action=setdisabledirectinput&value=1">';
+        print '<td align="right"><a href="' . $_SERVER['PHP_SELF'] . '?action=setdisabledirectinput&value=1">';
         print img_picto($langs->trans("Disabled"), 'switch_off');
         print '</a></td>';
     }
@@ -349,15 +344,14 @@ if (! empty($user->admin) || ! empty($user->rights->accountancy->chartofaccount)
     	if ($key != 'ACCOUNTING_MANAGE_ZERO')
     	{
         	print '<tr ' . $bc[$var] . ' class="value">';
-        	
         	// Param
         	$label = $langs->trans($key);
-        	print '<td><label for="' . $key . '">' . $label . '</label></td>';
-        	
+        	print '<td>'.$label.'</td>';
         	// Value
-        	print '<td>';
+        	print '<td align="right">';
         	print '<input type="text" size="20" id="' . $key . '" name="' . $key . '" value="' . $conf->global->$key . '">';
-        	print '</td></tr>';
+        	print '</td>';
+        	print '</tr>';
     	}
     	if ($key == 'ACCOUNTING_MANAGE_ZERO')
     	{
@@ -365,11 +359,11 @@ if (! empty($user->admin) || ! empty($user->rights->accountancy->chartofaccount)
     	    print "<tr " . $bc[$var] . ">";
     	    print '<td>' . $langs->trans("ACCOUNTING_MANAGE_ZERO") . '</td>';
     	    if (! empty($conf->global->ACCOUNTING_MANAGE_ZERO)) {
-    	        print '<td align="center" colspan="2"><a href="' . $_SERVER['PHP_SELF'] . '?action=setmanagezero&value=0">';
+    	        print '<td align="right""><a href="' . $_SERVER['PHP_SELF'] . '?action=setmanagezero&value=0">';
     	        print img_picto($langs->trans("Activated"), 'switch_on');
     	        print '</a></td>';
     	    } else {
-    	        print '<td align="center" colspan="2"><a href="' . $_SERVER['PHP_SELF'] . '?action=setmanagezero&value=1">';
+    	        print '<td align="right"><a href="' . $_SERVER['PHP_SELF'] . '?action=setmanagezero&value=1">';
     	        print img_picto($langs->trans("Disabled"), 'switch_off');
     	        print '</a></td>';
     	    }
@@ -381,15 +375,14 @@ if (! empty($user->admin) || ! empty($user->rights->accountancy->chartofaccount)
     	$var = ! $var;
     	
     	print '<tr ' . $bc[$var] . ' class="value">';
-    	
     	// Param
     	$label = $langs->trans($key);
-    	print '<td><label for="' . $key . '">' . $label . '</label></td>';
-    	
+    	print '<td>' . $label . '</td>';
     	// Value
-    	print '<td>';
+    	print '<td align="right">';
     	print $formaccountancy->select_account($conf->global->$key, $key, 1, '', 1, 1);
-    	print '</td></tr>';
+    	print '</td>';
+    	print '</tr>';
     }
 }
 
diff --git a/htdocs/accountancy/class/html.formventilation.class.php b/htdocs/accountancy/class/html.formventilation.class.php
index 237c0def27f..ac72df44e21 100644
--- a/htdocs/accountancy/class/html.formventilation.class.php
+++ b/htdocs/accountancy/class/html.formventilation.class.php
@@ -125,7 +125,7 @@ class FormVentilation extends Form
 			$options[$select_value_out] = $label;
 		}
 
-		$out .= Form::selectarray($htmlname, $options, $selected, $showempty, 0, 0, '', 0, 0, 0, '', $morecss);
+		$out .= Form::selectarray($htmlname, $options, $selected, $showempty, 0, 0, '', 0, 0, 0, '', $morecss, 1);
 		$this->db->free($resql);
 		return $out;
 	}
diff --git a/htdocs/accountancy/customer/card.php b/htdocs/accountancy/customer/card.php
index 8d2a838a151..6a8f1cb67b3 100644
--- a/htdocs/accountancy/customer/card.php
+++ b/htdocs/accountancy/customer/card.php
@@ -40,26 +40,35 @@ $id = GETPOST('id');
 if ($user->societe_id > 0)
 	accessforbidden();
 	
-	/*
+	
+	
+/*
  * Actions
  */
+
 if ($action == 'ventil' && $user->rights->accounting->bind->write) {
 	if (! GETPOST('cancel', 'alpha')) {
+	    if ($codeventil < 0) $codeventil = 0;
+	    
 		$sql = " UPDATE " . MAIN_DB_PREFIX . "facturedet";
 		$sql .= " SET fk_code_ventilation = " . $codeventil;
 		$sql .= " WHERE rowid = " . $id;
 		
-		dol_syslog("/accounting/customer/card.php sql=" . $sql, LOG_DEBUG);
 		$resql = $db->query($sql);
 		if (! $resql) {
 			setEventMessages($db->lasterror(), null, 'errors');
 		}
+		else
+		{
+		    setEventMessages($langs->trans("RecordModifiedSuccessfully"), null, 'mesgs');
+		}
 	} else {
 		header("Location: ./lines.php");
 		exit();
 	}
 }
 
+
 /*
  * View
  */
diff --git a/htdocs/accountancy/customer/lines.php b/htdocs/accountancy/customer/lines.php
index faa1ce7cd62..79adeecf543 100644
--- a/htdocs/accountancy/customer/lines.php
+++ b/htdocs/accountancy/customer/lines.php
@@ -52,30 +52,20 @@ $search_vat = GETPOST('search_vat', 'alpha');
 $search_country = GETPOST('search_country', 'alpha');
 $search_tvaintra = GETPOST('search_tvaintra', 'alpha');
 
-// Getpost Order and column and limit page
+// Load variable for pagination
+$limit = GETPOST('limit') ? GETPOST('limit', 'int') : (empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION)?$conf->liste_limit:$conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION);
 $sortfield = GETPOST('sortfield', 'alpha');
 $sortorder = GETPOST('sortorder', 'alpha');
 $page = GETPOST('page', 'int');
-if ($page < 0)
-	$page = 0;
-
+if ($page < 0) $page = 0;
 $pageprev = $page - 1;
 $pagenext = $page + 1;
-if (! empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION)) {
-	$limit = $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION;
-} else if ($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION <= 0) {
-	$limit = GETPOST('limit') ? GETPOST('limit', 'int') : $conf->liste_limit;
-} else {
-	$limit = GETPOST('limit') ? GETPOST('limit', 'int') : $conf->liste_limit;
-}
 $offset = $limit * $page;
-
 if (! $sortfield)
 	$sortfield = "f.datef, f.facnumber, fd.rowid";
-
 if (! $sortorder) {
 	if ($conf->global->ACCOUNTING_LIST_SORT_VENTILATION_DONE > 0) {
-		$sortorder = " DESC ";
+		$sortorder = "DESC";
 	}
 }
 
@@ -128,6 +118,8 @@ if (is_array($changeaccount) && count($changeaccount) > 0) {
 		$db->rollback();
 		setEventMessages($db->lasterror(), null, 'errors');
 	}
+	
+	$account_parent = '';   // Protection to avoid to mass apply it a second time
 }
 
 /*
@@ -207,25 +199,27 @@ if (strlen(trim($search_tvaintra))) {
 if (! empty($conf->multicompany->enabled)) {
 	$sql .= " AND f.entity IN (" . getEntity("facture", 1) . ")";
 }
-// Count total nb of records with no order and no limits
+$sql .= $db->order($sortfield, $sortorder);
+
+// Count total nb of records
 $nbtotalofrecords = 0;
-if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
-	$resql = $db->query($sql);
-	if ($resql)
-		$nbtotalofrecords = $db->num_rows($resql);
-	else
-		dol_print_error($db);
+if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
+{
+    $result = $db->query($sql);
+    $nbtotalofrecords = $db->num_rows($result);
 }
-$sql .= $db->order($sortfield, $sortorder);
+
 $sql .= $db->plimit($limit + 1, $offset);
 
-dol_syslog("/accountancy/customer/lines.php sql=" . $sql, LOG_DEBUG);
+dol_syslog("/accountancy/customer/lines.php", LOG_DEBUG);
 $result = $db->query($sql);
 if ($result) {
 	$num_lines = $db->num_rows($result);
 	$i = 0;
 
-	$param = "";
+	$param='';
+	if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage;
+	if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit;
 	if ($search_invoice)
 		$param .= "&search_invoice=" . $search_invoice;
 	if ($search_ref)
@@ -243,17 +237,26 @@ if ($result) {
 	if ($search_tvaintra)
 		$param .= "&search_tvaintra=" . $search_tvaintra;
 
-
-	print_barre_liste($langs->trans("InvoiceLinesDone"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num_lines, $nbtotalofrecords, 'title_accountancy');
-	print '<td align="left"><b>' . $langs->trans("DescVentilDoneCustomer") . '</b></td>';
-
-	print '<form method="POST" action="' . $_SERVER["PHP_SELF"] . '">';
-	print '<table class="noborder" width="100%">';
+	
+	print '<form action="' . $_SERVER["PHP_SELF"] . '" method="post">' . "\n";
+	print '<input type="hidden" name="action" value="ventil">';
+	if ($optioncss != '') print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
+	print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
+	print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
+	print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
+	print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
+	
+	print_barre_liste($langs->trans("InvoiceLinesDone"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num_lines, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit);
+	print $langs->trans("DescVentilDoneCustomer") . '<br>';
 
 	print '<br><div class="inline-block divButAction">' . $langs->trans("ChangeAccount") . '<br>';
 	print $formventilation->select_account($account_parent, 'account_parent', 1);
 	print '<input type="submit" class="button valignmiddle" value="' . $langs->trans("ChangeBinding") . '"/></div>';
 
+	$moreforfilter = '';
+	
+	print '<table class="tagtable liste'.($moreforfilter?" listwithfilterbefore":"").'">'."\n";
+	
 	print '<tr class="liste_titre">';
 	print_liste_field_titre($langs->trans("Invoice"), $_SERVER["PHP_SELF"], "f.facnumber", "", $param, '', $sortfield, $sortorder);
 	print_liste_field_titre($langs->trans("Ref"), $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder);
@@ -264,6 +267,7 @@ if ($result) {
 	print_liste_field_titre($langs->trans("Account"), $_SERVER["PHP_SELF"], "aa.account_number", "", $param, 'align="center"', $sortfield, $sortorder);
 	print_liste_field_titre($langs->trans("Country"), $_SERVER["PHP_SELF"], "co.label", "", $param, '', $sortfield, $sortorder);
 	print_liste_field_titre($langs->trans("VATIntra"), $_SERVER["PHP_SELF"], "s.tva_intra", "", $param, '', $sortfield, $sortorder);
+	print_liste_field_titre($langs->trans("LineId"), $_SERVER["PHP_SELF"], "fd.rowid", "", $param, 'align="right"', $sortfield, $sortorder);
 	print_liste_field_titre('', '', '', '', '', 'align="center"');
 	print "</tr>\n";
 
@@ -273,10 +277,11 @@ if ($result) {
 	print '<td class="liste_titre"><input type="text" class="flat" size="10" name="search_label" value="' . $search_label . '"></td>';
 	print '<td class="liste_titre"><input type="text" class="flat" size="15" name="search_desc" value="' . $search_desc . '"></td>';
 	print '<td class="liste_titre" align="right"><input type="text" class="flat" size="6" name="search_amount" value="' . $search_amount . '"></td>';
-	print '<td class="liste_titre" align="right"><input type="text" class="flat" size="3" name="search_vat" value="' . $search_vat . '">%</td>';
+	print '<td class="liste_titre" align="right"><input type="text" class="flat" size="3" name="search_vat" value="' . $search_vat . '"></td>';
 	print '<td class="liste_titre" align="center"><input type="text" class="flat" size="10" name="search_account" value="' . $search_account . '"></td>';
 	print '<td class="liste_titre"><input type="text" class="flat" name="search_country" size="5" value="' . $search_country . '"></td>';
 	print '<td class="liste_titre"><input type="text" class="flat" name="search_tavintra" size="5" value="' . $search_tavintra . '"></td>';
+	print '<td class="liste_titre" align="right"></td>';
 	print '<td class="liste_titre" align="center">';
 	$searchpitco=$form->showFilterAndCheckAddButtons(1);
 	print $searchpitco;
@@ -290,7 +295,7 @@ if ($result) {
 		$var = ! $var;
 		$codecompta = length_accountg($objp->account_number) . ' - ' . $objp->label_compte;
 
-		print '<tr'. $bc[$var].'>';
+		print '<tr '. $bc[$var].'>';
 
 		// Ref Invoice
 		$facture_static->ref = $objp->facnumber;
@@ -301,6 +306,7 @@ if ($result) {
 		$product_static->ref = $objp->product_ref;
 		$product_static->id = $objp->product_id;
 		$product_static->type = $objp->product_type;
+		$product_static->label = $objp->product_label;
 		print '<td>';
 		if ($product_static->id)
 			print $product_static->getNomUrl(1);
@@ -317,6 +323,7 @@ if ($result) {
 		print '</a></td>';
 		print '<td>' . $objp->country .'</td>';
 		print '<td>' . $objp->tva_intra . '</td>';
+		print '<td align="right">' . $objp->rowid . '</td>';
 		print '<td align="right"><input type="checkbox" class="checkforaction" name="changeaccount[]" value="' . $objp->fdid . '"/></td>';
 
 		print "</tr>";
@@ -326,11 +333,14 @@ if ($result) {
 	print $db->error();
 }
 
-print "</table></form>";
+print "</table>";
 
-if ($num_lines > $conf->liste_limit) {
-	print_barre_liste('', $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num_lines, $nbtotalofrecords, '');
+if ($nbtotalofrecords > $limit) {
+    print_barre_liste('', $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num_lines, $nbtotalofrecords, '', 0, '', '', $limit, 1);
 }
 
+print '</form>';
+
+
 llxFooter();
 $db->close();
diff --git a/htdocs/accountancy/customer/list.php b/htdocs/accountancy/customer/list.php
index 2e149437cd5..694df9a1398 100644
--- a/htdocs/accountancy/customer/list.php
+++ b/htdocs/accountancy/customer/list.php
@@ -43,7 +43,6 @@ $langs->load("accountancy");
 $action = GETPOST('action');
 
 // Select Box
-$codeventil = GETPOST('codeventil', 'array');
 $mesCasesCochees = GETPOST('mesCasesCochees', 'array');
 
 // Search Getpost
@@ -56,28 +55,20 @@ $search_account = GETPOST('search_account', 'alpha');
 $search_vat = GETPOST('search_vat', 'alpha');
 $btn_ventil = GETPOST('ventil', 'alpha');
 
-// Getpost Order and column and limit page
+// Load variable for pagination
+$limit = GETPOST('limit') ? GETPOST('limit', 'int') : (empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION)?$conf->liste_limit:$conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION);
 $sortfield = GETPOST('sortfield', 'alpha');
 $sortorder = GETPOST('sortorder', 'alpha');
-$page = GETPOST('page', 'int');
-if ($page < 0)
-	$page = 0;
-
-if (! empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION)) {
-	$limit = $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION;
-} else if ($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION <= 0) {
-	$limit = GETPOST('limit') ? GETPOST('limit', 'int') : $conf->liste_limit;
-} else {
-	$limit = GETPOST('limit') ? GETPOST('limit', 'int') : $conf->liste_limit;
-}
+$page = GETPOST('page','int');
+if ($page < 0) { $page = 0; }
 $offset = $limit * $page;
-
+$pageprev = $page - 1;
+$pagenext = $page + 1;
 if (! $sortfield)
 	$sortfield = "f.datef, f.facnumber, l.rowid";
-
 if (! $sortorder) {
 	if ($conf->global->ACCOUNTING_LIST_SORT_VENTILATION_TODO > 0) {
-		$sortorder = " DESC ";
+		$sortorder = "DESC";
 	}
 }
 
@@ -98,7 +89,8 @@ $aarowid_p = $accounting->fetch('', $conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOU
  */
 
 // Purge search criteria
-if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) {
+if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) // All test are required to be compatible with all browsers
+{
 	$search_ref = '';
 	$search_invoice = '';
 	$search_label = '';
@@ -111,37 +103,49 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETP
 if ($action == 'ventil' && ! empty($btn_ventil)) {
     $msg='';
     //print '<div><font color="red">' . $langs->trans("Processing") . '...</font></div>';
-    if (! empty($codeventil) && ! empty($mesCasesCochees)) {
-        $msg = '<div><font color="red">' . count($mesCasesCochees) . ' ' . $langs->trans("SelectedLines") . '</font></div>';
-        $mesCodesVentilChoisis = $codeventil;
+    if (! empty($mesCasesCochees)) {
+        $msg = '<div>' . $langs->trans("SelectedLines") . ': '.count($_POST["mesCasesCochees"]).'</div>';
+        $msg.='<div class="detail">';
         $cpt = 0;
+        $ok=0;
+        $ko=0;
 
-        foreach ( $mesCasesCochees as $maLigneCochee ) {
+        foreach ($mesCasesCochees as $maLigneCochee) {
             $maLigneCourante = explode("_", $maLigneCochee);
             $monId = $maLigneCourante[0];
-            $monNumLigne = $maLigneCourante[1];
-            $monCompte = $mesCodesVentilChoisis[$monNumLigne];
+            $monCompte = GETPOST('codeventil'.$monId);
 
-            $sql = " UPDATE " . MAIN_DB_PREFIX . "facturedet";
-            $sql .= " SET fk_code_ventilation = " . $monCompte;
-            $sql .= " WHERE rowid = " . $monId;
-
-            $accountventilated = new AccountingAccount($db);
-            $accountventilated->fetch($monCompte, '');
-
-            dol_syslog("/accountancy/customer/list.php sql=" . $sql, LOG_DEBUG);
-            if ($db->query($sql)) {
-                $msg.= '<div><font color="green">' . $langs->trans("Lineofinvoice") . ' ' . $monId . ' - ' . $langs->trans("VentilatedinAccount") . ' : ' . length_accountg($accountventilated->account_number) . '</font></div>';
-            } else {
-                $msg.= '<div><font color="red">' . $langs->trans("ErrorDB") . ' : ' . $langs->trans("Lineofinvoice") . ' ' . $monId . ' - ' . $langs->trans("NotVentilatedinAccount") . ' : ' . length_accountg($accountventilated->account_number) . '<br/> <pre>' . $sql . '</pre></font></div>';
+            if ($monCompte <= 0)
+            {
+                $msg.= '<div><font color="red">' . $langs->trans("Lineofinvoice") . ' ' . $monId . ' - ' . $langs->trans("NoAccountSelected") . '</font></div>';
+                $ko++;
             }
-
-            $cpt ++;
+            else
+            {
+                $sql = " UPDATE " . MAIN_DB_PREFIX . "facturedet";
+                $sql .= " SET fk_code_ventilation = " . $monCompte;
+                $sql .= " WHERE rowid = " . $monId;
+    
+                $accountventilated = new AccountingAccount($db);
+                $accountventilated->fetch($monCompte, '');
+    
+                dol_syslog("/accountancy/customer/list.php sql=" . $sql, LOG_DEBUG);
+                if ($db->query($sql)) {
+                    $msg.= '<div><font color="green">' . $langs->trans("Lineofinvoice") . ' ' . $monId . ' - ' . $langs->trans("VentilatedinAccount") . ' : ' . length_accountg($accountventilated->account_number) . '</font></div>';
+                    $ok++;
+                } else {
+                    $msg.= '<div><font color="red">' . $langs->trans("ErrorDB") . ' : ' . $langs->trans("Lineofinvoice") . ' ' . $monId . ' - ' . $langs->trans("NotVentilatedinAccount") . ' : ' . length_accountg($accountventilated->account_number) . '<br> <pre>' . $sql . '</pre></font></div>';
+                    $ko++;
+                }
+            }
+            
+            $cpt++;
         }
+        $msg.='</div>';
     } else {
-        $msg. '<div><font color="red">' . $langs->trans("AnyLineVentilate") . '</font></div>';
+        setEventMessages($langs->trans("NoRecordSelected"), null, 'warnings');
     }
-    $msg.= '<div><font color="red">' . $langs->trans("EndProcessing") . '</font></div>';
+    $msg.= '<div>' . $langs->trans("EndProcessing") . '</div>';
 }
 
 
@@ -152,36 +156,7 @@ if ($action == 'ventil' && ! empty($btn_ventil)) {
 
 llxHeader('', $langs->trans("Ventilation"));
 
-print '<script type="text/javascript">
-			$(function () {
-				$(\'#select-all\').click(function(event) {
-				    // Iterate each checkbox
-				    $(\':checkbox\').each(function() {
-				    	this.checked = true;
-				    });
-			    });
-			    $(\'#unselect-all\').click(function(event) {
-				    // Iterate each checkbox
-				    $(\':checkbox\').each(function() {
-				    	this.checked = false;
-				    });
-			    });
-			});
-		</script>';
-
-/*
- * Customer Invoice lines
- */
-if (! empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION)) {
-	$limit = $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION;
-} else if ($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION <= 0) {
-	$limit = GETPOST('limit') ? GETPOST('limit', 'int') : $conf->liste_limit;
-} else {
-	$limit = GETPOST('limit') ? GETPOST('limit', 'int') : $conf->liste_limit;
-}
-
-$offset = $limit * $page;
-
+// Customer Invoice lines
 $sql = "SELECT f.facnumber, f.rowid as facid, f.datef, f.type as ftype, l.fk_product, l.description, l.total_ht, l.rowid, l.fk_code_ventilation, l.product_type as type_l, l.tva_tx as tva_tx_line,";
 $sql .= " p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.fk_product_type as type, p.accountancy_code_sell as code_sell, p.tva_tx as tva_tx_prod,";
 $sql .= "  aa.rowid as aarowid";
@@ -190,11 +165,9 @@ $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "facturedet as l ON f.rowid = l.fk_fac
 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product as p ON p.rowid = l.fk_product";
 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_account as aa ON p.accountancy_code_sell = aa.account_number";
 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_system as accsys ON accsys.pcg_version = aa.fk_pcg_version";
-$sql .= " WHERE f.fk_statut > 0";
-$sql .= " AND l.fk_code_ventilation <= 0";
+$sql .= " WHERE f.fk_statut > 0 AND l.fk_code_ventilation <= 0";
 $sql .= " AND product_type <= 2";
 $sql .= " AND (accsys.rowid='" . $conf->global->CHARTOFACCOUNTS . "' OR p.accountancy_code_sell IS NULL OR p.accountancy_code_sell ='')";
-
 // Add search filter like
 if (strlen(trim($search_invoice))) {
 	$sql .= " AND (f.facnumber like '%" . $search_invoice . "%')";
@@ -221,48 +194,70 @@ if (strlen(trim($search_vat))) {
 if (! empty($conf->multicompany->enabled)) {
 	$sql .= " AND f.entity IN (" . getEntity("facture", 1) . ")";
 }
-
 $sql .= $db->order($sortfield, $sortorder);
 
+// Count total nb of records
+$nbtotalofrecords = 0;
+if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
+{
+    $result = $db->query($sql);
+    $nbtotalofrecords = $db->num_rows($result);
+}
+
 $sql .= $db->plimit($limit + 1, $offset);
 
-dol_syslog("/accountancy/customer/list.php sql=" . $sql, LOG_DEBUG);
+dol_syslog("/accountancy/customer/list.php", LOG_DEBUG);
 $result = $db->query($sql);
 if ($result) {
 	$num_lines = $db->num_rows($result);
 	$i = 0;
 
-	print_barre_liste($langs->trans("InvoiceLines"), $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, '', $num_lines, 0, 'title_accountancy');
+	$arrayofselected=is_array($toselect)?$toselect:array();
+	
+	$param='';
+	if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage;
+	if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit;
+
+	print '<form action="' . $_SERVER["PHP_SELF"] . '" method="post">' . "\n";
+	print '<input type="hidden" name="action" value="ventil">';
+	if ($optioncss != '') print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
+	print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
+	print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
+	print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
+	print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
+	
+	$center='<div align="center"><input type="submit" class="butAction" value="' . $langs->trans("Ventilate") . '" name="ventil"></div>';
+	
+	print_barre_liste($langs->trans("InvoiceLines"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $center, $num_lines, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit);
 
 	print $langs->trans("DescVentilTodoCustomer") . '</br><br>';
 
 	if ($msg) print $msg.'<br>';
 	
-	print '<form action="' . $_SERVER["PHP_SELF"] . '" method="post">' . "\n";
-	print '<input type="hidden" name="action" value="ventil">';
-
-	print '<table class="noborder" width="100%">';
+	$moreforfilter = '';
+	
+	print '<table class="tagtable liste'.($moreforfilter?" listwithfilterbefore":"").'">'."\n";
 	print '<tr class="liste_titre">';
 	print_liste_field_titre($langs->trans("Invoice"), $_SERVER["PHP_SELF"], "f.facnumber", "", $param, '', $sortfield, $sortorder);
 	print_liste_field_titre($langs->trans("Ref"), $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder);
 	print_liste_field_titre($langs->trans("Label"), $_SERVER["PHP_SELF"], "p.label", "", $param, '', $sortfield, $sortorder);
 	print_liste_field_titre($langs->trans("Description"), $_SERVER["PHP_SELF"], "l.description", "", $param, '', $sortfield, $sortorder);
-	print_liste_field_titre($langs->trans("Amount"), $_SERVER["PHP_SELF"], "l.total_ht", "", $param, 'align="center"', $sortfield, $sortorder);
-	print_liste_field_titre($langs->trans("VATRate"), $_SERVER["PHP_SELF"], "l.tva_tx", "", $param, 'align="center"', $sortfield, $sortorder);
+	print_liste_field_titre($langs->trans("Amount"), $_SERVER["PHP_SELF"], "l.total_ht", "", $param, 'align="right"', $sortfield, $sortorder);
+	print_liste_field_titre($langs->trans("VATRate"), $_SERVER["PHP_SELF"], "l.tva_tx", "", $param, 'align="right"', $sortfield, $sortorder);
 	print_liste_field_titre($langs->trans("AccountAccountingSuggest"), '', '', '', '', 'align="center"');
 	print_liste_field_titre($langs->trans("IntoAccount"), '', '', '', '', 'align="center"');
-	print_liste_field_titre('');
+	print_liste_field_titre($langs->trans("LineId"), $_SERVER["PHP_SELF"], "l.rowid", "", $param, 'align="right"', $sortfield, $sortorder);
 	print_liste_field_titre('', '', '', '', '', 'align="center"');
 	print '</tr>';
 
 	// We add search filter
 	print '<tr class="liste_titre">';
 	print '<td class="liste_titre"><input type="text" class="flat" size="10" name="search_invoice" value="' . $search_invoice . '"></td>';
-	print '<td class="liste_titre"><input type="text" class="flat" size="15" name="search_ref" value="' . $search_ref . '"></td>';
-	print '<td class="liste_titre"><input type="text" class="flat" size="20" name="search_label" value="' . $search_label . '"></td>';
-	print '<td class="liste_titre"><input type="text" class="flat" size="20" name="search_desc" value="' . $search_desc . '"></td>';
+	print '<td class="liste_titre"><input type="text" class="flat" size="10" name="search_ref" value="' . $search_ref . '"></td>';
+	print '<td class="liste_titre"><input type="text" class="flat" size="10" name="search_label" value="' . $search_label . '"></td>';
+	print '<td class="liste_titre"><input type="text" class="flat" size="10" name="search_desc" value="' . $search_desc . '"></td>';
 	print '<td class="liste_titre" align="right"><input type="text" class="flat" size="10" name="search_amount" value="' . $search_amount . '"></td>';
-	print '<td class="liste_titre" align="center"><input type="text" class="flat" size="3" name="search_vat" value="' . $search_vat . '">%</td>';
+	print '<td class="liste_titre" align="right"><input type="text" class="flat" size="3" name="search_vat" value="' . $search_vat . '">%</td>';
 	print '<td class="liste_titre"></td>';
 	print '<td class="liste_titre"></td>';
 	print '<td class="liste_titre"></td>';
@@ -313,7 +308,7 @@ if ($result) {
 		if ($objp->code_sell_l != $objp->code_sell_p)
 			$code_sell_p_l_differ = 'color:red';
 
-		print '<tr'. $bc[$var].'>';
+		print '<tr '. $bc[$var].'>';
 
 		// Ref Invoice
 		$facture_static->ref = $objp->facnumber;
@@ -336,26 +331,34 @@ if ($result) {
 		print '<td style="' . $code_sell_p_l_differ . '">' . dol_trunc($objp->product_label, 24) . '</td>';
 		$trunclength = defined('ACCOUNTING_LENGTH_DESCRIPTION') ? ACCOUNTING_LENGTH_DESCRIPTION : 32;
 		print '<td style="' . $code_sell_p_l_differ . '">' . nl2br(dol_trunc($objp->description, $trunclength)) . '</td>';
+		
 		print '<td align="right">';
 		print price($objp->total_ht);
 		print '</td>';
+		
+		// Vat rate
 		if ($objp->vat_tx_l != $objp->vat_tx_p)
 			$code_vat_differ = 'font-weight:bold; text-decoration:blink; color:red';
-		print '<td style="' . $code_vat_differ . '" align="center">';
+		print '<td style="' . $code_vat_differ . '" align="right">';
 		print price($objp->tva_tx_line);
 		print '</td>';
+		
 		print '<td align="center" style="' . $code_sell_p_notset . '">';
 		if ($objp->code_sell_l == $objp->code_sell_p) {
-			print $objp->code_sell_l;
+		    if ($objp->code_sell_l > 0) print $objp->code_sell_l;
+		    else print $langs->trans("Unknown");
 		} else {
 			print $langs->trans("Buy") . ' = ' . $objp->code_sell_l . '<br />' . $langs->trans("Sell") . ' = ' . $objp->code_sell_p;
 		}
 		print '</td>';
 
 		print '<td align="center">';
-		print $formventilation->select_account($objp->aarowid_suggest, 'codeventil[]', 1);
+		print $formventilation->select_account($objp->aarowid_suggest, 'codeventil'.$objp->rowid, 1);
 		print '</td>';
+		
+		// Line id
 		print '<td align="center">' . $objp->rowid . '</td>';
+		
 		print '<td align="right">';
 		print '<input type="checkbox" class="checkforaction" name="mesCasesCochees[]" value="' . $objp->rowid . "_" . $i . '"' . ($objp->aarowid ? "checked" : "") . '/>';
 		print '</td>';
@@ -364,7 +367,6 @@ if ($result) {
 	}
 
 	print '</table>';
-	print '<br><div align="center"><input type="submit" class="butAction" value="' . $langs->trans("Ventilate") . '" name="ventil"></div>';
 	print '</form>';
 } else {
 	print $db->error();
diff --git a/htdocs/accountancy/supplier/card.php b/htdocs/accountancy/supplier/card.php
index 68afa60c400..0fd60928502 100644
--- a/htdocs/accountancy/supplier/card.php
+++ b/htdocs/accountancy/supplier/card.php
@@ -44,23 +44,35 @@ $id = GETPOST('id');
 if ($user->societe_id > 0)
 	accessforbidden();
 
+	
+/*
+ * Actions
+ */
+
 if ($action == 'ventil' && $user->rights->accounting->bind->write) {
 	if (! GETPOST('cancel', 'alpha')) {
+	    if ($codeventil < 0) $codeventil = 0;
+	    
 		$sql = " UPDATE " . MAIN_DB_PREFIX . "facture_fourn_det";
 		$sql .= " SET fk_code_ventilation = " . $codeventil;
 		$sql .= " WHERE rowid = " . $id;
 		
-		dol_syslog('accountancy/supplier/card.php:: $sql=' . $sql);
 		$resql = $db->query($sql);
 		if (! $resql) {
 			setEventMessages($db->lasterror(), null, 'errors');
 		}
+		else
+		{
+		    setEventMessages($langs->trans("RecordModifiedSuccessfully"), null, 'mesgs');
+		}
 	} else {
 		header("Location: ./lines.php");
 		exit();
 	}
 }
 
+
+
 /*
  * View
  */
@@ -70,9 +82,7 @@ if ($cancel == $langs->trans("Cancel")) {
 	$action = '';
 }
 
-/*
- * Create
- */
+// Create
 $form = new Form($db);
 $facturefournisseur_static = new FactureFournisseur($db);
 $formventilation = new FormVentilation($db);
diff --git a/htdocs/accountancy/supplier/lines.php b/htdocs/accountancy/supplier/lines.php
index 6e0ac7fcc13..32398dbbe93 100644
--- a/htdocs/accountancy/supplier/lines.php
+++ b/htdocs/accountancy/supplier/lines.php
@@ -51,29 +51,20 @@ $search_amount = GETPOST('search_amount', 'alpha');
 $search_account = GETPOST('search_account', 'alpha');
 $search_vat = GETPOST('search_vat', 'alpha');
 
-// Getpost Order and column and limit page
+// Load variable for pagination
+$limit = GETPOST('limit') ? GETPOST('limit', 'int') : (empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION)?$conf->liste_limit:$conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION);
 $sortfield = GETPOST('sortfield', 'alpha');
 $sortorder = GETPOST('sortorder', 'alpha');
 $page = GETPOST('page', 'int');
-
-if ($page < 0)
-	$page = 0;
+if ($page < 0) $page = 0;
 $offset = $conf->liste_limit * $page;
 $pageprev = $page - 1;
 $pagenext = $page + 1;
-if (! empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION)) {
-	$limit = $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION;
-} else if ($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION <= 0) {
-	$limit = GETPOST('limit') ? GETPOST('limit', 'int') : $conf->liste_limit;
-} else {
-	$limit = GETPOST('limit') ? GETPOST('limit', 'int') : $conf->liste_limit;
-}
 if (! $sortfield)
 	$sortfield = "f.datef, f.ref, l.rowid";
-
 if (! $sortorder) {
 	if ($conf->global->ACCOUNTING_LIST_SORT_VENTILATION_DONE > 0) {
-		$sortorder = " DESC ";
+		$sortorder = "DESC";
 	}
 }
 
@@ -124,6 +115,8 @@ if (is_array($changeaccount) && count($changeaccount) > 0) {
 		$db->rollback();
 		setEventMessages($db->lasterror(), null, 'errors');
 	}
+
+	$account_parent = '';   // Protection to avoid to mass apply it a second time
 }
 
 
@@ -185,36 +178,65 @@ if (strlen(trim($search_vat))) {
 if (! empty($conf->multicompany->enabled)) {
 	$sql .= " AND f.entity IN (" . getEntity("facture_fourn", 1) . ")";
 }
-// Count total nb of records with no order and no limits
+$sql .= $db->order($sortfield, $sortorder);
+
+// Count total nb of records
 $nbtotalofrecords = 0;
-if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
-    $resql = $db->query($sql);
-    if ($resql)
-        $nbtotalofrecords = $db->num_rows($resql);
-        else
-            dol_print_error($db);
+if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
+{
+    $result = $db->query($sql);
+    $nbtotalofrecords = $db->num_rows($result);
 }
-$sql .= $db->order($sortfield, $sortorder);
+
 $sql .= $db->plimit($limit + 1, $offset);
 
-dol_syslog('accountancy/supplier/lines.php::list sql= ' . $sql1);
+dol_syslog('accountancy/supplier/lines.php::list');
 $result = $db->query($sql);
 
 if ($result) {
 	$num_lines = $db->num_rows($result);
 	$i = 0;
 	
-	print_barre_liste($langs->trans("InvoiceLinesDone"), $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, '', $num_lines, $nbtotalofrecords, 'title_accountancy');
+	$param='';
+	if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage;
+	if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit;
+	if ($search_invoice)
+		$param .= "&search_invoice=" . $search_invoice;
+	if ($search_ref)
+		$param .= "&search_ref=" . $search_ref;
+	if ($search_label)
+		$param .= "&search_label=" . $search_label;
+	if ($search_desc)
+		$param .= "&search_desc=" . $search_desc;
+	if ($search_account)
+		$param .= "&search_account=" . $search_account;
+	if ($search_vat)
+		$param .= "&search_vat=" . $search_vat;
+	if ($search_country)
+		$param .= "&search_country=" . $search_country;
+	if ($search_tvaintra)
+		$param .= "&search_tvaintra=" . $search_tvaintra;	
 	
-	print '<td align="left"><b>' . $langs->trans("DescVentilDoneSupplier") . '</b></td>';
+	print '<form action="' . $_SERVER["PHP_SELF"] . '" method="post">' . "\n";
+	print '<input type="hidden" name="action" value="ventil">';
+	if ($optioncss != '') print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
+	print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
+	print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
+	print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
+	print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
+		
+	print_barre_liste($langs->trans("InvoiceLinesDone"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num_lines, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit);
 	
-	print '<form method="POST" action="' . $_SERVER["PHP_SELF"] . '">';
-	print '<table class="noborder" width="100%">';
+	print $langs->trans("DescVentilDoneSupplier") . '<br>';
 	
 	print '<br><div class="inline-block divButAction">' . $langs->trans("ChangeAccount") . '<br>';
 	print $formventilation->select_account(GETPOST('account_parent'), 'account_parent', 1);
 	print '<input type="submit" class="button valignmiddle" value="' . $langs->trans("ChangeBinding") . '" /></div>';
 	
+	$moreforfilter = '';
+	
+	print '<table class="tagtable liste'.($moreforfilter?" listwithfilterbefore":"").'">'."\n";
+	
 	print '<tr class="liste_titre">';
 	print_liste_field_titre($langs->trans("Invoice"), $_SERVER["PHP_SELF"], "f.ref", "", $param, '', $sortfield, $sortorder);
 	print_liste_field_titre($langs->trans("Ref"), $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder);
@@ -223,7 +245,7 @@ if ($result) {
 	print_liste_field_titre($langs->trans("Amount"), $_SERVER["PHP_SELF"], "l.total_ht", "", $param, 'align="center"', $sortfield, $sortorder);
 	print_liste_field_titre($langs->trans("VATRate"), $_SERVER["PHP_SELF"], "l.tva_tx", "", $param, 'align="center"', $sortfield, $sortorder);
 	print_liste_field_titre($langs->trans("Account"), $_SERVER["PHP_SELF"], "aa.account_number", "", $param, 'align="center"', $sortfield, $sortorder);
-	print_liste_field_titre('');
+	print_liste_field_titre($langs->trans("LineId"), $_SERVER["PHP_SELF"], "l.rowid", "", $param, 'align="right"', $sortfield, $sortorder);
 	print_liste_field_titre('');
 	print_liste_field_titre('', '', '', '', '', 'align="center"');
 	print "</tr>\n";
@@ -233,9 +255,10 @@ if ($result) {
 	print '<td class="liste_titre"><input type="text" class="flat" size="10" name="search_label" value="' . $search_label . '"></td>';
 	print '<td class="liste_titre"><input type="text" class="flat" size="15" name="search_desc" value="' . $search_desc . '"></td>';
 	print '<td class="liste_titre" align="right"><input type="text" class="flat" size="6" name="search_amount" value="' . $search_amount . '"></td>';
-	print '<td class="liste_titre" align="right"><input type="text" class="flat" size="3" name="search_vat" value="' . $search_vat . '">%</td>';
+	print '<td class="liste_titre" align="right"><input type="text" class="flat" size="3" name="search_vat" value="' . $search_vat . '"></td>';
 	print '<td class="liste_titre" align="center"><input type="text" class="flat" size="10" name="search_account" value="' . $search_account . '"></td>';
-	print '<td class="liste_titre" colspan="2">&nbsp;</td>';
+	print '<td class="liste_titre" align="right"></td>';
+    print '<td class="liste_titre" align="right"></td>';
     print '<td class="liste_titre" align="right">';
     $searchpitco=$form->showFilterAndCheckAddButtons(1);
     print $searchpitco;
@@ -251,7 +274,7 @@ if ($result) {
 		$var = ! $var;
 		$codeCompta = length_accountg($objp->account_number) . ' - ' . $objp->label;
 		
-		print '<tr'. $bc[$var].'>';
+		print '<tr '. $bc[$var].'>';
 		
 		// Ref Invoice
 		$facturefournisseur_static->ref = $objp->facnumber;
@@ -262,6 +285,7 @@ if ($result) {
 		$product_static->ref = $objp->product_ref;
 		$product_static->id = $objp->product_id;
 		$product_static->type = $objp->type;
+		$product_static->label = $objp->product_label;
 		print '<td>';
 		if ($product_static->id)
 			print $product_static->getNomUrl(1);
@@ -288,7 +312,14 @@ if ($result) {
 	print $db->error();
 }
 
-print "</table></form>";
+print "</table>";
+
+if ($nbtotalofrecords > $limit) {
+    print_barre_liste('', $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num_lines, $nbtotalofrecords, '', 0, '', '', $limit, 1);
+}
+
+print '</form>';
+
 
 llxFooter();
 $db->close();
diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php
index 984fc119f61..0716df50902 100644
--- a/htdocs/accountancy/supplier/list.php
+++ b/htdocs/accountancy/supplier/list.php
@@ -43,7 +43,6 @@ $langs->load("accountancy");
 $action = GETPOST('action');
 
 // Select Box
-$codeventil = GETPOST('codeventil', 'array');
 $mesCasesCochees = GETPOST('mesCasesCochees', 'array');
 
 // Search Getpost
@@ -56,28 +55,20 @@ $search_account = GETPOST('search_account', 'alpha');
 $search_vat = GETPOST('search_vat', 'alpha');
 $btn_ventil = GETPOST('ventil', 'alpha');
 
-// Getpost Order and column and limit page
+// Load variable for pagination
+$limit = GETPOST('limit') ? GETPOST('limit', 'int') : (empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION)?$conf->liste_limit:$conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION);
 $sortfield = GETPOST('sortfield', 'alpha');
 $sortorder = GETPOST('sortorder', 'alpha');
-
-$page = GETPOST('page');
-if ($page < 0)
-	$page = 0;
-
-if (! empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION)) {
-	$limit = $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION;
-} else if ($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION <= 0) {
-	$limit = GETPOST('limit') ? GETPOST('limit', 'int') : $conf->liste_limit;
-} else {
-	$limit = GETPOST('limit') ? GETPOST('limit', 'int') : $conf->liste_limit;
-}
+$page = GETPOST('page','int');
+if ($page < 0) { $page = 0; }
 $offset = $limit * $page;
-
+$pageprev = $page - 1;
+$pagenext = $page + 1;
 if (! $sortfield)
 	$sortfield = "f.datef, f.ref, l.rowid";
 if (! $sortorder) {
 	if ($conf->global->ACCOUNTING_LIST_SORT_VENTILATION_TODO > 0) {
-		$sortorder = " DESC ";
+		$sortorder = "DESC";
 	}
 }
 
@@ -104,7 +95,7 @@ $aarowid_p = $accounting->fetch('', $conf->global->ACCOUNTING_PRODUCT_BUY_ACCOUN
  */
 
 // Purge search criteria
-if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers
+if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) // All test are required to be compatible with all browsers
 {
     $search_ref = '';
     $search_label = '';
@@ -117,38 +108,51 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both
 if ($action == 'ventil' && ! empty($btn_ventil)) {
     $msg='';
     //print '<div><font color="red">' . $langs->trans("Processing") . '...</font></div>';
-    if ($_POST['codeventil'] && $_POST["mesCasesCochees"]) {
-        $msg = '<div><font color="red">' . count($_POST["mesCasesCochees"]) . ' ' . $langs->trans("SelectedLines") . '</font></div>';
+    if (! empty($mesCasesCochees)) {
+        $msg = '<div>' . $langs->trans("SelectedLines") . ': '.count($_POST["mesCasesCochees"]).'</div>';
+        $msg.='<div class="detail">';
         $mesCodesVentilChoisis = $codeventil;
         $cpt = 0;
+        $ok=0;
+        $ko=0;
 
         foreach ( $mesCasesCochees as $maLigneCochee ) {
             // print '<div><font color="red">id selectionnee : '.$monChoix."</font></div>";
             $maLigneCourante = explode("_", $maLigneCochee);
             $monId = $maLigneCourante[0];
-            $monNumLigne = $maLigneCourante[1];
-            $monCompte = $mesCodesVentilChoisis[$monNumLigne];
+            $monCompte = GETPOST('codeventil'.$monId);
 
-            $sql = " UPDATE " . MAIN_DB_PREFIX . "facture_fourn_det";
-            $sql .= " SET fk_code_ventilation = " . $monCompte;
-            $sql .= " WHERE rowid = " . $monId;
-
-            $accountventilated = new AccountingAccount($db);
-            $accountventilated->fetch($monCompte, '');
-
-            dol_syslog('accountancy/supplier/list.php:: sql=' . $sql, LOG_DEBUG);
-            if ($db->query($sql)) {
-                $msg.= '<div><font color="green">' . $langs->trans("Lineofinvoice") . ' ' . $monId . ' - ' . $langs->trans("VentilatedinAccount") . ' : ' . length_accountg($accountventilated->account_number) . '</font></div>';
-            } else {
-                $msg.= '<div><font color="red">' . $langs->trans("ErrorDB") . ' : ' . $langs->trans("Lineofinvoice") . ' ' . $monId . ' - ' . $langs->trans("NotVentilatedinAccount") . ' : ' . length_accountg($accountventilated->account_number) . '<br/> <pre>' . $sql . '</pre></font></div>';
+            if ($monCompte <= 0)
+            {
+                $msg.= '<div><font color="red">' . $langs->trans("Lineofinvoice") . ' ' . $monId . ' - ' . $langs->trans("NoAccountSelected") . '</font></div>';
+                $ko++;
             }
-
-            $cpt ++;
+            else
+            {
+                $sql = " UPDATE " . MAIN_DB_PREFIX . "facture_fourn_det";
+                $sql .= " SET fk_code_ventilation = " . $monCompte;
+                $sql .= " WHERE rowid = " . $monId;
+    
+                $accountventilated = new AccountingAccount($db);
+                $accountventilated->fetch($monCompte, '');
+    
+                dol_syslog('accountancy/supplier/list.php:: sql=' . $sql, LOG_DEBUG);
+                if ($db->query($sql)) {
+                    $ok++;
+                    $msg.= '<div><font color="green">' . $langs->trans("Lineofinvoice") . ' ' . $monId . ' - ' . $langs->trans("VentilatedinAccount") . ' : ' . length_accountg($accountventilated->account_number) . '</font></div>';
+                } else {
+                    $ko++;
+                    $msg.= '<div><font color="red">' . $langs->trans("ErrorDB") . ' : ' . $langs->trans("Lineofinvoice") . ' ' . $monId . ' - ' . $langs->trans("NotVentilatedinAccount") . ' : ' . length_accountg($accountventilated->account_number) . '<br/> <pre>' . $sql . '</pre></font></div>';
+                }
+            }
+            
+            $cpt++;
         }
+        $msg.='</div>';
     } else {
-        $msg.= '<div><font color="red">' . $langs->trans("AnyLineVentilate") . '</font></div>';
+        setEventMessages($langs->trans("NoRecordSelected"), null, 'warnings');
     }
-    $msg.= '<div><font color="red">' . $langs->trans("EndProcessing") . '</font></div>';
+    $msg.= '<div>' . $langs->trans("EndProcessing") . '</div>';
 }
 
 
@@ -158,37 +162,7 @@ if ($action == 'ventil' && ! empty($btn_ventil)) {
  */
 llxHeader('', $langs->trans("SuppliersVentilation"));
 
-print '<script type="text/javascript">
-			$(function () {
-				$(\'#select-all\').click(function(event) {
-				    // Iterate each checkbox
-				    $(\':checkbox\').each(function() {
-				    	this.checked = true;
-				    });
-			    });
-			    $(\'#unselect-all\').click(function(event) {
-				    // Iterate each checkbox
-				    $(\':checkbox\').each(function() {
-				    	this.checked = false;
-				    });
-			    });
-			});
-		</script>';
-
-
-/*
- * Supplier Invoice Lines
- */
-if (! empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION)) {
-	$limit = $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION;
-} else if ($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION <= 0) {
-	$limit = GETPOST('limit') ? GETPOST('limit', 'int') : $conf->liste_limit;
-} else {
-	$limit = GETPOST('limit') ? GETPOST('limit', 'int') : $conf->liste_limit;
-}
-
-$offset = $limit * $page;
-
+// Supplier Invoice Lines
 $sql = "SELECT f.ref, f.rowid as facid, f.ref_supplier, f.datef, l.fk_product, l.description, l.total_ht as price, l.rowid, l.fk_code_ventilation, l.product_type as type_l, l.tva_tx as tva_tx_line, ";
 $sql .= " p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.fk_product_type as type, p.accountancy_code_buy as code_buy, p.tva_tx as tva_tx_prod";
 $sql .= " , aa.rowid as aarowid";
@@ -197,7 +171,7 @@ $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "facture_fourn_det as l ON f.rowid = l
 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product as p ON p.rowid = l.fk_product";
 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_account as aa ON p.accountancy_code_buy = aa.account_number";
 $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_system as accsys ON accsys.pcg_version = aa.fk_pcg_version";
-$sql .= " WHERE f.fk_statut > 0 AND fk_code_ventilation <= 0";
+$sql .= " WHERE f.fk_statut > 0 AND l.fk_code_ventilation <= 0";
 $sql .= " AND product_type <= 2";
 $sql .= " AND (accsys.rowid='" . $conf->global->CHARTOFACCOUNTS . "' OR p.accountancy_code_sell IS NULL OR p.accountancy_code_buy ='')";
 // Add search filter like
@@ -225,50 +199,71 @@ if (strlen(trim($search_vat))) {
 if (! empty($conf->multicompany->enabled)) {
 	$sql .= " AND f.entity IN (" . getEntity("facture_fourn", 1) . ")";
 }
-
 $sql .= $db->order($sortfield, $sortorder);
 
+// Count total nb of records
+$nbtotalofrecords = 0;
+if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
+{
+    $result = $db->query($sql);
+    $nbtotalofrecords = $db->num_rows($result);
+}
+
 $sql .= $db->plimit($limit + 1, $offset);
 
-dol_syslog('accountancy/supplier/list.php:: $sql=' . $sql);
+dol_syslog('accountancy/supplier/list.php');
 $result = $db->query($sql);
 if ($result) {
 	$num_lines = $db->num_rows($result);
 	$i = 0;
 
-	// TODO : print_barre_liste always use $conf->liste_limit and do not care about custom limit in list...
-	print_barre_liste($langs->trans("InvoiceLines"), $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, '', $num_lines, 0, 'title_accountancy');
+	$arrayofselected=is_array($toselect)?$toselect:array();
+	
+	$param='';
+	if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage;
+	if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit;
+	
+	print '<form action="' . $_SERVER["PHP_SELF"] . '" method="post">' . "\n";
+	print '<input type="hidden" name="action" value="ventil">';
+	if ($optioncss != '') print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
+	print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
+	print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
+	print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
+	print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
+	
+	$center='<div align="center"><input type="submit" class="butAction" value="' . $langs->trans("Ventilate") . '" name="ventil"></div>';
+	
+	print_barre_liste($langs->trans("InvoiceLines"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $center, $num_lines, 0, 'title_accountancy', 0, '', '', $limit);
 
 	if ($msg) print $msg.'<br>';
 	
 	print $langs->trans("DescVentilTodoCustomer") . '</br><br>';
 
-	print '<form action="' . $_SERVER["PHP_SELF"] . '" method="post">' . "\n";
-	print '<input type="hidden" name="action" value="ventil">';
-
-	print '<table class="noborder" width="100%">';
+    $moreforfilter = '';
+	
+    print '<table class="tagtable liste'.($moreforfilter?" listwithfilterbefore":"").'">'."\n";
 	print '<tr class="liste_titre">';
 	print_liste_field_titre($langs->trans("Invoice"), $_SERVER["PHP_SELF"], "f.ref", "", $param, '', $sortfield, $sortorder);
 	print_liste_field_titre($langs->trans("Ref"), $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder);
 	print_liste_field_titre($langs->trans("Label"), $_SERVER["PHP_SELF"], "p.label", "", $param, '', $sortfield, $sortorder);
 	print_liste_field_titre($langs->trans("Description"), $_SERVER["PHP_SELF"], "l.description", "", $param, '', $sortfield, $sortorder);
-	print_liste_field_titre($langs->trans("Amount"), $_SERVER["PHP_SELF"], "l.total_ht", "", $param, 'align="center"', $sortfield, $sortorder);
-	print_liste_field_titre($langs->trans("VATRate"), $_SERVER["PHP_SELF"], "l.tva_tx", "", $param, 'align="center"', $sortfield, $sortorder);
+	print_liste_field_titre($langs->trans("Amount"), $_SERVER["PHP_SELF"], "l.total_ht", "", $param, 'align="right"', $sortfield, $sortorder);
+	print_liste_field_titre($langs->trans("VATRate"), $_SERVER["PHP_SELF"], "l.tva_tx", "", $param, 'align="right"', $sortfield, $sortorder);
 	print_liste_field_titre($langs->trans("AccountAccounting"), '', '', '', '', 'align="center"');
 	print_liste_field_titre($langs->trans("IntoAccount"), '', '', '', '', 'align="center"');
-	print_liste_field_titre('');
+	print_liste_field_titre($langs->trans("LineId"), $_SERVER["PHP_SELF"], "l.rowid", "", $param, 'align="right"', $sortfield, $sortorder);
 	print_liste_field_titre('', '', '', '', '', 'align="center"');
 	print "</tr>\n";
 
 	print '<tr class="liste_titre">';
 	print '<td class="liste_titre"><input type="text" class="flat" size="10" name="search_invoice" value="' . $search_invoice . '"></td>';
-	print '<td class="liste_titre">%<input type="text" class="flat" size="15" name="search_ref" value="' . $search_ref . '"></td>';
-	print '<td class="liste_titre"><input type="text" class="flat" size="20" name="search_label" value="' . $search_label . '"></td>';
-	print '<td class="liste_titre"><input type="text" class="flat" size="20" name="search_desc" value="' . $search_desc . '"></td>';
-	print '<td class="liste_titre" align="right"><input type="text" class="flat" size="10" name="search_amount" value="' . $search_amount . '"></td>';
-	print '<td class="liste_titre" align="center">%<input type="text" class="flat" size="5" name="search_vat" value="' . $search_vat . '"></td>';
-	print '<td class="liste_titre" align="center">&nbsp;</td>';
-	print '<td class="liste_titre">&nbsp;</td>';
+	print '<td class="liste_titre"><input type="text" class="flat" size="10" name="search_ref" value="' . $search_ref . '"></td>';
+	print '<td class="liste_titre"><input type="text" class="flat" size="10" name="search_label" value="' . $search_label . '"></td>';
+	print '<td class="liste_titre"><input type="text" class="flat" size="10" name="search_desc" value="' . $search_desc . '"></td>';
+	print '<td class="liste_titre" align="right"><input type="text" class="flat" size="6" name="search_amount" value="' . $search_amount . '"></td>';
+	print '<td class="liste_titre" align="right"><input type="text" class="flat" size="5" name="search_vat" value="' . $search_vat . '"></td>';
+	print '<td class="liste_titre"></td>';
+	print '<td class="liste_titre"></td>';
 	print '<td class="liste_titre"></td>';
 	print '<td align="right" class="liste_titre">';
 	$searchpitco=$form->showFilterAndCheckAddButtons(1);
@@ -322,7 +317,7 @@ if ($result) {
 		if ($objp->code_buy_l != $objp->code_buy_p)
 			$code_buy_p_l_differ = 'color:red';
 		
-		print '<tr'. $bc[$var].'>';
+		print '<tr '. $bc[$var].'>';
 
 		// Ref Invoice
 		$facturefourn_static->ref = $objp->ref;
@@ -350,26 +345,31 @@ if ($result) {
 		print price($objp->price);
 		print '</td>';
 
+		// Vat rate
 		if ($objp->vat_tx_l != $objp->vat_tx_p)
 			$code_vat_differ = 'font-weight:bold; text-decoration:blink; color:red';
-		print '<td style="' . $code_vat_differ . '" align="center">';
+		print '<td style="' . $code_vat_differ . '" align="right">';
 		print price($objp->tva_tx_line);
 		print '</td>';
 
 		print '<td align="center" style="' . $code_buy_p_notset . '">';
-		// if not same kind of product_type stored in product & facturedt we display both account and let user choose
+		// if not same kind of product_type stored in product & facturedet we display both account and let user choose
 		if ($objp->code_buy_l == $objp->code_buy_p) {
-			print $objp->code_buy_l;
-		} else {
+			if ($objp->code_buy_l > 0) print $objp->code_buy_l;
+			else print $langs->trans("Unknown");			
+		} else {      // This can happen if user has change type of product after creation of invoice
 			print 'lines=' . $objp->code_buy_l . '<br />product=' . $objp->code_buy_p;
 		}
 		print '</td>';
 
 		// Colonne choix du compte
 		print '<td align="center">';
-		print $formventilation->select_account($objp->aarowid_suggest, 'codeventil[]', 1);
+		print $formventilation->select_account($objp->aarowid_suggest, 'codeventil'.$objp->rowid, 1);
 		print '</td>';
+		
+		// Line id
 		print '<td align="center">' . $objp->rowid . '</td>';
+		
 		// Colonne choix ligne a ventiler
 		print '<td align="right">';
 		print '<input type="checkbox" class="checkforaction" name="mesCasesCochees[]" value="' . $objp->rowid . "_" . $i . '"' . ($objp->aarowid ? "checked" : "") . '/>';
@@ -380,7 +380,6 @@ if ($result) {
 	}
 
 	print '</table>';
-	print '<br><div align="center"><input type="submit" class="butAction" value="' . $langs->trans("Ventilate") . '" name="ventil" ></div>';
 	print '</form>';
 } else {
 	print $db->error();
diff --git a/htdocs/core/lib/accounting.lib.php b/htdocs/core/lib/accounting.lib.php
index 2e8b1368ae0..bb704ba5c2e 100644
--- a/htdocs/core/lib/accounting.lib.php
+++ b/htdocs/core/lib/accounting.lib.php
@@ -105,7 +105,7 @@ function clean_account($account)
 }
 
 /**
- * Return General accounting account with defined length
+ * Return General accounting account with defined length (used for product and miscellaneous)
  *
  * @param 	string	$account		General accounting account
  * @return	string          		String with defined length
@@ -114,7 +114,7 @@ function length_accountg($account)
 {
 	global $conf;
 
-	if ($account < 0 || empty($account)) return 'NotDefined';
+	if ($account < 0 || empty($account)) return '';
 	
 	$g = $conf->global->ACCOUNTING_LENGTH_GACCOUNT;
 
@@ -139,8 +139,7 @@ function length_accountg($account)
 }
 
 /**
- * Return Auxiliary accounting account with defined length
- * TODO For thirdparty accounts only, or products too ?
+ * Return Auxiliary accounting account of thirdparties with defined length
  *
  * @param 	string	$accounta		Auxiliary accounting account
  * @return	string          		String with defined length
@@ -149,7 +148,7 @@ function length_accounta($accounta)
 {
 	global $conf, $langs;
 
-	if ($accounta < 0 || empty($accounta)) return 'NotDefined';
+	if ($accounta < 0 || empty($accounta)) return '';
 	
 	$a = $conf->global->ACCOUNTING_LENGTH_AACCOUNT;
 
diff --git a/htdocs/core/menus/init_menu_auguria.sql b/htdocs/core/menus/init_menu_auguria.sql
index e48a9251791..bbf8c9d6adc 100644
--- a/htdocs/core/menus/init_menu_auguria.sql
+++ b/htdocs/core/menus/init_menu_auguria.sql
@@ -211,8 +211,11 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left
 insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->tax->enabled && empty($conf->global->TAX_DISABLE_VAT_MENUS) && $leftmenu=="tax_vat"', __HANDLER__, 'left', 2304__+MAX_llx_menu__, 'accountancy', '', 2300__+MAX_llx_menu__, '/compta/tva/quadri_detail.php?leftmenu=tax_vat', 'ReportByQuarter', 2, 'companies', '$user->rights->tax->charges->lire', '', 0, 3, __ENTITY__);
 -- Accounting Expert
 insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled', __HANDLER__, 'left', 2400__+MAX_llx_menu__, 'accountancy', 'accounting', 6__+MAX_llx_menu__, '/accountancy/index.php?leftmenu=accounting', 'MenuAccountancy', 0, 'accountancy', '! empty($conf->accounting->enabled) || $user->rights->accounting->bind->write || $user->rights->accounting->bind->write || $user->rights->compta->resultat->lire', '', 0, 7, __ENTITY__);
+	-- Setup
+	insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled', __HANDLER__, 'left', 2451__+MAX_llx_menu__, 'accountancy', 'accountancy_admin_chart', 2400__+MAX_llx_menu__, '/accountancy/admin/account.php?mainmenu=accountancy_admin', 'Chartofaccounts', 1, 'admin', '$user->rights->accounting->chartofaccount', '', 0, 1, __ENTITY__);
+	insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled', __HANDLER__, 'left', 2451__+MAX_llx_menu__, 'accountancy', 'accountancy_admin_default', 2400__+MAX_llx_menu__, '/accountancy/admin/index.php?mainmenu=accountancy_admin', 'MenuDefaultAccounts', 1, 'admin', '$user->rights->accounting->chartofaccount', '', 0, 2, __ENTITY__);
 	-- Binding
-	insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled', __HANDLER__, 'left', 2415__+MAX_llx_menu__, 'home', '', 2400__+MAX_llx_menu__, '/accountancy/admin/productaccount.php?mainmenu=home&amp;leftmenu=admintools', 'ProductsBinding', 1, 'accountancy', '', '', 0, 0, __ENTITY__);
+	insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled', __HANDLER__, 'left', 2415__+MAX_llx_menu__, 'accountancy', '', 2400__+MAX_llx_menu__, '/accountancy/admin/productaccount.php?mainmenu=home&amp;leftmenu=admintools', 'ProductsBinding', 1, 'accountancy', '', '', 0, 0, __ENTITY__);
 	insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled', __HANDLER__, 'left', 2401__+MAX_llx_menu__, 'accountancy', 'dispatch_customer', 2400__+MAX_llx_menu__, '/accountancy/customer/index.php?leftmenu=dispatch_customer', 'CustomersVentilation', 1, 'accountancy', '$user->rights->accounting->bind->write', '', 0, 1, __ENTITY__);
 	insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled && $leftmenu=="dispatch_customer"', __HANDLER__, 'left', 2402__+MAX_llx_menu__, 'accountancy', '', 2401__+MAX_llx_menu__, '/accountancy/customer/list.php', 'ToDispatch', 2, 'accountancy', '$user->rights->accounting->bind->write', '', 0, 2, __ENTITY__);
 	insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled && $leftmenu=="dispatch_customer"', __HANDLER__, 'left', 2403__+MAX_llx_menu__, 'accountancy', '', 2401__+MAX_llx_menu__, '/accountancy/customer/lines.php', 'Dispatched', 2, 'accountancy', '$user->rights->accounting->bind->write', '', 0, 3, __ENTITY__);
@@ -234,9 +237,8 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left
 	insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled && $leftmenu=="ca"', __HANDLER__, 'left', 2445__+MAX_llx_menu__, 'accountancy', '', 2440__+MAX_llx_menu__, '/compta/stats/casoc.php?leftmenu=ca', 'ByCompanies', 3, 'main', '$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire', '', 0, 22, __ENTITY__);
 	insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled && $leftmenu=="ca"', __HANDLER__, 'left', 2446__+MAX_llx_menu__, 'accountancy', '', 2440__+MAX_llx_menu__, '/compta/stats/cabyuser.php?leftmenu=ca', 'ByUsers', 3, 'main', '$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire', '', 0, 23, __ENTITY__);
 	insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled && $leftmenu=="ca"', __HANDLER__, 'left', 2447__+MAX_llx_menu__, 'accountancy', '', 2440__+MAX_llx_menu__, '/compta/stats/cabyprodserv.php?leftmenu=ca', 'ByProductsAndServices', 3, 'main', '$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire', '', 0, 24, __ENTITY__);
-	-- Admin
-	insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled', __HANDLER__, 'left', 2451__+MAX_llx_menu__, 'home', '', 2400__+MAX_llx_menu__, '/accountancy/admin/account.php?mainmenu=accountancy', 'Chartofaccounts', 1, 'admin', '$user->rights->accounting->chartofaccount', '', 0, 25, __ENTITY__);
-	insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="setup" && $conf->accounting->enabled', __HANDLER__, 'left', 115__+MAX_llx_menu__, 'home', '', 100__+MAX_llx_menu__, '/accountancy/admin/fiscalyear.php?mainmenu=setup', 'Fiscalyear', 1, 'admin', '', '', 2, 4, __ENTITY__);
+	-- Accounting period
+	insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled', __HANDLER__, 'left', 115__+MAX_llx_menu__,  'accountancy', 'accountancy_admin_period', 100__+MAX_llx_menu__, '/accountancy/admin/fiscalyear.php?mainmenu=setup', 'FiscalPeriod', 1, 'admin', '', '', 2, 4, __ENTITY__);
 -- Rapports compta simple
 insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->comptabilite->enabled', __HANDLER__, 'left', 2700__+MAX_llx_menu__, 'accountancy', 'ca', 6__+MAX_llx_menu__, '/compta/resultat/index.php?leftmenu=ca&amp;mainmenu=accountancy', 'Reportings', 0, 'main', '$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire', '', 0, 11, __ENTITY__);
 insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->comptabilite->enabled && $leftmenu=="ca"', __HANDLER__, 'left', 2701__+MAX_llx_menu__, 'accountancy', '', 2700__+MAX_llx_menu__, '/compta/resultat/index.php?leftmenu=ca', 'ReportInOut', 1, 'main', '$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire', '', 0, 0, __ENTITY__);
diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php
index f2f6b520f59..bc9cec9f90f 100644
--- a/htdocs/core/menus/standard/eldy.lib.php
+++ b/htdocs/core/menus/standard/eldy.lib.php
@@ -943,7 +943,8 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
 
 				// Chart of account
 				$langs->load("admin");
-				if (preg_match('/accountancy/',$leftmenu)) $newmenu->add("/accountancy/admin/account.php?mainmenu=accountancy&leftmenu=accountancy_admin", $langs->trans("Chartofaccounts"),1,$user->rights->accounting->chartofaccount, '', $mainmenu, 'chartofaccount');
+				if (preg_match('/accountancy/',$leftmenu)) $newmenu->add("/accountancy/admin/account.php?mainmenu=accountancy&leftmenu=accountancy_admin", $langs->trans("Chartofaccounts"),1,$user->rights->accounting->chartofaccount, '', $mainmenu, 'accountancy_admin_chart', 1);
+				if (preg_match('/accountancy/',$leftmenu)) $newmenu->add("/accountancy/admin/index.php?mainmenu=accountancy&leftmenu=accountancy_admin", $langs->trans("MenuDefaultAccounts"),1,$user->rights->accounting->chartofaccount, '', $mainmenu, 'accountancy_admin_default', 2);
 				
 				// Binding
 				if (preg_match('/accountancy/',$leftmenu)) $newmenu->add("/accountancy/admin/productaccount.php?mainmenu=accountancy&amp;leftmenu=accountancy", $langs->trans("ProductsBinding"), 1, $user->admin);
@@ -1013,7 +1014,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
 				// Fiscal year
 				if ($conf->global->MAIN_FEATURES_LEVEL > 0)     // Not yet used. In a future will lock some periods.
 				{
-				    if (preg_match('/accountancy/',$leftmenu)) $newmenu->add("/accountancy/admin/fiscalyear.php?mainmenu=accountancy&leftmenu=accountancy_admin", $langs->trans("Fiscalyear"),1,$user->rights->accounting->fiscalyear, '', $mainmenu, 'fiscalyear');
+				    if (preg_match('/accountancy/',$leftmenu)) $newmenu->add("/accountancy/admin/fiscalyear.php?mainmenu=accountancy&leftmenu=accountancy_admin", $langs->trans("FiscalPeriod"),1,$user->rights->accounting->fiscalyear, '', $mainmenu, 'fiscalyear');
 				}
 			}
 
diff --git a/htdocs/install/mysql/migration/4.0.0-5.0.0.sql b/htdocs/install/mysql/migration/4.0.0-5.0.0.sql
index 359d01fcc54..9b072b1f119 100644
--- a/htdocs/install/mysql/migration/4.0.0-5.0.0.sql
+++ b/htdocs/install/mysql/migration/4.0.0-5.0.0.sql
@@ -30,6 +30,11 @@ ALTER TABLE llx_product_lot MODIFY COLUMN entity integer DEFAULT 1;
 UPDATE llx_product_lot SET entity = 1 WHERE entity IS NULL;
 
 
+ALTER TABLE llx_facturedet ADD INDEX idx_facturedet_fk_code_ventilation (fk_code_ventilation);
+ALTER TABLE llx_facture_fourn_det ADD INDEX idx_facture_fourn_det_fk_code_ventilation (fk_code_ventilation);
+
+ALTER TABLE llx_facture_fourn_det ADD INDEX idx_facture_fourn_det_fk_product (fk_product);
+
 ALTER TABLE llx_facture_rec ADD COLUMN fk_user_modif integer;
 
 ALTER TABLE llx_adherent ADD COLUMN model_pdf varchar(255);
diff --git a/htdocs/install/mysql/tables/llx_facture_fourn_det.key.sql b/htdocs/install/mysql/tables/llx_facture_fourn_det.key.sql
index 2048cf06024..49582a4d73b 100644
--- a/htdocs/install/mysql/tables/llx_facture_fourn_det.key.sql
+++ b/htdocs/install/mysql/tables/llx_facture_fourn_det.key.sql
@@ -1,5 +1,5 @@
 -- ===================================================================
--- Copyright (C) 2005 Laurent Destailleur  <eldy@users.sourceforge.net>
+-- Copyright (C) 2005-2016 Laurent Destailleur  <eldy@users.sourceforge.net>
 --
 -- 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
@@ -21,5 +21,8 @@
 -- V4 DELETE llx_facture_fourn_det FROM llx_facture_fourn_det LEFT JOIN llx_facture_fourn ON llx_facture_fourn_det.fk_facture_fourn = llx_facture_fourn.rowid WHERE llx_facture_fourn.rowid IS NULL;
 
 ALTER TABLE llx_facture_fourn_det ADD INDEX idx_facture_fourn_det_fk_facture (fk_facture_fourn);
+ALTER TABLE llx_facture_fourn_det ADD INDEX idx_facture_fourn_det_fk_product (fk_product);
+ALTER TABLE llx_facture_fourn_det ADD INDEX idx_facture_fourn_det_fk_code_ventilation (fk_code_ventilation);
+
 ALTER TABLE llx_facture_fourn_det ADD CONSTRAINT fk_facture_fourn_det_fk_facture FOREIGN KEY (fk_facture_fourn) REFERENCES llx_facture_fourn (rowid);
 ALTER TABLE llx_facture_fourn_det ADD CONSTRAINT fk_facture_fourn_det_fk_unit FOREIGN KEY (fk_unit) REFERENCES llx_c_units (rowid);
\ No newline at end of file
diff --git a/htdocs/install/mysql/tables/llx_facturedet.key.sql b/htdocs/install/mysql/tables/llx_facturedet.key.sql
index 8a8ecf1da9c..f1a7807a910 100644
--- a/htdocs/install/mysql/tables/llx_facturedet.key.sql
+++ b/htdocs/install/mysql/tables/llx_facturedet.key.sql
@@ -1,6 +1,6 @@
 -- ===================================================================
--- Copyright (C) 2005 Laurent Destailleur  <eldy@users.sourceforge.net>
--- Copyright (C) 2011 Regis Houssin        <regis.houssin@capnetworks.com>
+-- Copyright (C) 2005-2016 Laurent Destailleur  <eldy@users.sourceforge.net>
+-- Copyright (C) 2011      Regis Houssin        <regis.houssin@capnetworks.com>
 -- Copyright (C) 2012      Cédric Salvador      <csalvador@gpcsolutions.fr>
 --
 -- This program is free software; you can redistribute it and/or modify
@@ -24,6 +24,8 @@
 
 ALTER TABLE llx_facturedet ADD INDEX idx_facturedet_fk_facture (fk_facture);
 ALTER TABLE llx_facturedet ADD INDEX idx_facturedet_fk_product (fk_product);
+ALTER TABLE llx_facturedet ADD INDEX idx_facturedet_fk_code_ventilation (fk_code_ventilation);
+
 ALTER TABLE llx_facturedet ADD UNIQUE INDEX uk_fk_remise_except (fk_remise_except, fk_facture);
 ALTER TABLE llx_facturedet ADD CONSTRAINT fk_facturedet_fk_facture FOREIGN KEY (fk_facture) REFERENCES llx_facture (rowid);
 ALTER TABLE llx_facturedet ADD CONSTRAINT fk_facturedet_fk_unit FOREIGN KEY (fk_unit) REFERENCES llx_c_units (rowid);
diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang
index c4f416d14ea..41aa22e99b6 100644
--- a/htdocs/langs/en_US/accountancy.lang
+++ b/htdocs/langs/en_US/accountancy.lang
@@ -39,6 +39,7 @@ Ventilation=Binding to accounts
 ProductsBinding=Products binding
 
 MenuAccountancy=Accountancy
+MenuDefaultAccounts=Default accounts
 CustomersVentilation=Customer invoice binding
 SuppliersVentilation=Supplier invoice binding
 CreateMvts=Create new transaction
@@ -53,12 +54,12 @@ InvoiceLinesDone=Bound lines of invoices
 IntoAccount=Bind line with the accounting account
 
 Ventilate=Bind
-
+LineId=Id line
 Processing=Processing
-EndProcessing=The end of processing
-AnyLineVentilate=Any lines to bind
+EndProcessing=Process terminated.
 SelectedLines=Selected lines
 Lineofinvoice=Line of invoice
+NoAccountSelected=No accounting account selected
 VentilatedinAccount=Binded successfully to the accounting account
 NotVentilatedinAccount=Not bound to the accounting account
 XLineSuccessfullyBinded=%s products/services successfuly bound to an accounting account
@@ -68,12 +69,12 @@ ACCOUNTING_LIMIT_LIST_VENTILATION=Number of elements to bind shown by page (maxi
 ACCOUNTING_LIST_SORT_VENTILATION_TODO=Begin the sorting of the page "Binding to do" by the most recent elements
 ACCOUNTING_LIST_SORT_VENTILATION_DONE=Begin the sorting of the page "Binding done" by the most recent elements
 
-ACCOUNTING_LENGTH_DESCRIPTION=Length for displaying product & services description in listings (Best = 50)
-ACCOUNTING_LENGTH_DESCRIPTION_ACCOUNT=Length for displaying product & services account description form in listings (Best = 50)
+ACCOUNTING_LENGTH_DESCRIPTION=Truncate product & services description in listings after x chars (Best = 50)
+ACCOUNTING_LENGTH_DESCRIPTION_ACCOUNT=Truncate product & services account description form in listings after x chars (Best = 50)
 ACCOUNTING_LENGTH_GACCOUNT=Length of the general accounting accounts
 ACCOUNTING_LENGTH_AACCOUNT=Length of the third party accounting accounts
 ACCOUNTING_MANAGE_ZERO=Manage the zero at the end of an accounting account. Needed by some countries. Disabled by default. If set to on, you must also set the 2 following parameters (or it is ignored)
-BANK_DISABLE_DIRECT_INPUT=Disable free input of bank transactions (Enabled by default with this module).
+BANK_DISABLE_DIRECT_INPUT=Disable direct recording of transaction in bank account
 
 ACCOUNTING_SELL_JOURNAL=Sell journal
 ACCOUNTING_PURCHASE_JOURNAL=Purchase journal
@@ -186,7 +187,7 @@ Calculated=Calculated
 Formula=Formula
 
 ## Error
-ErrorNoAccountingCategoryForThisCountry=No accounting category are available for this country
+ErrorNoAccountingCategoryForThisCountry=No accounting category available for country %s (See Home - Setup - Dictionaries)
 ExportNotSupported=The export format setuped is not supported into this page
 BookeppingLineAlreayExists=Lines already existing into bookeeping
 
diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang
index 581d15d47e1..2f3efdc85ea 100644
--- a/htdocs/langs/en_US/admin.lang
+++ b/htdocs/langs/en_US/admin.lang
@@ -54,7 +54,7 @@ ErrorDecimalLargerThanAreForbidden=Error, a precision higher than <b>%s</b> is n
 DictionarySetup=Dictionary setup
 Dictionary=Dictionaries
 Chartofaccounts=Chart of accounts
-Fiscalyear=Fiscal year
+FiscalPeriod=Accounting period
 ErrorReservedTypeSystemSystemAuto=Value 'system' and 'systemauto' for type is reserved. You can use 'user' as value to add your own record
 ErrorCodeCantContainZero=Code can't contain value 0
 DisableJavascript=Disable JavaScript and Ajax functions (Recommended for blind person or text browsers)
@@ -1523,14 +1523,14 @@ TaskModelModule=Tasks reports document model
 UseSearchToSelectProject=Use autocompletion fields to choose project (instead of using a list box)
 ##### ECM (GED) #####
 ##### Fiscal Year #####
-FiscalYears=Fiscal years
-FiscalYearCard=Fiscal year card
-NewFiscalYear=New fiscal year
-OpenFiscalYear=Open fiscal year
-CloseFiscalYear=Close fiscal year
-DeleteFiscalYear=Delete fiscal year
-ConfirmDeleteFiscalYear=Are you sure to delete this fiscal year?
-ShowFiscalYear=Show fiscal year
+AccountingPeriods=Accounting periods
+AccountingPeriodCard=Accounting period
+NewFiscalYear=New accounting period
+OpenFiscalYear=Open accounting period
+CloseFiscalYear=Close accounting period
+DeleteFiscalYear=Delete accounting period
+ConfirmDeleteFiscalYear=Are you sure to delete this accounting period?
+ShowFiscalYear=Show accounting period
 AlwaysEditable=Can always be edited
 MAIN_APPLICATION_TITLE=Force visible name of application (warning: setting your own name here may break autofill login feature when using DoliDroid mobile application)
 NbMajMin=Minimum number of uppercase characters
diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang
index fa9a4eec9e2..9550874d865 100644
--- a/htdocs/langs/en_US/main.lang
+++ b/htdocs/langs/en_US/main.lang
@@ -575,6 +575,7 @@ CanBeModifiedIfOk=Can be modified if valid
 CanBeModifiedIfKo=Can be modified if not valid
 ValueIsValid=Value is valid
 ValueIsNotValid=Value is not valid
+RecordCreatedSuccessfully=Record created successfully
 RecordModifiedSuccessfully=Record modified successfully
 RecordsModified=%s record modified
 RecordsDeleted=%s record deleted
@@ -717,6 +718,7 @@ DeleteLine=Delete line
 ConfirmDeleteLine=Are you sure you want to delete this line?
 NoPDFAvailableForDocGenAmongChecked=No PDF were available for the document generation among checked records
 TooManyRecordForMassAction=Too many record selected for mass action. The action is restricted to a list of %s records.
+NoRecordSelected=No record were selected
 MassFilesArea=Area for files built by mass actions
 ShowTempMassFilesArea=Show area of files built by mass actions
 RelatedObjects=Related Objects
diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php
index 568d7edf1de..eb5c2a2d75d 100644
--- a/htdocs/product/class/product.class.php
+++ b/htdocs/product/class/product.class.php
@@ -3159,10 +3159,10 @@ class Product extends CommonObject
             $label .= '<br><b>' . $langs->trans('ProductLabel') . ':</b> ' . $this->label;
 
         $tmptext='';
-		if ($this->weight) $tmptext.="<br>".$langs->trans("Weight").': '.$this->weight.' '.measuring_units_string($this->weight_units,"weight");
-		if ($this->length) $tmptext.="<br>".$langs->trans("Length").': '.$this->length.' '.measuring_units_string($this->length_units,'length');
+		if ($this->weight)  $tmptext.="<br>".$langs->trans("Weight").': '.$this->weight.' '.measuring_units_string($this->weight_units,"weight");
+		if ($this->length)  $tmptext.="<br>".$langs->trans("Length").': '.$this->length.' '.measuring_units_string($this->length_units,'length');
 		if ($this->surface) $tmptext.="<br>".$langs->trans("Surface").': '.$this->surface.' '.measuring_units_string($this->surface_units,'surface');
-		if ($this->volume) $tmptext.="<br>".$langs->trans("Volume").': '.$this->volume.' '.measuring_units_string($this->volume_units,'volume');
+		if ($this->volume)  $tmptext.="<br>".$langs->trans("Volume").': '.$this->volume.' '.measuring_units_string($this->volume_units,'volume');
         if ($tmptext) $label .= $tmptext;
 
         if (! empty($this->entity))
-- 
GitLab