diff --git a/htdocs/accountancy/admin/export.php b/htdocs/accountancy/admin/export.php
index c0a987ddf82d1ff65f14aa162ad68ae57750f971..9f060179910d8450f4c72b93b6e6c6f349422ffe 100644
--- a/htdocs/accountancy/admin/export.php
+++ b/htdocs/accountancy/admin/export.php
@@ -206,7 +206,8 @@ else
 	print '<td>';
 	$listmodelcsv=array(
 		'1'=>$langs->trans("Modelcsv_normal"),
-		'2'=>$langs->trans("Modelcsv_CEGID")
+		'2'=>$langs->trans("Modelcsv_CEGID"),
+		'3'=>$langs->trans("Modelcsv_COALA")
 	);
 	print $form->selectarray("modelcsv",$listmodelcsv,$conf->global->ACCOUNTING_EXPORT_MODELCSV,0);
 
diff --git a/htdocs/accountancy/bookkeeping/card.php b/htdocs/accountancy/bookkeeping/card.php
index 77c9a4a135e59184e222d8edf6fa4287ae6a7859..86aca8b8af4430fdbd59078bf1804c14ddab5fc8 100644
--- a/htdocs/accountancy/bookkeeping/card.php
+++ b/htdocs/accountancy/bookkeeping/card.php
@@ -91,7 +91,7 @@ if ($action == "confirm_update") {
                 $book->sens = 'C';
             }
 
-            $result = $book->update();
+			$result = $book->update($user);
             if ($result < 0) {
                 setEventMessages($book->error, $book->errors, 'errors');
             } else {
@@ -136,7 +136,7 @@ else if ($action == "add") {
             $book->sens = 'C';
         }
 
-        $result = $book->create_std($user);
+        $result = $book->createStd($user);
         if ($result < 0) {
             setEventMessages($book->error, $book->errors, 'errors');
         } else {
@@ -180,7 +180,7 @@ else if ($action == "confirm_create") {
 
     $book->montant = 0;
 
-    $result = $book->create_std($user);
+    $result = $book->createStd($user);
     if ($result < 0) {
         setEventMessages($book->error, $book->errors, 'errors');
     } else {
@@ -214,6 +214,18 @@ if ($action == 'create') {
             $conf->global->ACCOUNTING_EXPENSEREPORT_JOURNAL => $conf->global->ACCOUNTING_EXPENSEREPORT_JOURNAL
     );
 
+    $sql = 'SELECT DISTINCT accountancy_journal FROM '.MAIN_DB_PREFIX.'bank_account WHERE clos=0';
+    $resql=$db->query($sql);
+    if (!$resql) {
+    	setEventMessages($db->lasterror,null,'errors');
+    } else {
+    	while ($obj_bank=$db->fetch_object($resql)) {
+    		if (!empty($obj_bank->accountancy_journal)) {
+    			$code_journal_array[$obj_bank->accountancy_journal]=$obj_bank->accountancy_journal;
+    		}
+    	}
+    }
+
     $book = new BookKeeping($db);
     $next_num_mvt = $book->getNextNumMvt();
 
@@ -259,7 +271,7 @@ if ($action == 'create') {
     print '</form>';
 } else {
     $book = new BookKeeping($db);
-    $result = $book->fetch_per_mvt($piece_num);
+    $result = $book->fetchPerMvt($piece_num);
     if ($result < 0) {
         setEventMessages($book->error, $book->errors, 'errors');
     }
diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php
index c5fea407a1200c1540412223692aca91d170d280..c517df2d1298274809a5922e644b6928b4738401 100644
--- a/htdocs/accountancy/bookkeeping/list.php
+++ b/htdocs/accountancy/bookkeeping/list.php
@@ -38,31 +38,149 @@ $page = GETPOST("page");
 $sortorder = GETPOST("sortorder");
 $sortfield = GETPOST("sortfield");
 $action = GETPOST('action', 'alpha');
+$search_mvt_num = GETPOST('search_mvt_num', 'int');
 $search_doc_type = GETPOST("search_doc_type");
 $search_doc_ref = GETPOST("search_doc_ref");
-$search_account = GETPOST("search_account");
-$search_thirdparty = GETPOST("search_thirdparty");
-$search_journal = GETPOST("search_journal");
-$limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
+$search_date_start = dol_mktime(0, 0, 0, GETPOST('date_startmonth', 'int'), GETPOST('date_startday', 'int'), GETPOST('date_startyear', 'int'));
+$search_date_end = dol_mktime(0, 0, 0, GETPOST('date_endmonth', 'int'), GETPOST('date_endday', 'int'), GETPOST('date_endyear', 'int'));
+$search_doc_date = dol_mktime(0, 0, 0, GETPOST('doc_datemonth', 'int'), GETPOST('doc_dateday', 'int'), GETPOST('doc_dateyear', 'int'));
+
+if (GETPOST("button_delmvt_x") || GETPOST("button_delmvt")) {
+	$action='delbookkeepingyear';
+}
+if (GETPOST("button_export_csv_x") || GETPOST("button_export_csv")) {
+	$action='export_csv';
+}
+
+$search_accountancy_code = GETPOST("search_accountancy_code");
+
+$search_accountancy_code_start = GETPOST('search_accountancy_code_start', 'alpha');
+if ($search_accountancy_code_start == - 1) {
+	$search_accountancy_code_start = '';
+}
+$search_accountancy_code_end = GETPOST('search_accountancy_code_end', 'alpha');
+if ($search_accountancy_code_end == - 1) {
+	$search_accountancy_code_end = '';
+}
+
+$search_accountancy_aux_code = GETPOST("search_accountancy_aux_code");
+
+$search_accountancy_aux_code_start = GETPOST('search_accountancy_aux_code_start', 'alpha');
+if ($search_accountancy_aux_code_start == - 1) {
+	$search_accountancy_aux_code_start = '';
+}
+$search_accountancy_aux_code_end = GETPOST('search_accountancy_aux_code_end', 'alpha');
+if ($search_accountancy_aux_code_end == - 1) {
+	$search_accountancy_aux_code_end = '';
+}
+$search_mvt_label = GETPOST('search_mvt_label', 'alpha');
+$search_direction = GETPOST('search_direction', 'alpha');
+$search_ledger_code = GETPOST('search_ledger_code', 'alpha');
+
+$limit = GETPOST('limit') ? GETPOST('limit', 'int') : $conf->liste_limit;
+
 
-if ($sortorder == "")
-	$sortorder = "ASC";
-if ($sortfield == "")
-	$sortfield = "bk.rowid";
 
 $offset = $limit * $page;
 
+$object = new BookKeeping($db);
+
 $formventilation = new FormVentilation($db);
 $formother = new FormOther($db);
+$form = new Form($db);
 
 if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers
 {
-	$search_piece_num = "";
-	$search_doc_ref = "";
-	$search_account = "";
-	$search_thirdparty = "";
-	$search_journal = "";
+	$search_mvt_num = '';
+	$search_doc_type = '';
+	$search_doc_ref = '';
+	$search_doc_date = '';
+	$search_accountancy_code = '';
+	$search_accountancy_code_start = '';
+	$search_accountancy_code_end = '';
+	$search_accountancy_aux_code = '';
+	$search_accountancy_aux_code_start = '';
+	$search_accountancy_aux_code_end = '';
+	$search_mvt_label = '';
+	$search_direction = '';
+	$search_ledger_code = '';
+	$search_date_start = '';
+	$search_date_end = '';
+}
+
+if (empty($search_date_start)) {
+	$search_date_start = dol_mktime(0, 0, 0, 1, 1, dol_print_date(dol_now(), '%Y'));
+	$search_date_end = dol_mktime(0, 0, 0, 12, 31, dol_print_date(dol_now(), '%Y'));
+}
+if ($sortorder == "")
+	$sortorder = "ASC";
+	if ($sortfield == "")
+		$sortfield = "t.rowid";
+
+
+$options = '';
+$filter = array ();
+if (! empty($search_date_start)) {
+	$filter['t.doc_date>='] = $search_date_start;
+	$options .= '&amp;date_startmonth=' . GETPOST('date_startmonth', 'int') . '&amp;date_startday=' . GETPOST('date_startday', 'int') . '&amp;date_startyear=' . GETPOST('date_startyear', 'int');
+}
+if (! empty($search_date_end)) {
+	$filter['t.doc_date<='] = $search_date_end;
+	$options .= '&amp;date_endmonth=' . GETPOST('date_endmonth', 'int') . '&amp;date_endday=' . GETPOST('date_endday', 'int') . '&amp;date_endyear=' . GETPOST('date_endyear', 'int');
+}
+if (! empty($search_doc_type)) {
+	$filter['t.doc_type'] = $search_doc_type;
+	$options .= '&amp;search_doc_type=' . $search_doc_type;
 }
+if (! empty($search_doc_date)) {
+	$filter['t.doc_date'] = $search_doc_date;
+	$options .= '&amp;doc_datemonth=' . GETPOST('doc_datemonth', 'int') . '&amp;doc_dateday=' . GETPOST('doc_dateday', 'int') . '&amp;doc_dateyear=' . GETPOST('doc_dateyear', 'int');
+}
+if (! empty($search_doc_ref)) {
+	$filter['t.doc_ref'] = $search_doc_ref;
+	$options .= '&amp;search_doc_ref=' . $search_doc_ref;
+}
+if (! empty($search_accountancy_code)) {
+	$filter['t.numero_compte'] = $search_accountancy_code;
+	$options .= '&amp;search_accountancy_code=' . $search_accountancy_code;
+}
+if (! empty($search_accountancy_code_start)) {
+	$filter['t.numero_compte>='] = $search_accountancy_code_start;
+	$options .= '&amp;search_accountancy_code_start=' . $search_accountancy_code_start;
+}
+if (! empty($search_accountancy_code_end)) {
+	$filter['t.numero_compte<='] = $search_accountancy_code_end;
+	$options .= '&amp;search_accountancy_code_end=' . $search_accountancy_code_end;
+}
+if (! empty($search_accountancy_aux_code)) {
+	$filter['t.code_tiers'] = $search_accountancy_aux_code;
+	$options .= '&amp;search_accountancy_aux_code=' . $search_accountancy_aux_code;
+}
+if (! empty($search_accountancy_aux_code_start)) {
+	$filter['t.code_tiers>='] = $search_accountancy_aux_code_start;
+	$options .= '&amp;search_accountancy_aux_code_start=' . $search_accountancy_aux_code_start;
+}
+if (! empty($search_accountancy_aux_code_end)) {
+	$filter['t.code_tiers<='] = $search_accountancy_aux_code_end;
+	$options .= '&amp;search_accountancy_aux_code_end=' . $search_accountancy_aux_code_end;
+}
+if (! empty($search_mvt_label)) {
+	$filter['t.label_compte'] = $search_mvt_label;
+	$options .= '&amp;search_mvt_label=' . $search_mvt_label;
+}
+if (! empty($search_direction)) {
+	$filter['t.sens'] = $search_direction;
+	$options .= '&amp;search_direction=' . $search_direction;
+}
+if (! empty($search_ledger_code)) {
+	$filter['t.code_journal'] = $search_ledger_code;
+	$options .= '&amp;search_ledger_code=' . $search_ledger_code;
+}
+if (! empty($search_mvt_num)) {
+	$filter['t.piece_num'] = $search_mvt_num;
+	$options .= '&amp;search_mvt_num=' . $search_mvt_num;
+}
+
 
 /*
  * Action
@@ -72,96 +190,106 @@ if ($action == 'delbookkeeping') {
 	$import_key = GETPOST('importkey', 'alpha');
 	
 	if (! empty($import_key)) {
-		$object = new BookKeeping($db);
-		$result = $object->delete_by_importkey($import_key);
-		Header("Location: list.php");
+		$result = $object->deleteByImportkey($import_key);
 		if ($result < 0) {
 			setEventMessages($object->error, $object->errors, 'errors');
 		}
+		Header("Location: list.php");
+		exit();
 	}
-} elseif ($action == 'delbookkeepingyear') {
+} elseif ($action == 'delbookkeepingyearconfirm') {
 	
 	$delyear = GETPOST('delyear', 'int');
 	
 	if (! empty($delyear)) {
-		$object = new BookKeeping($db);
-		$result = $object->delete_by_year($delyear);
-		Header("Location: list.php");
+		$result = $object->deleteByYear($delyear);
 		if ($result < 0) {
 			setEventMessages($object->error, $object->errors, 'errors');
 		}
+		Header("Location: list.php");
+		exit();
 	}
-} elseif ($action == 'delbookkeepingyear') {
+} elseif ($action == 'delmouvconfirm') {
 	
-	$delyear = GETPOST('delyear', 'int');
+	$mvt_num = GETPOST('mvt_num', 'int');
 	
-	if (! empty($delyear)) {
-		$object = new BookKeeping($db);
-		$result = $object->delete_by_year($delyear);
-		Header("Location: list.php");
+	if (! empty($mvt_num)) {
+		$result = $object->deleteMvtNum($mvt_num);
 		if ($result < 0) {
 			setEventMessages($object->error, $object->errors, 'errors');
 		}
+		//if (!empty($options)) {
+		//	Header("Location: list.php?".urldecode($options));
+		//} else {
+			Header("Location: list.php");
+		//}
+		exit();
 	}
-}  // Export
-else if ($action == 'export_csv') {
+} elseif ($action == 'export_csv') {
+	$sep = $conf->global->ACCOUNTING_EXPORT_SEPARATORCSV;
+	$journal = 'bookkepping';
 	
-	header('Content-Type: text/csv');
-	header('Content-Disposition: attachment;filename=export_csv.csv');
+	include DOL_DOCUMENT_ROOT.'/accountancy/tpl/export_journal.tpl.php';
 	
-	$object = new BookKeeping($db);
-	$result = $object->export_bookkeping('ebp');
+	$result = $object->fetchAll($sortorder, $sortfield, 0, 0, $filter);
 	if ($result < 0) {
 		setEventMessages($object->error, $object->errors, 'errors');
 	}
 	
-	// Model classic Export
-	if ($conf->global->ACCOUNTING_EXPORT_MODELCSV == 1) {
-		
-		foreach ( $object->linesexport as $line ) {
-			print '"' . dol_print_date($line->doc_date, '%d%m%Y') . '",';
-			print '"' . $line->code_journal . '",';
-			print '"' . $line->numero_compte . '",';
-			print '"' . substr($line->code_journal, 0, 2) . '",';
-			print '"' . substr($line->doc_ref, 0, 40) . '",';
-			print '"' . $line->num_piece . '",';
-			print '"' . $line->debit . '",';
-			print '"' . $line->credit . '",';
-			print '"' . $conf->currency . '",';
+	foreach ( $object->lines as $line ) {
+	
+		if ($conf->global->ACCOUNTING_EXPORT_MODELCSV == 2) 	
+		{
+			$sep = ";";
+			// Model Cegid Expert Export
+			$date = dol_print_date($line->doc_date, '%d%m%Y');
+			print $date . $sep;
+			print $line->code_journal . $sep;
+			print length_accountg($line->numero_compte) . $sep;
+			print ' '. $sep;
+			print $line->sens . $sep;
+			print price($line->montant) . $sep;
+			print dol_trunc($line->label_compte, 32) . $sep;
+			print $line->doc_ref . $sep;
+			
+			/*print $line->piece_num . $sep;
+			print length_accounta($line->code_tiers) . $sep;
+			print  . $sep;
+			print price($line->debit) . $sep;
+			print price($line->credit) . $sep;*/
+			
 			print "\n";
 		}
-	}
-	// Model cegid Export
-	if ($conf->global->ACCOUNTING_EXPORT_MODELCSV == 2) {
-		foreach ( $object->linesexport as $line ) {
-			print $line->id . ',';
-			print '"' . dol_print_date($line->doc_date, '%d%m%Y') . '",';
-			print '"' . $line->code_journal . '",';
-			print '"' . $line->numero_compte . '",';
-			print '"' . substr($line->code_journal, 0, 2) . '",';
-			print '"' . substr($line->doc_ref, 0, 40) . '",';
-			print '"' . $line->num_piece . '",';
-			print '"' . $line->montant . '",';
-			print '"' . $line->sens . '",';
-			print '"' . dol_print_date($line->doc_date, '%d%m%Y') . '",';
-			print '"' . $conf->currency . '",';
+		elseif ($conf->global->ACCOUNTING_EXPORT_MODELCSV == 1) {
+			
+			//Std export
+			$date = dol_print_date($line->doc_date, $conf->global->ACCOUNTING_EXPORT_DATE);
+			print $date . $sep;
+			print $line->doc_ref . $sep;
+			print length_accounta($line->numero_compte) . $sep;
+			print length_accountg($line->code_tiers) . $sep;
+			print price($line->debit) . $sep;
+			print price($line->credit) . $sep;
+			
+			/*print $line->piece_num . $sep;
+			print $line->label_compte . $sep;
+			print price($line->montant) . $sep;
+			print $line->sens . $sep;*/
+			print $line->code_journal . $sep;
 			print "\n";
-		}
-	}
-	// Model Coala Export
-	if ($conf->global->ACCOUNTING_EXPORT_MODELCSV == 3) {
-		foreach ( $object->linesexport as $line ) {
-			print $line->id . ',';
-			print '"' . dol_print_date($line->doc_date, '%d%m%Y') . '",';
-			print '"' . $line->code_journal . '",';
-			print '"' . $line->numero_compte . '",';
-			print '"' . substr($line->code_journal, 0, 2) . '",';
-			print '"' . substr($line->doc_ref, 0, 40) . '",';
-			print '"' . $line->num_piece . '",';
-			print '"' . $line->montant . '",';
-			print '"' . $line->sens . '",';
-			print '"' . dol_print_date($line->doc_date, '%d%m%Y') . '",';
-			print '"' . $conf->currency . '",';
+		}elseif ($conf->global->ACCOUNTING_EXPORT_MODELCSV == 3) {
+			
+			//Coala export
+			$date = dol_print_date($line->doc_date, '%d/%m/%Y');
+			print $date . $sep;
+			print $line->code_journal . $sep;
+			print length_accounta($line->numero_compte) . $sep;
+			print $line->piece_num . $sep;
+			print $line->doc_ref . $sep;
+			print price($line->debit) . $sep;
+			print price($line->credit) . $sep;
+			print 'E' . $sep;
+			print length_accountg($line->code_tiers) . $sep;
 			print "\n";
 		}
 	}
@@ -169,156 +297,199 @@ else if ($action == 'export_csv') {
 
 else {
 	
-	llxHeader('', $langs->trans("Bookkeeping"));
+	$title_page=$langs->trans("Bookkeeping") .' '. dol_print_date($search_date_start).'-'.dol_print_date($search_date_end);
+	
+	llxHeader('', $title_page);
 	
 	/*
 	 * List
 	 */
 	
-	$sql = "SELECT bk.rowid, bk.doc_date, bk.doc_type, bk.doc_ref, bk.code_tiers, bk.numero_compte , bk.label_compte, bk.debit , bk.credit, bk.montant , bk.sens , bk.code_journal , bk.piece_num ";
-	$sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping as bk";
-	
-	if (dol_strlen(trim($search_doc_type))) {
-		
-		$sql .= " WHERE bk.piece_num LIKE '%" . $search_piece_num . "%'";
-		
-		if (dol_strlen(trim($search_doc_ref))) {
-			$sql .= " AND bk.doc_ref LIKE '%" . $search_doc_ref . "%'";
+	$nbtotalofrecords = 0;
+	if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
+		$nbtotalofrecords = $object->fetchAll($sortorder, $sortfield, 0, 0, $filter);
+		if ($nbtotalofrecords < 0) {
+			setEventMessages($object->error, $object->errors, 'errors');
 		}
 	}
-	if (dol_strlen(trim($search_doc_ref))) {
-		$sql .= " WHERE bk.doc_ref LIKE '%" . $search_doc_ref . "%'";
-	}
-	if (dol_strlen(trim($search_account))) {
-		$sql .= " WHERE bk.numero_compte LIKE '%" . $search_account . "%'";
-	}
-	if (dol_strlen(trim($search_thirdparty))) {
-		$sql .= " WHERE bk.code_tiers LIKE '%" . $search_thirdparty . "%'";
-	}
-	if (dol_strlen(trim($search_journal))) {
-		$sql .= " WHERE bk.code_journal LIKE '%" . $search_journal . "%'";
-	}
 	
-	$sql .= " ORDER BY $sortfield $sortorder " . $db->plimit($conf->liste_limit + 1, $offset);
+	$result = $object->fetchAll($sortorder, $sortfield, $limit, $offset, $filter);
+	if ($result < 0) {
+		setEventMessages($object->error, $object->errors, 'errors');
+	}
 	
-	dol_syslog('accountancy/bookkeeping/list.php:: $sql=' . $sql);
-	$resql = $db->query($sql);
-	if ($resql) {
-		$num = $db->num_rows($resql);
-		$i = 0;
-		
-		print_barre_liste($langs->trans("Bookkeeping"), $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, '', $num);
-		
-		/*print '<form name="add" action="' . $_SERVER["PHP_SELF"] . '" method="POST">';
-		 print '<input type="hidden" name="token" value="' . $_SESSION['newtoken'] . '">';
-		 print '<input type="hidden" name="action" value="delbookkeeping">';
-		 
-		 print $formventilation->select_bookkeeping_importkey('importkey', GETPOST('importkey'));
-		 
-		 print '<div class="inline-block divButAction"><input type="submit" class="butAction" value="' . $langs->trans("DelBookKeeping") . '" /></div>';
-		 
-		 print '</form>';*/
+	if ($action == 'delmouv') {
+		$formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?mvt_num=' . GETPOST('mvt_num'), $langs->trans('DeleteMvt'), $langs->trans('ConfirmDeleteMvt'), 'delmouvconfirm', '', 0, 1);
+		print $formconfirm;
+	}
+	if ($action == 'delbookkeepingyear') {
 		
-		print '<form name="add" action="' . $_SERVER["PHP_SELF"] . '" method="POST">';
-		print '<input type="hidden" name="token" value="' . $_SESSION['newtoken'] . '">';
-		print '<input type="hidden" name="action" value="delbookkeepingyear">';
+		$form_question=array();
+		$delyear=GETPOST('delyear');
 		
-		print $formother->select_year(GETPOST('delyear'), 'delyear');
+		if (empty($delyear)) {
+			$delyear=dol_print_date(dol_now(),'%Y');
+		}
+		$year_array=$formventilation->selectyear_accountancy_bookkepping($delyear, 'delyear',0,'array');
 		
-		print '<div class="inline-block divButAction"><input type="submit" class="butAction" value="' . $langs->trans("DelBookKeeping") . '" /></div>';
+		$form_question['delyear']=array('name'=>'delyear','type'=>'select','label'=>$langs->trans('DelYear'),'values'=>$year_array,'default'=>$delyear);
 		
-		print '</form>';
+		$formconfirm = $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans('DeleteMvt'), $langs->trans('ConfirmDeleteMvt'), 'delbookkeepingyearconfirm', $form_question, 0, 1);
+		print $formconfirm;
+	}
+	
+	print_barre_liste($title_page, $page, $_SERVER["PHP_SELF"], $options, $sortfield, $sortorder, '', $result, $nbtotalofrecords);
+	
+	/*print '<form name="add" action="' . $_SERVER["PHP_SELF"] . '" method="POST">';
+	 print '<input type="hidden" name="token" value="' . $_SESSION['newtoken'] . '">';
+	 print '<input type="hidden" name="action" value="delbookkeeping">';
+	 
+	 print $formventilation->select_bookkeeping_importkey('importkey', GETPOST('importkey'));
+	 
+	 print '<div class="inline-block divButAction"><input type="submit" class="butAction" value="' . $langs->trans("DelBookKeeping") . '" /></div>';
+	 
+	 print '</form>';*/
+	
+	print '<form method="GET" id="searchFormList" action="' . $_SERVER["PHP_SELF"] . '">';
+	print '<div class="tabsAction">'."\n";
+	print '<div class="inline-block divButAction"><input type="submit"  name="button_delmvt" class="butAction" value="' . $langs->trans("DelBookKeeping") . '" /></div>';
+	print '<a class="butAction" href="./card.php?action=create">' . $langs->trans("NewAccountingMvt") . '</a>';
+	//print '<a class="butAction" href="' . $_SERVER['PHP_SELF'] . '?action=export_csv">' . $langs->trans("Export") . '</a>';
+	print '<div class="inline-block divButAction"><input type="submit" name="button_export_csv" class="butAction" value="' . $langs->trans("Export") . '" /></div>';
+	
+	print '</div>';
+	
+	
+	/*print '<div class="liste_titre">';
+	print $langs->trans('DateStart') . ': ';
+	print $form->select_date($search_date_start, 'date_start', 0, 0, 1);
+	print $langs->trans('DateEnd') . ': ';
+	print $form->select_date($search_date_end, 'date_end', 0, 0, 1);
+	print '</div>';
+	print '<div class="liste_titre">';
+	print $langs->trans('From') . ' ' . $langs->trans('AccountAccounting') . ': ';
+	print $formventilation->select_account($search_accountancy_code_start, 'search_accountancy_code_start', 1, array (), 1, 1, '');
+	print $langs->trans('To') . ' ' . $langs->trans('AccountAccounting') . ': ';
+	print $formventilation->select_account($search_accountancy_code_end, 'search_accountancy_code_end', 1, array (), 1, 1, '');
+	print '</div>';
+	print '<div class="liste_titre">';
+	print $langs->trans('From') . ' ' . $langs->trans('ThirdPartyAccount') . ': ';
+	print $formventilation->select_auxaccount($search_accountancy_aux_code_start, 'search_accountancy_aux_code_start', 1);
+	print $langs->trans('To') . ' ' . $langs->trans('ThirdPartyAccount') . ': ';
+	print $formventilation->select_auxaccount($search_accountancy_aux_code_end, 'search_accountancy_aux_code_end', 1);
+	print '</div>';*/
+	
+	print '<table class="noborder" width="100%">';
+	print '<tr class="liste_titre">';
+	print_liste_field_titre($langs->trans("NumPiece"), $_SERVER['PHP_SELF'], "t.piece_num", "", $options, "", $sortfield, $sortorder);
+	print_liste_field_titre($langs->trans("Docdate"), $_SERVER['PHP_SELF'], "t.doc_date", "", $options, "", $sortfield, $sortorder);
+	print_liste_field_titre($langs->trans("Docref"), $_SERVER['PHP_SELF'], "t.doc_ref", "", $options, "", $sortfield, $sortorder);
+	print_liste_field_titre($langs->trans("Numerocompte"), $_SERVER['PHP_SELF'], "t.numero_compte", "", $options, "", $sortfield, $sortorder);
+	print_liste_field_titre($langs->trans("Code_tiers"), $_SERVER['PHP_SELF'], "t.code_tiers", "", $options, "", $sortfield, $sortorder);
+	print_liste_field_titre($langs->trans("Labelcompte"), $_SERVER['PHP_SELF'], "bk_label_compte", "", $options, "", $sortfield, $sortorder);
+	print_liste_field_titre($langs->trans("Debit"), $_SERVER['PHP_SELF'], "t.debit", "", $options, 'align="right"', $sortfield, $sortorder);
+	print_liste_field_titre($langs->trans("Credit"), $_SERVER['PHP_SELF'], "t.credit", "", $options, 'align="right"', $sortfield, $sortorder);
+	//print_liste_field_titre($langs->trans("Amount"), $_SERVER['PHP_SELF'], "t.montant", "", $options, 'align="center"', $sortfield, $sortorder);
+	//print_liste_field_titre($langs->trans("Sens"), $_SERVER['PHP_SELF'], "t.sens", "", $options, 'align="center"', $sortfield, $sortorder);
+	print_liste_field_titre($langs->trans("Codejournal"), $_SERVER['PHP_SELF'], "t.code_journal", "", $options, 'align="right"', $sortfield, $sortorder);
+	print_liste_field_titre($langs->trans("Action"), $_SERVER["PHP_SELF"], "", $options, "", 'width="60" align="center"', $sortfield, $sortorder);
+	print "</tr>\n";
+	
+	print '<tr class="liste_titre">';
+	print '<form action="' . $_SERVER["PHP_SELF"] . '" method="GET">';
+	print '<td><input type="text" name="search_mvt_num" size="8" value="' . $search_mvt_num . '"></td>';
+	print '<td class="liste_titre">';
+	print $langs->trans('From') . ': ';
+	print $form->select_date($search_date_start, 'date_start', 0, 0, 1);
+	print '<br>';
+	print $langs->trans('To') . ': ';
+	print $form->select_date($search_date_end, 'date_end', 0, 0, 1);
+	//print $form->select_date($search_doc_date, 'doc_date', 0, 0, 1);
+	print '</td>';
+	print '<td><input type="text" name="search_doc_ref" size="8" value="' . $search_doc_ref . '"></td>';
+	print '<td>';
+	//print $langs->trans('From') . ' ' . $langs->trans('AccountAccounting') . ': ';
+	print $langs->trans('From');
+	print $formventilation->select_account($search_accountancy_code_start, 'search_accountancy_code_start', 1, array (), 1, 1, '');
+	//print $langs->trans('To') . ' ' . $langs->trans('AccountAccounting') . ': ';
+	print '<br>';
+	print $langs->trans('To');
+	print $formventilation->select_account($search_accountancy_code_end, 'search_accountancy_code_end', 1, array (), 1, 1, '');
+	print '</td>';
+	//print '<td><input type="text" name="search_accountancy_code" size="8" value="' . $search_accountancy_code . '"></td>';
+	print '<td>';
+	//print $langs->trans('From') . ' ' . $langs->trans('ThirdPartyAccount') . ': ';
+	print $langs->trans('From');
+	print $formventilation->select_auxaccount($search_accountancy_aux_code_start, 'search_accountancy_aux_code_start', 1);
+	//print $langs->trans('To') . ' ' . $langs->trans('ThirdPartyAccount') . ': ';
+	print '<br>';
+	print $langs->trans('To');
+	print $formventilation->select_auxaccount($search_accountancy_aux_code_end, 'search_accountancy_aux_code_end', 1);
+	print '</td>';
+	//print '<td><input type="text" name="search_accountancy_aux_code" size="8" value="' . $search_accountancy_aux_code . '"></td>';
+	
+	print '<td class="liste_titre">';
+	print '<input type="text" size=6 class="flat" name="search_mvt_label" value="'.$search_mvt_label.'"/>';
+	print '</td>';
+	print '<td>&nbsp;</td>';
+	print '<td>&nbsp;</td>';
+	//print '<td>&nbsp;</td>';
+	//print '<td>&nbsp;</td>';
+	print '<td  align="right"><input type="text" name="search_ledger_code" size="3" value="' . $search_ledger_code . '"></td>';
+	print '<td align="right" colspan="2" class="liste_titre">';
+	print '<input type="image" class="liste_titre" src="' . img_picto($langs->trans("Search"), 'search.png', '', '', 1) . '" name="button_search" value="' . dol_escape_htmltag($langs->trans("Search")) . '" title="' . dol_escape_htmltag($langs->trans("Search")) . '">';
+	print '&nbsp;';
+	print '<input type="image" class="liste_titre" src="' . img_picto($langs->trans("Search"), 'searchclear.png', '', '', 1) . '" name="button_removefilter" value="' . dol_escape_htmltag($langs->trans("RemoveFilter")) . '" title="' . dol_escape_htmltag($langs->trans("RemoveFilter")) . '">';
+	print '</td>';
+	
+	print '</tr>';
+	
+	$var = True;
+	
+	$total_debit=0;
+	$total_credit=0;
+	
+	foreach ( $object->lines as $line ) {
+		$var = ! $var;
 		
-		print '<form name="add" action="' . $_SERVER["PHP_SELF"] . '" method="POST">';
-		print '<input type="hidden" name="token" value="' . $_SESSION['newtoken'] . '">';
-		print '<input type="hidden" name="action" value="export_csv">';
-		print '<input type="submit" class="button" style="float: right;" value="' . $langs->trans("Export") . '" onclick="launch_export();" />';
-		print '</form>';
+		$total_debit+=$line->debit;
+		$total_credit+=$line->credit;
 		
-		print '<table class="noborder" width="100%">';
-		print '<tr class="liste_titre">';
-		print_liste_field_titre($langs->trans("NumPiece"), $_SERVER['PHP_SELF'], "bk.piece_num", "", "", "", $sortfield, $sortorder);
-		print_liste_field_titre($langs->trans("Docdate"), $_SERVER['PHP_SELF'], "bk.doc_date", "", "", "", $sortfield, $sortorder);
-		print_liste_field_titre($langs->trans("Docref"), $_SERVER['PHP_SELF'], "bk.doc_ref", "", "", "", $sortfield, $sortorder);
-		print_liste_field_titre($langs->trans("Numerocompte"), $_SERVER['PHP_SELF'], "bk.numero_compte", "", "", "", $sortfield, $sortorder);
-		print_liste_field_titre($langs->trans("Code_tiers"), $_SERVER['PHP_SELF'], "bk.code_tiers", "", "", "", $sortfield, $sortorder);
-		print_liste_field_titre($langs->trans("Labelcompte"), $_SERVER['PHP_SELF'], "bk_label_compte", "", "", "", $sortfield, $sortorder);
-		print_liste_field_titre($langs->trans("Debit"), $_SERVER['PHP_SELF'], "bk.debit", "", "", 'align="center"', $sortfield, $sortorder);
-		print_liste_field_titre($langs->trans("Credit"), $_SERVER['PHP_SELF'], "bk.credit", "", "", 'align="center"', $sortfield, $sortorder);
-		print_liste_field_titre($langs->trans("Amount"), $_SERVER['PHP_SELF'], "bk.montant", "", "", 'align="center"', $sortfield, $sortorder);
-		print_liste_field_titre($langs->trans("Sens"), $_SERVER['PHP_SELF'], "bk.sens", "", "", 'align="center"', $sortfield, $sortorder);
-		print_liste_field_titre($langs->trans("Codejournal"), $_SERVER['PHP_SELF'], "bk.code_journal", "", "", "", $sortfield, $sortorder);
-		print_liste_field_titre($langs->trans("Action"), $_SERVER["PHP_SELF"], "", $param, "", 'width="60" align="center"', $sortfield, $sortorder);
-		print "</tr>\n";
+		print "<tr $bc[$var]>";
 		
-		print '<tr class="liste_titre">';
-		print '<form action="' . $_SERVER["PHP_SELF"] . '" method="GET">';
-		print '<td><input type="text" name="search_doc_type" size="8" value="' . $search_piece_num . '"></td>';
-		print '<td>&nbsp;</td>';
-		print '<td><input type="text" name="search_doc_ref" size="8" value="' . $search_doc_ref . '"></td>';
-		print '<td><input type="text" name="search_account" size="8" value="' . $search_account . '"></td>';
-		print '<td><input type="text" name="search_thirdparty" size="8" value="' . $search_thirdparty . '"></td>';
-		print '<td>&nbsp;</td>';
-		print '<td>&nbsp;</td>';
-		print '<td>&nbsp;</td>';
-		print '<td>&nbsp;</td>';
-		print '<td>&nbsp;</td>';
-		print '<td><input type="text" name="search_journal" size="3" value="' . $search_journal . '"></td>';
-		print '<td align="right" colspan="2" class="liste_titre">';
-		print '<input type="image" class="liste_titre" src="' . img_picto($langs->trans("Search"), 'search.png', '', '', 1) . '" name="button_search" value="' . dol_escape_htmltag($langs->trans("Search")) . '" title="' . dol_escape_htmltag($langs->trans("Search")) . '">';
-		print '&nbsp;';
-		print '<input type="image" class="liste_titre" src="' . img_picto($langs->trans("Search"), 'searchclear.png', '', '', 1) . '" name="button_removefilter" value="' . dol_escape_htmltag($langs->trans("RemoveFilter")) . '" title="' . dol_escape_htmltag($langs->trans("RemoveFilter")) . '">';
+		print '<td><a href="./card.php?piece_num=' . $line->piece_num . '">' . $line->piece_num . '</a></td>';
+		print '<td align="center">' . dol_print_date($line->doc_date, 'day') . '</td>';
+		print '<td>' . $line->doc_ref . '</td>';
+		print '<td>' . length_accountg($line->numero_compte) . '</td>';
+		print '<td>' . length_accounta($line->code_tiers) . '</td>';
+		print '<td>' . $line->label_compte . '</td>';
+		print '<td align="right">' . price($line->debit) . '</td>';
+		print '<td align="right">' . price($line->credit) . '</td>';
+		//print '<td align="right">' . price($line->montant) . '</td>';
+		//print '<td align="center">' . $line->sens . '</td>';
+		print '<td align="right">' . $line->code_journal . '</td>';
+		print '<td align="center">';
+		print '<a href="./card.php?piece_num=' . $line->piece_num . '">' . img_edit() . '</a>';
+		print '<a href="' . $_SERVER['PHP_SELF'] . '?action=delmouv&mvt_num=' . $line->piece_num .$options.'&page='.$page.'">' . img_delete() . '</a>';
 		print '</td>';
-		print '</form>';
-		print '</tr>';
-		
-		$var = True;
-		
-		while ( $i < min($num, $conf->liste_limit) ) {
-			$obj = $db->fetch_object($resql);
-			$var = ! $var;
-			
-			print "<tr $bc[$var]>";
-			
-		/*	if ($old_piecenum!=$obj->piece_num) {
-				$total_debit=0;
-				$total_credit=0;
-			} else {
-				$total_debit+=$obj->debit;
-				$total_credit+=$obj->credit;
-			}
-			*/
-			
-			print '<td>' . $obj->piece_num . '</td>';
-			print '<td align="center">' . dol_print_date($db->jdate($obj->doc_date), 'day') . '</td>';
-			print '<td>' . $obj->doc_ref . '</td>';
-			print '<td>' . length_accountg($obj->numero_compte) . '</td>';
-			print '<td>' . length_accounta($obj->code_tiers) . '</td>';
-			print '<td>' . $obj->label_compte . '</td>';
-			print '<td align="right">' . price($obj->debit) . '</td>';
-			print '<td align="right">' . price($obj->credit) . '</td>';
-			print '<td align="right">' . price($obj->montant) . '</td>';
-			print '<td align="center">' . $obj->sens . '</td>';
-			print '<td>' . $obj->code_journal . '</td>';
-			print '<td align="center"><a href="./card.php?piece_num=' . $obj->piece_num . '">' . img_edit() . '</a></td>';
-			print "</tr>\n";
-			
-			//$old_piecenum= $obj->piece_num;
-			$i ++;
-		}
-		print "</table>";
-		
-		print '<div class="tabsAction">';
-		print '<a class="butAction" href="./card.php?action=create">' . $langs->trans("NewAccountingMvt") . '</a>';
-		print '</div>';
-		
-		$db->free($resql);
-	} else {
-		dol_print_error($db);
+		print "</tr>\n";
 	}
 	
+	print '<tr class="liste_total">';
+	print '<td colspan="6"></td>';
+	print '<td  align="right">';
+	print price($total_debit);
+	print '</td>';
+	print '<td  align="right">';
+	print price($total_credit);
+	print '</td>';
+	print '<td colspan="2"></td>';
+	print '</tr>';
+	
+	print "</table>";
+	print '</form>';
+	
 	llxFooter();
 }
 
-
 $db->close();
\ No newline at end of file
diff --git a/htdocs/accountancy/bookkeeping/listbyyear.php b/htdocs/accountancy/bookkeeping/listbyyear.php
index c6a267553651a32767c54dc8ec986d9d2a6090dd..ea766c16ef99253e9d95aa2b29787d3bb6d1901f 100644
--- a/htdocs/accountancy/bookkeeping/listbyyear.php
+++ b/htdocs/accountancy/bookkeeping/listbyyear.php
@@ -19,16 +19,17 @@
  */
 
 /**
- * \file		htdocs/accountancy/bookkeeping/listbyyear.php
- * \ingroup		Accounting Expert
- * \brief		Book keeping by year
+ * \file htdocs/accountancy/bookkeeping/listbyyear.php
+ * \ingroup Accounting Expert
+ * \brief Book keeping by year
  */
-
 require '../../main.inc.php';
-	
+
 // Class
-require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
-require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php';
+require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php';
+require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php';
+require_once DOL_DOCUMENT_ROOT . '/accountancy/class/bookkeeping.class.php';
+require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php';
 
 // Langs
 $langs->load("accountancy");
@@ -36,93 +37,255 @@ $langs->load("accountancy");
 $page = GETPOST("page");
 $sortorder = GETPOST("sortorder");
 $sortfield = GETPOST("sortfield");
-$limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
+$limit = GETPOST('limit') ? GETPOST('limit', 'int') : $conf->liste_limit;
+$search_date_start = dol_mktime(0, 0, 0, GETPOST('date_startmonth', 'int'), GETPOST('date_startday', 'int'), GETPOST('date_startyear', 'int'));
+$search_date_end = dol_mktime(0, 0, 0, GETPOST('date_endmonth', 'int'), GETPOST('date_endday', 'int'), GETPOST('date_endyear', 'int'));
+$search_doc_type=GETPOST('search_doc_type','alpha');
+$search_doc_date=dol_mktime(0, 0, 0, GETPOST('doc_datemonth', 'int'), GETPOST('doc_dateday', 'int'), GETPOST('doc_dateyear', 'int'));
+$search_doc_ref=GETPOST('search_doc_ref','alpha');
+$search_numero_compte=GETPOST('search_numero_compte','alpha');
+$search_numero_compte_start=GETPOST('search_numero_compte_start','alpha');
+if ($search_numero_compte_start==-1) {
+	$search_numero_compte_start='';
+}
+$search_numero_compte_end=GETPOST('search_numero_compte_end','alpha');
+if ($search_numero_compte_end==-1) {
+	$search_numero_compte_end='';
+}
+$search_code_tiers=GETPOST('search_code_tiers','alpha');
+$search_code_tiers_start=GETPOST('search_code_tiers_start','alpha');
+if ($search_code_tiers_start==-1) {
+	$search_code_tiers_start='';
+}
+$search_code_tiers_end=GETPOST('search_code_tiers_end','alpha');
+if ($search_code_tiers_end==-1) {
+	$search_code_tiers_end='';
+}
+$search_label_compte=GETPOST('search_label_compte','alpha');
+$search_sens=GETPOST('search_sens','alpha');
+$search_code_journal=GETPOST('search_code_journal','alpha');
+
+$object = new BookKeeping($db);
+$form = new Form($db);
+$formventilation = new FormVentilation($db);
 
 // Filter
-$year = GETPOST("year", 'int');
-if ($year == 0) {
-	$year_current = strftime("%Y", time());
-	$year_start = $year_current;
-} else {
-	$year_current = $year;
-	$year_start = $year;
+if (empty($search_date_start)) {
+	$search_date_start = dol_mktime(0, 0, 0, 1, 1, dol_print_date(dol_now(), '%Y'));
+	$search_date_end = dol_mktime(0, 0, 0, 12, 31, dol_print_date(dol_now(), '%Y'));
 }
-
 if ($sortorder == "")
 	$sortorder = "ASC";
 if ($sortfield == "")
-	$sortfield = "bk.rowid";
+	$sortfield = "t.rowid";
 
 $offset = $limit * $page;
 
 llxHeader('', $langs->trans("Bookkeeping"));
 
-$textprevyear = '<a href="' . $_SERVER["PHP_SELF"] . '?year=' . ($year_current - 1) . '">' . img_previous() . '</a>';
-$textnextyear = '&nbsp;<a href="' . $_SERVER["PHP_SELF"] . '?year=' . ($year_current + 1) . '">' . img_next() . '</a>';
+if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers
+{
+	$search_doc_type = "";
+	$search_doc_date = "";
+	$search_doc_ref = "";
+	$search_numero_compte = "";
+	$search_code_tiers = "";
+	$search_label_compte = "";
+	$search_sens = "";
+	$search_code_journal = "";
+}
+
+$options = '';
+$filter = array ();
+if (! empty($search_date_start)) {
+	$filter['t.doc_date>='] = $search_date_start;
+	$options .= '&amp;date_startmonth=' . GETPOST('date_startmonth', 'int') . '&amp;date_startday=' . GETPOST('date_startday', 'int') . '&amp;date_startyear=' . GETPOST('date_startyear', 'int');
+}
+if (! empty($search_date_end)) {
+	$filter['t.doc_date<='] = $search_date_end;
+	$options .= '&amp;date_endmonth=' . GETPOST('date_endmonth', 'int') . '&amp;date_endday=' . GETPOST('date_endday', 'int') . '&amp;date_endyear=' . GETPOST('date_endyear', 'int');
+}
+if (! empty($search_doc_type)) {
+	$filter['t.doc_type'] = $search_doc_type;
+	$options .= '&amp;search_doc_type=' . $search_doc_type;
+}
+if (! empty($search_doc_date)) {
+	$filter['t.doc_date'] = $search_doc_date;
+	$options .= '&amp;doc_datemonth=' . GETPOST('doc_datemonth', 'int') . '&amp;doc_dateday=' . GETPOST('doc_dateday', 'int') . '&amp;doc_dateyear=' . GETPOST('doc_dateyear', 'int');
+}
+if (! empty($search_doc_ref)) {
+	$filter['t.doc_ref'] = $search_doc_ref;
+	$options .= '&amp;search_doc_ref=' . $search_doc_ref;
+}
+if (! empty($search_numero_compte)) {
+	$filter['t.numero_compte'] = $search_numero_compte;
+	$options .= '&amp;search_numero_compte=' . $search_numero_compte;
+}
+if (! empty($search_numero_compte_start)) {
+	$filter['t.numero_compte>='] = $search_numero_compte_start;
+	$options .= '&amp;search_numero_compte_start=' . $search_numero_compte_start;
+}
+if (! empty($search_numero_compte_end)) {
+	$filter['t.numero_compte<='] = $search_numero_compte_end;
+	$options .= '&amp;search_numero_compte_end=' . $search_numero_compte_end;
+}
+if (! empty($search_code_tiers)) {
+	$filter['t.code_tiers'] = $search_code_tiers;
+	$options .= '&amp;search_code_tiers=' . $search_code_tiers;
+}
+if (! empty($search_code_tiers_start)) {
+	$filter['t.code_tiers>='] = $search_code_tiers_start;
+	$options .= '&amp;search_code_tiers_start=' . $search_code_tiers_start;
+}
+if (! empty($search_code_tiers_end)) {
+	$filter['t.code_tiers<='] = $search_code_tiers_end;
+	$options .= '&amp;search_code_tiers_end=' . $search_code_tiers_end;
+}
+if (! empty($search_label_compte)) {
+	$filter['t.label_compte'] = $search_label_compte;
+	$options .= '&amp;search_label_compte=' . $search_label_compte;
+}
+if (! empty($search_sens)) {
+	$filter['t.sens'] = $search_sens;
+	$options .= '&amp;search_sens=' . $search_sens;
+}
+if (! empty($search_code_journal)) {
+	$filter['t.code_journal'] = $search_code_journal;
+	$options .= '&amp;search_code_journal=' . $search_code_journal;
+}
 
 /*
  * Mode List
  */
 
-$sql = "SELECT bk.rowid, bk.doc_date, bk.doc_type, bk.doc_ref, bk.code_tiers, bk.numero_compte , bk.label_compte, bk.debit , bk.credit, bk.montant , bk.sens, bk.code_journal";
-$sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping as bk";
-// $sql .= " WHERE bk.doc_date >= '".$db->idate(dol_get_first_day($y,1,false))."'";
-// $sql .= " AND bk.doc_date <= '".$db->idate(dol_get_last_day($y,12,false))."'";
-$sql .= " ORDER BY $sortfield $sortorder " . $db->plimit($conf->liste_limit + 1, $offset);
-
-dol_syslog('accountancy/bookkeeping/listbyyear.php:: $sql=' . $sql);
-$resql = $db->query($sql);
-if ($resql) {
-	$num = $db->num_rows($resql);
-	$i = 0;
+$nbtotalofrecords = 0;
+if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) {
+	$nbtotalofrecords = $object->fetchAll($sortorder, $sortfield, 0, 0);
+	if ($nbtotalofrecords < 0) {
+		setEventMessages($object->error, $object->errors, 'errors');
+	}
+}
+
+$result = $object->fetchAll($sortorder, $sortfield, $limit, $offset, $filter);
+if ($result < 0) {
+	setEventMessages($object->error, $object->errors, 'errors');
+}
+
+print_barre_liste($langs->trans("Bookkeeping") .' '. dol_print_date($search_date_start).'-'.dol_print_date($search_date_end), $page, $_SERVER['PHP_SELF'], $options, $sortfield, $sortorder, '', $result, $nbtotalofrecords);
+
+print '<form method="GET" id="searchFormList" action="' . $_SERVER["PHP_SELF"] . '">';
+print '<div class="liste_titre">';
+print $langs->trans('DateStart') . ': ';
+print $form->select_date($search_date_start, 'date_start');
+print $langs->trans('DateEnd') . ': ';
+print $form->select_date($search_date_end, 'date_end');
+print '</div>';
+print '<div class="liste_titre">';
+print $langs->trans('From').' '.$langs->trans('AccountAccounting') . ': ';
+print $formventilation->select_account($search_numero_compte_start,'search_numero_compte_start', 1, array (), 1, 1,'');
+print $langs->trans('To').' '.$langs->trans('AccountAccounting') . ': ';
+print $formventilation->select_account($search_numero_compte_end,'search_numero_compte_end', 1, array (), 1, 1,'');
+print '</div>';
+print '<div class="liste_titre">';
+print $langs->trans('From').' '.$langs->trans('ThirdPartyAccount') . ': ';
+print $formventilation->select_auxaccount($search_code_tiers_start,'search_code_tiers_start', 1);
+print $langs->trans('To').' '.$langs->trans('ThirdPartyAccount') . ': ';
+print $formventilation->select_auxaccount($search_code_tiers_end,'searchcode_tiers_end', 1);
+print '</div>';
+print "<table class=\"noborder\" width=\"100%\">";
+
+print '<tr class="liste_titre">';
+print_liste_field_titre($langs->trans("NumPiece"), $_SERVER['PHP_SELF'], "t.piece_num", "", $options, "", $sortfield, $sortorder);
+print_liste_field_titre($langs->trans("Doctype"), $_SERVER['PHP_SELF'], "t.doc_type", "", $options, "", $sortfield, $sortorder);
+print_liste_field_titre($langs->trans("Date"), $_SERVER['PHP_SELF'], "t.doc_date", "", $options, "", $sortfield, $sortorder);
+print_liste_field_titre($langs->trans("Docref"), $_SERVER['PHP_SELF'], "t.doc_ref", "", $options, "", $sortfield, $sortorder);
+print_liste_field_titre($langs->trans("AccountAccounting"), $_SERVER['PHP_SELF'], "t.numero_compte", "", $options, "", $sortfield, $sortorder);
+print_liste_field_titre($langs->trans("ThirdPartyAccount"), $_SERVER['PHP_SELF'], "t.code_tiers", "", $options, "", $sortfield, $sortorder);
+print_liste_field_titre($langs->trans("Label"), $_SERVER['PHP_SELF'], "t.label_compte", "", $options, "", $sortfield, $sortorder);
+print_liste_field_titre($langs->trans("Debit"), $_SERVER['PHP_SELF'], "t.debit", "", $options, "", $sortfield, $sortorder);
+print_liste_field_titre($langs->trans("Credit"), $_SERVER['PHP_SELF'], "t.credit", "", $options, "", $sortfield, $sortorder);
+print_liste_field_titre($langs->trans("Amount"), $_SERVER['PHP_SELF'], "t.montant", "", $options, "", $sortfield, $sortorder);
+print_liste_field_titre($langs->trans("Sens"), $_SERVER['PHP_SELF'], "t.sens", "", $options, "", $sortfield, $sortorder);
+print_liste_field_titre($langs->trans("Codejournal"), $_SERVER['PHP_SELF'], "t.code_journal", "", $options, "", $sortfield, $sortorder);
+print '<th class="liste_titre" align="right"><input type="image" class="liste_titre" name="button_search" src="' . img_picto($langs->trans("Search"), 'search.png', '', '', 1) . '" value="' . dol_escape_htmltag($langs->trans("Search")) . '" title="' . dol_escape_htmltag($langs->trans("Search")) . '">';
+print '<input type="image" class="liste_titre" name="button_removefilter" src="' . img_picto($langs->trans("Search"), 'searchclear.png', '', '', 1) . '" value="' . dol_escape_htmltag($langs->trans("RemoveFilter")) . '" title="' . dol_escape_htmltag($langs->trans("RemoveFilter")) . '"></td>';
+print "</tr>\n";
+print '<tr class="liste_titre">';
+
+print '<td class="liste_titre">';
+print '<input type="text" size=4 class="flat" name="search_piece_num" value="'.$search_piece_num.'"/>';
+print '</td>';
+
+print '<td class="liste_titre">';
+print '<input type="text" size=7 class="flat" name="search_doc_type" value="'.$search_doc_type.'"/>';
+print '</td>';
+
+print '<td class="liste_titre">';
+print $form->select_date($search_doc_date,'doc_date',0, 0, 1);
+print '</td>';
+
+print '<td class="liste_titre">';
+print '<input type="text" size=6 class="flat" name="search_doc_ref" value="'.$search_doc_ref.'"/>';
+print '</td>';
+
+print '<td class="liste_titre">';
+print '<input type="text" size=6 class="flat" name="search_numero_compte" value="'.$search_numero_compte.'"/>';
+print '</td>';
+
+print '<td class="liste_titre">';
+print '<input type="text" size=6 class="flat" name="search_code_tiers" value="'.$search_code_tiers.'"/>';
+print '</td>';
+
+print '<td class="liste_titre">';
+print '<input type="text" size=6 class="flat" name="search_label_compte" value="'.$search_label_compte.'"/>';
+print '</td>';
+
+print '<td class="liste_titre">';
+print '</td>';
+
+print '<td class="liste_titre">';
+print '</td>';
+
+print '<td class="liste_titre">';
+print '</td>';
+
+print '<td class="liste_titre">';
+print '<input type="text" size=2 class="flat" name="search_sens" value="'.$search_sens.'"/>';
+print '</td>';
+
+print '<td class="liste_titre">';
+print '<input type="text" size=3 class="flat" name="search_code_journal" value="'.$search_code_journal.'"/>';
+print '</td>';
+
+print '<td class="liste_titre">';
+print '</td>';
+
+print "</tr>\n";
+
+$var = True;
+
+foreach ( $object->lines as $line ) {
+	$var = ! $var;
 	
-	print_barre_liste($langs->trans("Bookkeeping") . " $textprevyear " . $langs->trans("Year") . " $year_start $textnextyear", $page, $_SERVER['PHP_SELF'], "", $sortfield, $sortorder, '', $num);
-	print "<table class=\"noborder\" width=\"100%\">";
+	print "<tr $bc[$var]>";
 	
-	print '<tr class="liste_titre">';
-	print_liste_field_titre($langs->trans("Doctype"), $_SERVER['PHP_SELF'], "bk.doc_type", "", "", "", $sortfield, $sortorder);
-	print_liste_field_titre($langs->trans("Date"), $_SERVER['PHP_SELF'], "bk.doc_date", "", "", "", $sortfield, $sortorder);
-	print_liste_field_titre($langs->trans("Docref"), $_SERVER['PHP_SELF'], "bk.doc_ref", "", "", "", $sortfield, $sortorder);
-	print_liste_field_titre($langs->trans("AccountAccounting"), $_SERVER['PHP_SELF'], "bk.numero_compte", "", "", "", $sortfield, $sortorder);
-	print_liste_field_titre($langs->trans("ThirdPartyAccount"), $_SERVER['PHP_SELF'], "bk.code_tiers", "", "", "", $sortfield, $sortorder);
-	print_liste_field_titre($langs->trans("Label"), $_SERVER['PHP_SELF'], "bk_label_compte", "", "", "", $sortfield, $sortorder);
-	print_liste_field_titre($langs->trans("Debit"), $_SERVER['PHP_SELF'], "bk.debit", "", "", "", $sortfield, $sortorder);
-	print_liste_field_titre($langs->trans("Credit"), $_SERVER['PHP_SELF'], "bk.credit", "", "", "", $sortfield, $sortorder);
-	print_liste_field_titre($langs->trans("Amount"), $_SERVER['PHP_SELF'], "bk.montant", "", "", "", $sortfield, $sortorder);
-	print_liste_field_titre($langs->trans("Sens"), $_SERVER['PHP_SELF'], "bk.sens", "", "", "", $sortfield, $sortorder);
-	print_liste_field_titre($langs->trans("Codejournal"), $_SERVER['PHP_SELF'], "bk.code_journal", "", "", "", $sortfield, $sortorder);
-	print_liste_field_titre('');
+	print '<td>' . $line->piece_num . '</td>' . "\n";
+	print '<td>' . $line->doc_type . '</td>' . "\n";
+	print '<td>' . dol_print_date($line->doc_date) . '</td>';
+	print '<td>' . $line->doc_ref . '</td>';
+	print '<td>' . length_accountg($line->numero_compte) . '</td>';
+	print '<td>' . length_accounta($line->code_tiers) . '</td>';
+	print '<td>' . $line->label_compte . '</td>';
+	print '<td align="right">' . price($line->debit) . '</td>';
+	print '<td align="right">' . price($line->credit) . '</td>';
+	print '<td align="right">' . price($line->montant) . '</td>';
+	print '<td>' . $line->sens . '</td>';
+	print '<td>' . $line->code_journal . '</td>';
+	print '<td><a href="./card.php?action=update&amp;piece_num=' . $line->piece_num . '">' . img_edit() . '</a></td>';
 	print "</tr>\n";
-	
-	$var = True;
-	
-	while ( $i < min($num, $conf->liste_limit) ) {
-		$obj = $db->fetch_object($resql);
-		$var = ! $var;
-		
-		print "<tr $bc[$var]>";
-		
-		print '<td>' . $obj->doc_type . '</td>' . "\n";
-		print '<td>' . dol_print_date($db->jdate($obj->doc_date)) . '</td>';
-		print '<td>' . $obj->doc_ref . '</td>';
-		print '<td>' . length_accountg($obj->numero_compte) . '</td>';
-		print '<td>' . length_accounta($obj->code_tiers) . '</td>';
-		print '<td>' . $obj->label_compte . '</td>';
-		print '<td align="right">' . price($obj->debit) . '</td>';
-		print '<td align="right">' . price($obj->credit) . '</td>';
-		print '<td align="right">' . price($obj->montant) . '</td>';
-		print '<td>' . $obj->sens . '</td>';
-		print '<td>' . $obj->code_journal . '</td>';
-		print '<td><a href="./card.php?action=update&id=' . $obj->rowid . '">' . img_edit() . '</a></td>';
-		print "</tr>\n";
-		
-		$i ++;
-	}
-	print "</table>";
-	$db->free($resql);
-} else {
-	dol_print_error($db);
 }
+print "</table>";
+print '</form>';
 
 llxFooter();
 $db->close();
\ No newline at end of file
diff --git a/htdocs/accountancy/class/accountingaccount.class.php b/htdocs/accountancy/class/accountingaccount.class.php
index 9277bcd9a70e01bdb082c0b5be3296c0caf25839..856306c33048fb3e33e8a7722b54018524d51596 100644
--- a/htdocs/accountancy/class/accountingaccount.class.php
+++ b/htdocs/accountancy/class/accountingaccount.class.php
@@ -30,6 +30,11 @@
  */
 class AccountingAccount extends CommonObject
 {
+	var $db;
+	var $error;
+	var $errors;
+
+	var $id;
 	var $rowid;
 
 	var $datec; // Creation date
diff --git a/htdocs/accountancy/class/bookkeeping.class.php b/htdocs/accountancy/class/bookkeeping.class.php
index d3801b4a4d166f5c5cf8bd3dc86529539cc0fdfe..58c13686d1ca5dcae941e9e3f034290cd74b98ae 100644
--- a/htdocs/accountancy/class/bookkeeping.class.php
+++ b/htdocs/accountancy/class/bookkeeping.class.php
@@ -1,8 +1,8 @@
 <?php
-/* Copyright (C) 2004-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
- * Copyright (C) 2013-2014 Olivier Geffroy      <jeff@jeffinfo.com>
- * Copyright (C) 2013-2015 Alexandre Spangaro   <alexandre.spangaro@gmail.com>
- * Copyright (C) 2013-2014 Florian Henry		<florian.henry@open-concept.pro>
+/* Copyright (C) 2007-2012  Laurent Destailleur <eldy@users.sourceforge.net>
+ * Copyright (C) 2014       Juanjo Menent       <jmenent@2byte.es>
+ * Copyright (C) 2015       Florian Henry       <florian.henry@open-concept.pro>
+ * Copyright (C) 2015       Raphaƫl Doursenaud  <rdoursenaud@gpcsolutions.fr>
  *
  * 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
@@ -19,245 +19,188 @@
  */
 
 /**
- * \file		htdocs/accountancy/class/bookkeeping.class.php
- * \ingroup		Accounting Expert
- * \brief		File of class to manage book keeping
+ * \file accountancy/bookkeeping.class.php
+ * \ingroup accountancy
+ * \brief This file is an example for a CRUD class file (Create/Read/Update/Delete)
+ * Put some comments here
  */
 
+// Put here all includes required by your class file
+require_once DOL_DOCUMENT_ROOT . '/core/class/commonobject.class.php';
+// require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
+// require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php';
+
 /**
- *	Class to manage accountancy book keeping
+ * Class Accountingbookkeeping
+ *
+ * Put here description of your class
  */
 class BookKeeping extends CommonObject
 {
-	var $doc_date;
-	var $doc_type;
-	var $doc_ref;
-	var $date_create;
-	var $fk_doc;
-	var $fk_docdet;
-	var $code_tiers;
-	var $numero_compte;
-	var $label_compte;
-	var $debit;
-	var $credit;
-	var $montant;
-	var $sens;
-	var $fk_user_author;
-	var $code_journal;
-	var $piece_num;
-	var $linesexport = array ();
-	var $linesmvt = array ();
-
-    /**
-     *  Constructor
-     *
-     *  @param	DoliDB		$db		Database handler
-     */
-    function __construct($db)
-    {
-        $this->db = $db;
-    }
-
 	/**
-     *      Load a line into memory from database
-     *
-     *      @param	int		$id		 	id of line to get
-     *      @return	int					<0 if KO, >0 if OK
-     */
-	function fetch($id)
-	{
-		$sql = "SELECT rowid, doc_date, doc_type,";
-		$sql .= " doc_ref, fk_doc, fk_docdet, code_tiers, ";
-		$sql .= " numero_compte, label_compte, debit, credit, ";
-		$sql .= " montant, sens, fk_user_author, import_key, code_journal, piece_num  ";
-		$sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping ";
-		$sql .= " WHERE rowid = '" . $id . "'";
-
-		dol_syslog(get_class($this) . "fetch sql=" . $sql, LOG_DEBUG);
-		$result = $this->db->query($sql);
-		if ($result) {
-			$obj = $this->db->fetch_object($result);
-
-			$this->id = $obj->rowid;
-
-			$this->doc_date = $this->db->jdate($obj->doc_date);
-			$this->doc_type = $obj->doc_type;
-			$this->doc_ref = $obj->doc_ref;
-			$this->fk_doc = $obj->fk_doc;
-			$this->fk_docdet = $obj->fk_docdet;
-			$this->code_tiers = $obj->code_tiers;
-			$this->numero_compte = $obj->numero_compte;
-			$this->label_compte = $obj->label_compte;
-			$this->debit = $obj->debit;
-			$this->credit = $obj->credit;
-			$this->montant = $obj->montant;
-			$this->sens = $obj->sens;
-			$this->code_journal = $obj->code_journal;
-			$this->piece_num = $obj->piece_num;
-		}
-		else
-		{
-			$this->error = "Error " . $this->db->lasterror();
-			dol_syslog(get_class($this) . "::fetch " . $this->error, LOG_ERR);
-			return - 1;
-		}
-
-		return 1;
-	}
-
+	 *
+	 * @var string Error code (or message)
+	 * @deprecated
+	 *
+	 * @see Accountingbookkeeping::errors
+	 */
+	public $error;
 	/**
-     *      Load an accounting document into memory from database
-     *
-     *      @param	int		$piecenum 	Accounting document to get
-     *      @return	int					<0 if KO, >0 if OK
-     */
-	function fetch_per_mvt($piecenum)
-	{
-		$sql = "SELECT piece_num,doc_date,code_journal,doc_ref,doc_type";
-		$sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping";
-		$sql .= " WHERE piece_num = '" . $piecenum . "'";
-
-		dol_syslog(get_class($this) . "fetch_per_mvt sql=" . $sql, LOG_DEBUG);
-		$result = $this->db->query($sql);
-		if ($result) {
-			$obj = $this->db->fetch_object($result);
-
-			$this->piece_num = $obj->piece_num;
-			$this->code_journal = $obj->code_journal;
-			$this->doc_date = $this->db->jdate($obj->doc_date);
-			$this->doc_ref = $obj->doc_ref;
-			$this->doc_type = $obj->doc_type;
-		} else {
-			$this->error = "Error " . $this->db->lasterror();
-			dol_syslog(get_class($this) . "::fetch_per_mvt " . $this->error, LOG_ERR);
-			return - 1;
-		}
-
-		return 1;
-	}
-
+	 *
+	 * @var string[] Error codes (or messages)
+	 */
+	public $errors = array ();
 	/**
-     *      Return next number movement
-     *
-     *      @return    string			Last number
-     */
-	function getNextNumMvt() {
-		$sql = "SELECT MAX(piece_num)+1 as max FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping";
-
-		dol_syslog(get_class($this) . "getNextNumMvt sql=" . $sql, LOG_DEBUG);
-		$result = $this->db->query($sql);
-
-		if ($result)
-		{
-			$obj = $this->db->fetch_object($result);
-
-			return $obj->max;
-		}
-		else
-		{
-			$this->error = "Error " . $this->db->lasterror();
-			dol_syslog(get_class($this) . "::getNextNumMvt " . $this->error, LOG_ERR);
-			return - 1;
-		}
-	}
-
+	 *
+	 * @var string Id to identify managed objects
+	 */
+	public $element = 'accountingbookkeeping';
 	/**
-     *      Load all informations of accountancy document
-     *
-     *      @param	int		$piecenum	id of line to get
-     *      @return	int					<0 if KO, >0 if OK
-     */
-	function fetch_all_per_mvt($piecenum)
-	{
-		$sql = "SELECT rowid, doc_date, doc_type,";
-		$sql .= " doc_ref, fk_doc, fk_docdet, code_tiers,";
-		$sql .= " numero_compte, label_compte, debit, credit,";
-		$sql .= " montant, sens, fk_user_author, import_key, code_journal, piece_num";
-		$sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping ";
-		$sql .= " WHERE piece_num = '" . $piecenum . "'";
-
-		dol_syslog(get_class($this) . "fetch_all_per_mvt sql=" . $sql, LOG_DEBUG);
-		$result = $this->db->query($sql);
-		if ($result) {
-
-			while ( $obj = $this->db->fetch_object($result) ) {
-
-				$line = new BookKeepingLine();
-
-				$line->id = $obj->rowid;
-
-				$line->doc_date = $this->db->jdate($obj->doc_date);
-				$line->doc_type = $obj->doc_type;
-				$line->doc_ref = $obj->doc_ref;
-				$line->fk_doc = $obj->fk_doc;
-				$line->fk_docdet = $obj->fk_docdet;
-				$line->code_tiers = $obj->code_tiers;
-				$line->numero_compte = $obj->numero_compte;
-				$line->label_compte = $obj->label_compte;
-				$line->debit = $obj->debit;
-				$line->credit = $obj->credit;
-				$line->montant = $obj->montant;
-				$line->sens = $obj->sens;
-				$line->code_journal = $obj->code_journal;
-				$line->piece_num = $obj->piece_num;
-
-				$this->linesmvt[] = $line;
-			}
-		} else {
-			$this->error = "Error " . $this->db->lasterror();
-			dol_syslog(get_class($this) . "::fetch_per_mvt " . $this->error, LOG_ERR);
-			return - 1;
-		}
-
+	 *
+	 * @var string Name of table without prefix where object is stored
+	 */
+	public $table_element = 'accounting_bookkeeping';
+	
+	/**
+	 *
+	 * @var BookKeepingLine[] Lines
+	 */
+	public $lines = array ();
+	
+	/**
+	 *
+	 * @var int ID
+	 */
+	public $id;
+	/**
+	 */
+	public $doc_date = '';
+	public $doc_type;
+	public $doc_ref;
+	public $fk_doc;
+	public $fk_docdet;
+	public $code_tiers;
+	public $numero_compte;
+	public $label_compte;
+	public $debit;
+	public $credit;
+	public $montant;
+	public $sens;
+	public $fk_user_author;
+	public $import_key;
+	public $code_journal;
+	public $piece_num;
+	
+	/**
+	 */
+	
+	/**
+	 * Constructor
+	 *
+	 * @param DoliDb $db Database handler
+	 */
+	public function __construct(DoliDB $db) {
+		$this->db = $db;
 		return 1;
 	}
-
+	
 	/**
-	 * Insert line into bookkeeping
+	 * Create object into database
 	 *
-	 * @param 	User	$user		User who inserted operation
-	 * @return	int <0 KO >0 OK
+	 * @param User $user User that creates
+	 * @param bool $notrigger false=launch triggers after, true=disable triggers
+	 *       
+	 * @return int <0 if KO, Id of created object if OK
 	 */
-	function create($user='')
-	{
-		global $conf;
-
+	public function create(User $user, $notrigger = false) {
+		dol_syslog(__METHOD__, LOG_DEBUG);
+		
+		$error = 0;
+		
+		// Clean parameters
+		
+		if (isset($this->doc_type)) {
+			$this->doc_type = trim($this->doc_type);
+		}
+		if (isset($this->doc_ref)) {
+			$this->doc_ref = trim($this->doc_ref);
+		}
+		if (isset($this->fk_doc)) {
+			$this->fk_doc = trim($this->fk_doc);
+		}
+		if (isset($this->fk_docdet)) {
+			$this->fk_docdet = trim($this->fk_docdet);
+		}
+		if (isset($this->code_tiers)) {
+			$this->code_tiers = trim($this->code_tiers);
+		}
+		if (isset($this->numero_compte)) {
+			$this->numero_compte = trim($this->numero_compte);
+		}
+		if (isset($this->label_compte)) {
+			$this->label_compte = trim($this->label_compte);
+		}
+		if (isset($this->debit)) {
+			$this->debit = trim($this->debit);
+		}
+		if (isset($this->credit)) {
+			$this->credit = trim($this->credit);
+		}
+		if (isset($this->montant)) {
+			$this->montant = trim($this->montant);
+		}
+		if (isset($this->sens)) {
+			$this->sens = trim($this->sens);
+		}
+		if (isset($this->fk_user_author)) {
+			$this->fk_user_author = trim($this->fk_user_author);
+		}
+		if (isset($this->import_key)) {
+			$this->import_key = trim($this->import_key);
+		}
+		if (isset($this->code_journal)) {
+			$this->code_journal = trim($this->code_journal);
+		}
+		if (isset($this->piece_num)) {
+			$this->piece_num = trim($this->piece_num);
+		}
+		
+		$this->db->begin();
+		
 		$this->piece_num = 0;
-
+		
 		// first check if line not yet in bookkeeping
 		$sql = "SELECT count(*)";
-		$sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping ";
+		$sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element;
 		$sql .= " WHERE doc_type = '" . $this->doc_type . "'";
 		$sql .= " AND fk_docdet = " . $this->fk_docdet;
 		$sql .= " AND numero_compte = '" . $this->numero_compte . "'";
-
+		
 		dol_syslog(get_class($this) . ":: create sql=" . $sql, LOG_DEBUG);
 		$resql = $this->db->query($sql);
-
+		
 		if ($resql) {
 			$row = $this->db->fetch_array($resql);
 			if ($row[0] == 0) {
-
+				
 				// Determine piece_num
 				$sqlnum = "SELECT piece_num";
-				$sqlnum .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping ";
+				$sqlnum .= " FROM " . MAIN_DB_PREFIX . $this->table_element;
 				$sqlnum .= " WHERE doc_type = '" . $this->doc_type . "'";
 				$sqlnum .= " AND fk_docdet = '" . $this->fk_docdet . "'";
 				$sqlnum .= " AND doc_ref = '" . $this->doc_ref . "'";
-
+				
 				dol_syslog(get_class($this) . ":: create sqlnum=" . $sqlnum, LOG_DEBUG);
 				$resqlnum = $this->db->query($sqlnum);
-				if ($resqlnum)
-				{
+				if ($resqlnum) {
 					$objnum = $this->db->fetch_object($resqlnum);
 					$this->piece_num = $objnum->piece_num;
 				}
 				dol_syslog(get_class($this) . ":: create this->piece_num=" . $this->piece_num, LOG_DEBUG);
-				if (empty($this->piece_num))
-				{
+				if (empty($this->piece_num)) {
 					$sqlnum = "SELECT MAX(piece_num)+1 as maxpiecenum";
-					$sqlnum .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping ";
-
+					$sqlnum .= " FROM " . MAIN_DB_PREFIX . $this->table_element;
+					
 					dol_syslog(get_class($this) . ":: create sqlnum=" . $sqlnum, LOG_DEBUG);
 					$resqlnum = $this->db->query($sqlnum);
 					if ($resqlnum) {
@@ -269,13 +212,13 @@ class BookKeeping extends CommonObject
 				if (empty($this->piece_num)) {
 					$this->piece_num = 1;
 				}
-
+				
 				$now = dol_now();
 				if (empty($this->date_create)) {
 					$this->date_create = $now;
 				}
-
-				$sql = "INSERT INTO " . MAIN_DB_PREFIX . "accounting_bookkeeping (";
+				
+				$sql = "INSERT INTO " . MAIN_DB_PREFIX . $this->table_element." (";
 				
 				$sql .= "doc_date";
 				$sql .= ", doc_type";
@@ -293,7 +236,7 @@ class BookKeeping extends CommonObject
 				$sql .= ", import_key";
 				$sql .= ", code_journal";
 				$sql .= ", piece_num";
-
+				
 				$sql .= ") VALUES (";
 				
 				$sql .= "'" . $this->doc_date . "'";
@@ -308,57 +251,583 @@ class BookKeeping extends CommonObject
 				$sql .= "," . $this->credit;
 				$sql .= "," . $this->montant;
 				$sql .= ",'" . $this->sens . "'";
-				$sql .= ",'" . $this->fk_user_author."'";
+				$sql .= ",'" . $this->fk_user_author . "'";
 				$sql .= ",'" . $this->date_create . "'";
 				$sql .= ",'" . $this->code_journal . "'";
 				$sql .= "," . $this->piece_num;
 				
 				$sql .= ")";
-
+				
 				dol_syslog(get_class($this) . ":: create sql=" . $sql, LOG_DEBUG);
 				$resql = $this->db->query($sql);
 				if ($resql) {
-					$id = $this->db->last_insert_id(MAIN_DB_PREFIX . "accounting_bookkeeping");
-
+					$id = $this->db->last_insert_id(MAIN_DB_PREFIX . $this->table_element);
+					
 					if ($id > 0) {
 						$this->id = $id;
 						$result = 0;
 					} else {
 						$result = - 2;
-						dol_syslog("BookKeeping::Create Error $result lecture ID");
+						$error ++;
+						$this->errors[] = 'Error Create Error ' . $result . ' lecture ID';
+						dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR);
 					}
 				} else {
 					$result = - 1;
-					dol_syslog("BookKeeping::Create Error $result INSERT Mysql");
+					$error ++;
+					$this->errors[] = 'Error ' . $this->db->lasterror();
+					dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR);
 				}
 			} else {
 				$result = - 3;
-				dol_syslog("BookKeeping::Create Error $result SELECT Mysql");
+				$error ++;
+				$this->errors[] = 'Error ' . $this->db->lasterror();
+				dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR);
+			}
+		} else {
+			$result = - 5;
+			$error ++;
+			$this->errors[] = 'Error ' . $this->db->lasterror();
+			dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR);
+		}
+		
+		
+		if (! $error) {
+			
+			if (! $notrigger) {
+				// Uncomment this and change MYOBJECT to your own tag if you
+				// want this action to call a trigger.
+				
+				// // Call triggers
+				// $result=$this->call_trigger('MYOBJECT_CREATE',$user);
+				// if ($result < 0) $error++;
+				// // End call triggers
+			}
+		}
+		
+		// Commit or rollback
+		if ($error) {
+			$this->db->rollback();
+			
+			return - 1 * $error;
+		} else {
+			$this->db->commit();
+			
+			return $result;
+		}
+	}
+	
+	/**
+	 * Create object into database
+	 *
+	 * @param  User $user      User that creates
+	 * @param  bool $notrigger false=launch triggers after, true=disable triggers
+	 *
+	 * @return int <0 if KO, Id of created object if OK
+	 */
+	public function createStd(User $user, $notrigger = false)
+	{
+		dol_syslog(__METHOD__, LOG_DEBUG);
+	
+		$error = 0;
+	
+		// Clean parameters
+	
+		if (isset($this->doc_type)) {
+			$this->doc_type = trim($this->doc_type);
+		}
+		if (isset($this->doc_ref)) {
+			$this->doc_ref = trim($this->doc_ref);
+		}
+		if (isset($this->fk_doc)) {
+			$this->fk_doc = trim($this->fk_doc);
+		}
+		if (isset($this->fk_docdet)) {
+			$this->fk_docdet = trim($this->fk_docdet);
+		}
+		if (isset($this->code_tiers)) {
+			$this->code_tiers = trim($this->code_tiers);
+		}
+		if (isset($this->numero_compte)) {
+			$this->numero_compte = trim($this->numero_compte);
+		}
+		if (isset($this->label_compte)) {
+			$this->label_compte = trim($this->label_compte);
+		}
+		if (isset($this->debit)) {
+			$this->debit = trim($this->debit);
+		}
+		if (isset($this->credit)) {
+			$this->credit = trim($this->credit);
+		}
+		if (isset($this->montant)) {
+			$this->montant = trim($this->montant);
+		}
+		if (isset($this->sens)) {
+			$this->sens = trim($this->sens);
+		}
+		if (isset($this->fk_user_author)) {
+			$this->fk_user_author = trim($this->fk_user_author);
+		}
+		if (isset($this->import_key)) {
+			$this->import_key = trim($this->import_key);
+		}
+		if (isset($this->code_journal)) {
+			$this->code_journal = trim($this->code_journal);
+		}
+		if (isset($this->piece_num)) {
+			$this->piece_num = trim($this->piece_num);
+		}
+	
+	
+	
+		// Check parameters
+		// Put here code to add control on parameters values
+	
+		// Insert request
+		$sql = 'INSERT INTO ' . MAIN_DB_PREFIX . $this->table_element . '(';
+	
+		$sql.= 'doc_date,';
+		$sql.= 'doc_type,';
+		$sql.= 'doc_ref,';
+		$sql.= 'fk_doc,';
+		$sql.= 'fk_docdet,';
+		$sql.= 'code_tiers,';
+		$sql.= 'numero_compte,';
+		$sql.= 'label_compte,';
+		$sql.= 'debit,';
+		$sql.= 'credit,';
+		$sql.= 'montant,';
+		$sql.= 'sens,';
+		$sql.= 'fk_user_author,';
+		$sql.= 'import_key,';
+		$sql.= 'code_journal,';
+		$sql.= 'piece_num';
+	
+	
+		$sql .= ') VALUES (';
+	
+		$sql .= ' '.(! isset($this->doc_date) || dol_strlen($this->doc_date)==0?'NULL':"'".$this->db->idate($this->doc_date)."'").',';
+		$sql .= ' '.(! isset($this->doc_type)?'NULL':"'".$this->db->escape($this->doc_type)."'").',';
+		$sql .= ' '.(! isset($this->doc_ref)?'NULL':"'".$this->db->escape($this->doc_ref)."'").',';
+		$sql .= ' '.(empty($this->fk_doc)?'0':$this->fk_doc).',';
+		$sql .= ' '.(empty($this->fk_docdet)?'0':$this->fk_docdet).',';
+		$sql .= ' '.(! isset($this->code_tiers)?'NULL':"'".$this->db->escape($this->code_tiers)."'").',';
+		$sql .= ' '.(! isset($this->numero_compte)?'NULL':"'".$this->db->escape($this->numero_compte)."'").',';
+		$sql .= ' '.(! isset($this->label_compte)?'NULL':"'".$this->db->escape($this->label_compte)."'").',';
+		$sql .= ' '.(! isset($this->debit)?'NULL':"'".$this->debit."'").',';
+		$sql .= ' '.(! isset($this->credit)?'NULL':"'".$this->credit."'").',';
+		$sql .= ' '.(! isset($this->montant)?'NULL':"'".$this->montant."'").',';
+		$sql .= ' '.(! isset($this->sens)?'NULL':"'".$this->db->escape($this->sens)."'").',';
+		$sql .= ' '.$user->id.',';
+		$sql .= ' '.(! isset($this->import_key)?'NULL':"'".$this->db->escape($this->import_key)."'").',';
+		$sql .= ' '.(! isset($this->code_journal)?'NULL':"'".$this->db->escape($this->code_journal)."'").',';
+		$sql .= ' '.(! isset($this->piece_num)?'NULL':$this->piece_num);
+	
+	
+		$sql .= ')';
+	
+		$this->db->begin();
+	
+		$resql = $this->db->query($sql);
+		if (!$resql) {
+			$error ++;
+			$this->errors[] = 'Error ' . $this->db->lasterror();
+			dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR);
+		}
+	
+		if (!$error) {
+			$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . $this->table_element);
+	
+			if (!$notrigger) {
+				// Uncomment this and change MYOBJECT to your own tag if you
+				// want this action to call a trigger.
+	
+				//// Call triggers
+				//$result=$this->call_trigger('MYOBJECT_CREATE',$user);
+				//if ($result < 0) $error++;
+				//// End call triggers
+			}
+		}
+	
+		// Commit or rollback
+		if ($error) {
+			$this->db->rollback();
+	
+			return - 1 * $error;
+		} else {
+			$this->db->commit();
+	
+			return $this->id;
+		}
+	}
+	
+	/**
+	 * Load object in memory from the database
+	 *
+	 * @param int $id Id object
+	 * @param string $ref Ref
+	 *       
+	 * @return int <0 if KO, 0 if not found, >0 if OK
+	 */
+	public function fetch($id, $ref = null) {
+		dol_syslog(__METHOD__, LOG_DEBUG);
+		
+		$sql = 'SELECT';
+		$sql .= ' t.rowid,';
+		
+		$sql .= " t.doc_date,";
+		$sql .= " t.doc_type,";
+		$sql .= " t.doc_ref,";
+		$sql .= " t.fk_doc,";
+		$sql .= " t.fk_docdet,";
+		$sql .= " t.code_tiers,";
+		$sql .= " t.numero_compte,";
+		$sql .= " t.label_compte,";
+		$sql .= " t.debit,";
+		$sql .= " t.credit,";
+		$sql .= " t.montant,";
+		$sql .= " t.sens,";
+		$sql .= " t.fk_user_author,";
+		$sql .= " t.import_key,";
+		$sql .= " t.code_journal,";
+		$sql .= " t.piece_num";
+		
+		$sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element . ' as t';
+		if (null !== $ref) {
+			$sql .= ' WHERE t.ref = ' . '\'' . $ref . '\'';
+		} else {
+			$sql .= ' WHERE t.rowid = ' . $id;
+		}
+		
+		$resql = $this->db->query($sql);
+		if ($resql) {
+			$numrows = $this->db->num_rows($resql);
+			if ($numrows) {
+				$obj = $this->db->fetch_object($resql);
+				
+				$this->id = $obj->rowid;
+				
+				$this->doc_date = $this->db->jdate($obj->doc_date);
+				$this->doc_type = $obj->doc_type;
+				$this->doc_ref = $obj->doc_ref;
+				$this->fk_doc = $obj->fk_doc;
+				$this->fk_docdet = $obj->fk_docdet;
+				$this->code_tiers = $obj->code_tiers;
+				$this->numero_compte = $obj->numero_compte;
+				$this->label_compte = $obj->label_compte;
+				$this->debit = $obj->debit;
+				$this->credit = $obj->credit;
+				$this->montant = $obj->montant;
+				$this->sens = $obj->sens;
+				$this->fk_user_author = $obj->fk_user_author;
+				$this->import_key = $obj->import_key;
+				$this->code_journal = $obj->code_journal;
+				$this->piece_num = $obj->piece_num;
+			}
+			$this->db->free($resql);
+			
+			if ($numrows) {
+				return 1;
+			} else {
+				return 0;
+			}
+		} else {
+			$this->errors[] = 'Error ' . $this->db->lasterror();
+			dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR);
+			
+			return - 1;
+		}
+	}
+	
+	/**
+	 * Load object in memory from the database
+	 *
+	 * @param string $sortorder Sort Order
+	 * @param string $sortfield Sort field
+	 * @param int $limit offset limit
+	 * @param int $offset offset limit
+	 * @param array $filter filter array
+	 * @param string $filtermode filter mode (AND or OR)
+	 *       
+	 * @return int <0 if KO, >0 if OK
+	 */
+	public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND') {
+		dol_syslog(__METHOD__, LOG_DEBUG);
+		
+		$sql = 'SELECT';
+		$sql .= ' t.rowid,';
+		
+		$sql .= " t.doc_date,";
+		$sql .= " t.doc_type,";
+		$sql .= " t.doc_ref,";
+		$sql .= " t.fk_doc,";
+		$sql .= " t.fk_docdet,";
+		$sql .= " t.code_tiers,";
+		$sql .= " t.numero_compte,";
+		$sql .= " t.label_compte,";
+		$sql .= " t.debit,";
+		$sql .= " t.credit,";
+		$sql .= " t.montant,";
+		$sql .= " t.sens,";
+		$sql .= " t.fk_user_author,";
+		$sql .= " t.import_key,";
+		$sql .= " t.code_journal,";
+		$sql .= " t.piece_num";
+		
+		$sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element . ' as t';
+		
+		// Manage filter
+		$sqlwhere = array ();
+		if (count($filter) > 0) {
+			foreach ( $filter as $key => $value ) {
+				if ($key=='t.doc_date') {
+					$sqlwhere[] = $key . '=\'' . $this->db->idate($value) . '\'';
+				} elseif($key=='t.doc_date>=' || $key=='t.doc_date<=') {
+					$sqlwhere[] = $key . '\'' . $this->db->idate($value) . '\'';
+				}  elseif($key=='t.fk_doc' || $key=='t.fk_docdet' ||$key=='t.piece_num') {
+					$sqlwhere[] = $key . '=' . $value;
+				} else {
+					$sqlwhere[] = $key . ' LIKE \'%' . $this->db->escape($value) . '%\'';
+				}
+			}
+		}
+		
+		if (count($sqlwhere) > 0) {
+			$sql .= ' WHERE ' . implode(' ' . $filtermode . ' ', $sqlwhere);
+		}
+		
+		if (! empty($sortfield)) {
+			$sql .= $this->db->order($sortfield, $sortorder);
+		}
+		if (! empty($limit)) {
+			$sql .= ' ' . $this->db->plimit($limit + 1, $offset);
+		}
+		$this->lines = array ();
+		
+		$resql = $this->db->query($sql);
+		if ($resql) {
+			$num = $this->db->num_rows($resql);
+			
+			while ( $obj = $this->db->fetch_object($resql) ) {
+				$line = new BookKeepingLine();
+				
+				$line->id = $obj->rowid;
+				
+				$line->doc_date = $this->db->jdate($obj->doc_date);
+				$line->doc_type = $obj->doc_type;
+				$line->doc_ref = $obj->doc_ref;
+				$line->fk_doc = $obj->fk_doc;
+				$line->fk_docdet = $obj->fk_docdet;
+				$line->code_tiers = $obj->code_tiers;
+				$line->numero_compte = $obj->numero_compte;
+				$line->label_compte = $obj->label_compte;
+				$line->debit = $obj->debit;
+				$line->credit = $obj->credit;
+				$line->montant = $obj->montant;
+				$line->sens = $obj->sens;
+				$line->fk_user_author = $obj->fk_user_author;
+				$line->import_key = $obj->import_key;
+				$line->code_journal = $obj->code_journal;
+				$line->piece_num = $obj->piece_num;
+				
+				$this->lines[] = $line;
+			}
+			$this->db->free($resql);
+			
+			return $num;
+		} else {
+			$this->errors[] = 'Error ' . $this->db->lasterror();
+			dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR);
+			
+			return - 1;
+		}
+	}
+	
+	/**
+	 * Update object into database
+	 *
+	 * @param User $user User that modifies
+	 * @param bool $notrigger false=launch triggers after, true=disable triggers
+	 *       
+	 * @return int <0 if KO, >0 if OK
+	 */
+	public function update(User $user, $notrigger = false) {
+		$error = 0;
+		
+		dol_syslog(__METHOD__, LOG_DEBUG);
+		
+		// Clean parameters
+		
+		if (isset($this->doc_type)) {
+			$this->doc_type = trim($this->doc_type);
+		}
+		if (isset($this->doc_ref)) {
+			$this->doc_ref = trim($this->doc_ref);
+		}
+		if (isset($this->fk_doc)) {
+			$this->fk_doc = trim($this->fk_doc);
+		}
+		if (isset($this->fk_docdet)) {
+			$this->fk_docdet = trim($this->fk_docdet);
+		}
+		if (isset($this->code_tiers)) {
+			$this->code_tiers = trim($this->code_tiers);
+		}
+		if (isset($this->numero_compte)) {
+			$this->numero_compte = trim($this->numero_compte);
+		}
+		if (isset($this->label_compte)) {
+			$this->label_compte = trim($this->label_compte);
+		}
+		if (isset($this->debit)) {
+			$this->debit = trim($this->debit);
+		}
+		if (isset($this->credit)) {
+			$this->credit = trim($this->credit);
+		}
+		if (isset($this->montant)) {
+			$this->montant = trim($this->montant);
+		}
+		if (isset($this->sens)) {
+			$this->sens = trim($this->sens);
+		}
+		if (isset($this->fk_user_author)) {
+			$this->fk_user_author = trim($this->fk_user_author);
+		}
+		if (isset($this->import_key)) {
+			$this->import_key = trim($this->import_key);
+		}
+		if (isset($this->code_journal)) {
+			$this->code_journal = trim($this->code_journal);
+		}
+		if (isset($this->piece_num)) {
+			$this->piece_num = trim($this->piece_num);
+		}
+		
+		// Check parameters
+		// Put here code to add a control on parameters values
+		
+		// Update request
+		$sql = 'UPDATE ' . MAIN_DB_PREFIX . $this->table_element . ' SET';
+		
+		$sql .= ' doc_date = ' . (! isset($this->doc_date) || dol_strlen($this->doc_date) != 0 ? "'" . $this->db->idate($this->doc_date) . "'" : 'null') . ',';
+		$sql .= ' doc_type = ' . (isset($this->doc_type) ? "'" . $this->db->escape($this->doc_type) . "'" : "null") . ',';
+		$sql .= ' doc_ref = ' . (isset($this->doc_ref) ? "'" . $this->db->escape($this->doc_ref) . "'" : "null") . ',';
+		$sql .= ' fk_doc = ' . (isset($this->fk_doc) ? $this->fk_doc : "null") . ',';
+		$sql .= ' fk_docdet = ' . (isset($this->fk_docdet) ? $this->fk_docdet : "null") . ',';
+		$sql .= ' code_tiers = ' . (isset($this->code_tiers) ? "'" . $this->db->escape($this->code_tiers) . "'" : "null") . ',';
+		$sql .= ' numero_compte = ' . (isset($this->numero_compte) ? "'" . $this->db->escape($this->numero_compte) . "'" : "null") . ',';
+		$sql .= ' label_compte = ' . (isset($this->label_compte) ? "'" . $this->db->escape($this->label_compte) . "'" : "null") . ',';
+		$sql .= ' debit = ' . (isset($this->debit) ? $this->debit : "null") . ',';
+		$sql .= ' credit = ' . (isset($this->credit) ? $this->credit : "null") . ',';
+		$sql .= ' montant = ' . (isset($this->montant) ? $this->montant : "null") . ',';
+		$sql .= ' sens = ' . (isset($this->sens) ? "'" . $this->db->escape($this->sens) . "'" : "null") . ',';
+		$sql .= ' fk_user_author = ' . (isset($this->fk_user_author) ? $this->fk_user_author : "null") . ',';
+		$sql .= ' import_key = ' . (isset($this->import_key) ? "'" . $this->db->escape($this->import_key) . "'" : "null") . ',';
+		$sql .= ' code_journal = ' . (isset($this->code_journal) ? "'" . $this->db->escape($this->code_journal) . "'" : "null") . ',';
+		$sql .= ' piece_num = ' . (isset($this->piece_num) ? $this->piece_num : "null");
+		
+		$sql .= ' WHERE rowid=' . $this->id;
+		
+		$this->db->begin();
+		
+		$resql = $this->db->query($sql);
+		if (! $resql) {
+			$error ++;
+			$this->errors[] = 'Error ' . $this->db->lasterror();
+			dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR);
+		}
+		
+		if (! $error && ! $notrigger) {
+			// Uncomment this and change MYOBJECT to your own tag if you
+			// want this action calls a trigger.
+			
+			// // Call triggers
+			// $result=$this->call_trigger('MYOBJECT_MODIFY',$user);
+			// if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail}
+			// // End call triggers
+		}
+		
+		// Commit or rollback
+		if ($error) {
+			$this->db->rollback();
+			
+			return - 1 * $error;
+		} else {
+			$this->db->commit();
+			
+			return 1;
+		}
+	}
+	
+	/**
+	 * Delete object in database
+	 *
+	 * @param User $user User that deletes
+	 * @param bool $notrigger false=launch triggers after, true=disable triggers
+	 *       
+	 * @return int <0 if KO, >0 if OK
+	 */
+	public function delete(User $user, $notrigger = false) {
+		dol_syslog(__METHOD__, LOG_DEBUG);
+		
+		$error = 0;
+		
+		$this->db->begin();
+		
+		if (! $error) {
+			if (! $notrigger) {
+				// Uncomment this and change MYOBJECT to your own tag if you
+				// want this action calls a trigger.
+				
+				// // Call triggers
+				// $result=$this->call_trigger('MYOBJECT_DELETE',$user);
+				// if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail}
+				// // End call triggers
+			}
+		}
+		
+		if (! $error) {
+			$sql = 'DELETE FROM ' . MAIN_DB_PREFIX . $this->table_element;
+			$sql .= ' WHERE rowid=' . $this->id;
+			
+			$resql = $this->db->query($sql);
+			if (! $resql) {
+				$error ++;
+				$this->errors[] = 'Error ' . $this->db->lasterror();
+				dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR);
 			}
+		}
+		
+		// Commit or rollback
+		if ($error) {
+			$this->db->rollback();
+			
+			return - 1 * $error;
 		} else {
-			$result = - 5;
-			dol_syslog("BookKeeping::Create Error $result SELECT Mysql");
+			$this->db->commit();
+			
+			return 1;
 		}
-
-		return $result;
 	}
-
+	
 	/**
 	 * Delete bookkepping by importkey
 	 *
 	 * @param	string 	$importkey		Import key
 	 * @return	int						Result
 	 */
-	function delete_by_importkey($importkey) {
+	function deleteByImportkey($importkey) {
 		$this->db->begin();
-
+	
 		// first check if line not yet in bookkeeping
 		$sql = "DELETE";
-		$sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping ";
+		$sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element;
 		$sql .= " WHERE import_key = '" . $importkey . "'";
-
+	
 		$resql = $this->db->query($sql);
-
+	
 		if (! $resql) {
 			$this->errors[] = "Error " . $this->db->lasterror();
 			foreach ( $this->errors as $errmsg ) {
@@ -368,23 +837,23 @@ class BookKeeping extends CommonObject
 			$this->db->rollback();
 			return - 1;
 		}
-
+	
 		$this->db->commit();
 		return 1;
 	}
 	
 	/**
-	 * Delete bookkepping by importkey
+	 * Delete bookkepping by year
 	 *
 	 * @param	string 	$delyear		year to delete
 	 * @return	int						Result
 	 */
-	function delete_by_year($delyear) {
+	function deleteByYear($delyear) {
 		$this->db->begin();
 	
 		// first check if line not yet in bookkeeping
 		$sql = "DELETE";
-		$sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping ";
+		$sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element;
 		$sql .= " WHERE YEAR(doc_date) = ".$delyear;
 	
 		$resql = $this->db->query($sql);
@@ -402,288 +871,213 @@ class BookKeeping extends CommonObject
 		$this->db->commit();
 		return 1;
 	}
-
+	
 	/**
-	 *	Create object into database
+	 * Delete bookkepping by piece number
 	 *
-	 *	@param	User	$user      		Object user that create
-	 *	@param  int		$notrigger		1=Does not execute triggers, 0 otherwise
-	 *	@return	int						<0 if KO, >0 if OK
+	 * @param	int 	$piecenum		peicenum to delete
+	 * @return	int						Result
 	 */
-	function create_std($user, $notrigger = 0)
-	{
-		$error = 0;
-
-		// Clean parameters
-		if (isset($this->doc_type))
-			$this->doc_type = trim($this->doc_type);
-		if (isset($this->doc_ref))
-			$this->doc_ref = trim($this->doc_ref);
-		if (isset($this->fk_doc))
-			$this->fk_doc = trim($this->fk_doc);
-		if (isset($this->fk_docdet))
-			$this->fk_docdet = trim($this->fk_docdet);
-		if (isset($this->code_tiers))
-			$this->code_tiers = trim($this->code_tiers);
-		if (isset($this->numero_compte))
-			$this->numero_compte = trim($this->numero_compte);
-		if (isset($this->label_compte))
-			$this->label_compte = trim($this->label_compte);
-		if (isset($this->debit))
-			$this->debit = trim($this->debit);
-		if (isset($this->credit))
-			$this->credit = trim($this->credit);
-		if (isset($this->montant))
-			$this->montant = trim($this->montant);
-		if (isset($this->sens))
-			$this->sens = trim($this->sens);
-		if (isset($this->fk_user_author))
-			$this->fk_user_author = trim($this->fk_user_author);
-		if (isset($this->import_key))
-			$this->import_key = trim($this->import_key);
-		if (isset($this->code_journal))
-			$this->code_journal = trim($this->code_journal);
-		if (isset($this->piece_num))
-			$this->piece_num = trim($this->piece_num);
-
-		// Check parameters
-		// Put here code to add control on parameters values
-
-		// Insert request
-		$sql = "INSERT INTO " . MAIN_DB_PREFIX . "accounting_bookkeeping(";
-		$sql .= "doc_date,";
-		$sql .= "doc_type,";
-		$sql .= "doc_ref,";
-		$sql .= "fk_doc,";
-		$sql .= "fk_docdet,";
-		$sql .= "code_tiers,";
-		$sql .= "numero_compte,";
-		$sql .= "label_compte,";
-		$sql .= "debit,";
-		$sql .= "credit,";
-		$sql .= "montant,";
-		$sql .= "sens,";
-		$sql .= "fk_user_author,";
-		$sql .= "import_key,";
-		$sql .= "code_journal,";
-		$sql .= "piece_num";
-
-		$sql .= ") VALUES (";
-
-		$sql .= " " . (! isset($this->doc_date) || dol_strlen($this->doc_date) == 0 ? 'NULL' : $this->db->idate($this->doc_date)) . ",";
-		$sql .= " " . (! isset($this->doc_type) ? 'NULL' : "'" . $this->db->escape($this->doc_type) . "'") . ",";
-		$sql .= " " . (! isset($this->doc_ref) ? 'NULL' : "'" . $this->db->escape($this->doc_ref) . "'") . ",";
-		$sql .= " " . (! isset($this->fk_doc) ? 'NULL' : "'" . $this->fk_doc . "'") . ",";
-		$sql .= " " . (! isset($this->fk_docdet) ? 'NULL' : "'" . $this->fk_docdet . "'") . ",";
-		$sql .= " " . (! isset($this->code_tiers) ? 'NULL' : "'" . $this->db->escape($this->code_tiers) . "'") . ",";
-		$sql .= " " . (! isset($this->numero_compte) ? 'NULL' : "'" . $this->db->escape($this->numero_compte) . "'") . ",";
-		$sql .= " " . (! isset($this->label_compte) ? 'NULL' : "'" . $this->db->escape($this->label_compte) . "'") . ",";
-		$sql .= " " . (! isset($this->debit) ? 'NULL' : "'" . $this->debit . "'") . ",";
-		$sql .= " " . (! isset($this->credit) ? 'NULL' : "'" . $this->credit . "'") . ",";
-		$sql .= " " . (! isset($this->montant) ? 'NULL' : "'" . $this->montant . "'") . ",";
-		$sql .= " " . (! isset($this->sens) ? 'NULL' : "'" . $this->db->escape($this->sens) . "'") . ",";
-		$sql .= " " . $user->id . ",";
-		$sql .= " " . (! isset($this->import_key) ? 'NULL' : "'" . $this->db->escape($this->import_key) . "'") . ",";
-		$sql .= " " . (! isset($this->code_journal) ? 'NULL' : "'" . $this->db->escape($this->code_journal) . "'") . ",";
-		$sql .= " " . (! isset($this->piece_num) ? 'NULL' : "'" . $this->piece_num . "'") . "";
-
-		$sql .= ")";
-
+	function deleteMvtNum($piecenum) {
 		$this->db->begin();
-
-		dol_syslog(get_class($this) . "::create_std sql=" . $sql, LOG_DEBUG);
+	
+		// first check if line not yet in bookkeeping
+		$sql = "DELETE";
+		$sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element;
+		$sql .= " WHERE piece_num = ".$piecenum;
+	
 		$resql = $this->db->query($sql);
+	
 		if (! $resql) {
-			$error ++;
 			$this->errors[] = "Error " . $this->db->lasterror();
-		}
-
-		if (! $error) {
-			$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . "accounting_bookkeeping");
-
-//			if (! $notrigger) {
-				// Uncomment this and change MYOBJECT to your own tag if you
-				// want this action calls a trigger.
-
-				// // Call triggers
-				// include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
-				// $interface=new Interfaces($this->db);
-				// $result=$interface->run_triggers('MYOBJECT_CREATE',$this,$user,$langs,$conf);
-				// if ($result < 0) { $error++; $this->errors=$interface->errors; }
-				// // End call triggers
-//			}
-		}
-
-		// Commit or rollback
-		if ($error) {
 			foreach ( $this->errors as $errmsg ) {
-				dol_syslog(get_class($this) . "::create_std " . $errmsg, LOG_ERR);
+				dol_syslog(get_class($this) . "::delete " . $errmsg, LOG_ERR);
 				$this->error .= ($this->error ? ', ' . $errmsg : $errmsg);
 			}
 			$this->db->rollback();
-			return - 1 * $error;
-		} else {
-			$this->db->commit();
-			return $this->id;
+			return - 1;
 		}
+	
+		$this->db->commit();
+		return 1;
 	}
-
+	
 	/**
-	 *	Update object into database
+	 * Load an object from its id and create a new one in database
 	 *
-	 *	@param	User	$user      		Object user that create
-	 *	@param  int		$notrigger		1=Does not execute triggers, 0 otherwise
-	 *	@return	int						<0 if KO, >0 if OK
+	 * @param int $fromid Id of object to clone
+	 *       
+	 * @return int New id of clone
 	 */
-	function update($user = 0, $notrigger = 0)
-	{
+	public function createFromClone($fromid) {
+		dol_syslog(__METHOD__, LOG_DEBUG);
+		
+		global $user;
 		$error = 0;
-
-		// Clean parameters
-		if (isset($this->doc_type))
-			$this->doc_type = trim($this->doc_type);
-		if (isset($this->doc_ref))
-			$this->doc_ref = trim($this->doc_ref);
-		if (isset($this->fk_doc))
-			$this->fk_doc = trim($this->fk_doc);
-		if (isset($this->fk_docdet))
-			$this->fk_docdet = trim($this->fk_docdet);
-		if (isset($this->code_tiers))
-			$this->code_tiers = trim($this->code_tiers);
-		if (isset($this->numero_compte))
-			$this->numero_compte = trim($this->numero_compte);
-		if (isset($this->label_compte))
-			$this->label_compte = trim($this->label_compte);
-		if (isset($this->debit))
-			$this->debit = trim($this->debit);
-		if (isset($this->credit))
-			$this->credit = trim($this->credit);
-		if (isset($this->montant))
-			$this->montant = trim($this->montant);
-		if (isset($this->sens))
-			$this->sens = trim($this->sens);
-		if (isset($this->fk_user_author))
-			$this->fk_user_author = trim($this->fk_user_author);
-		if (isset($this->import_key))
-			$this->import_key = trim($this->import_key);
-		if (isset($this->code_journal))
-			$this->code_journal = trim($this->code_journal);
-		if (isset($this->piece_num))
-			$this->piece_num = trim($this->piece_num);
-
-		// Check parameters
-		// Put here code to add a control on parameters values
-
-		// Update request
-		$sql = "UPDATE " . MAIN_DB_PREFIX . "accounting_bookkeeping SET";
-
-		$sql .= " doc_date=" . (dol_strlen($this->doc_date) != 0 ? "'" . $this->db->idate($this->doc_date) . "'" : 'null') . ",";
-		$sql .= " doc_type=" . (isset($this->doc_type) ? "'" . $this->db->escape($this->doc_type) . "'" : "null") . ",";
-		$sql .= " doc_ref=" . (isset($this->doc_ref) ? "'" . $this->db->escape($this->doc_ref) . "'" : "null") . ",";
-		$sql .= " fk_doc=" . (isset($this->fk_doc) ? $this->fk_doc : "null") . ",";
-		$sql .= " fk_docdet=" . (isset($this->fk_docdet) ? $this->fk_docdet : "null") . ",";
-		$sql .= " code_tiers=" . (isset($this->code_tiers) ? "'" . $this->db->escape($this->code_tiers) . "'" : "null") . ",";
-		$sql .= " numero_compte=" . (isset($this->numero_compte) ? "'" . $this->db->escape($this->numero_compte) . "'" : "null") . ",";
-		$sql .= " label_compte=" . (isset($this->label_compte) ? "'" . $this->db->escape($this->label_compte) . "'" : "null") . ",";
-		$sql .= " debit=" . (isset($this->debit) ? $this->debit : "null") . ",";
-		$sql .= " credit=" . (isset($this->credit) ? $this->credit : "null") . ",";
-		$sql .= " montant=" . (isset($this->montant) ? $this->montant : "null") . ",";
-		$sql .= " sens=" . (isset($this->sens) ? "'" . $this->db->escape($this->sens) . "'" : "null") . ",";
-		$sql .= " fk_user_author=" . (isset($this->fk_user_author) ? $this->fk_user_author : "null") . ",";
-		$sql .= " import_key=" . (isset($this->import_key) ? "'" . $this->db->escape($this->import_key) . "'" : "null") . ",";
-		$sql .= " code_journal=" . (isset($this->code_journal) ? "'" . $this->db->escape($this->code_journal) . "'" : "null") . ",";
-		$sql .= " piece_num=" . (isset($this->piece_num) ? $this->piece_num : "null") . "";
-
-		$sql .= " WHERE rowid=" . $this->id;
-
+		$object = new Accountingbookkeeping($this->db);
+		
 		$this->db->begin();
-
-		dol_syslog(get_class($this) . "::update sql=" . $sql, LOG_DEBUG);
-		$resql = $this->db->query($sql);
-		if (! $resql) {
+		
+		// Load source object
+		$object->fetch($fromid);
+		// Reset object
+		$object->id = 0;
+		
+		// Clear fields
+		// ...
+		
+		// Create clone
+		$result = $object->create($user);
+		
+		// Other options
+		if ($result < 0) {
 			$error ++;
-			$this->errors[] = "Error " . $this->db->lasterror();
+			$this->errors = $object->errors;
+			dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR);
 		}
-
-//		if (! $error) {
-//			if (! $notrigger) {
-				// Uncomment this and change MYOBJECT to your own tag if you
-				// want this action calls a trigger.
-
-				// // Call triggers
-				// include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
-				// $interface=new Interfaces($this->db);
-				// $result=$interface->run_triggers('MYOBJECT_MODIFY',$this,$user,$langs,$conf);
-				// if ($result < 0) { $error++; $this->errors=$interface->errors; }
-				// // End call triggers
-//			}
-//		}
-
-		// Commit or rollback
-		if ($error) {
-			foreach ( $this->errors as $errmsg ) {
-				dol_syslog(get_class($this) . "::update " . $errmsg, LOG_ERR);
-				$this->error .= ($this->error ? ', ' . $errmsg : $errmsg);
-			}
+		
+		// End
+		if (! $error) {
+			$this->db->commit();
+			
+			return $object->id;
+		} else {
 			$this->db->rollback();
-			return - 1 * $error;
+			
+			return - 1;
+		}
+	}
+	
+	/**
+	 * Initialise object with example values
+	 * Id must be 0 if object instance is a specimen
+	 *
+	 * @return void
+	 */
+	public function initAsSpecimen() {
+		$this->id = 0;
+		
+		$this->doc_date = '';
+		$this->doc_type = '';
+		$this->doc_ref = '';
+		$this->fk_doc = '';
+		$this->fk_docdet = '';
+		$this->code_tiers = '';
+		$this->numero_compte = '';
+		$this->label_compte = '';
+		$this->debit = '';
+		$this->credit = '';
+		$this->montant = '';
+		$this->sens = '';
+		$this->fk_user_author = '';
+		$this->import_key = '';
+		$this->code_journal = '';
+		$this->piece_num = '';
+	}
+	
+	/**
+	 * Load an accounting document into memory from database
+	 *
+	 * @param int $piecenum Accounting document to get
+	 * @return int <0 if KO, >0 if OK
+	 */
+	public function fetchPerMvt($piecenum) {
+		$sql = "SELECT piece_num,doc_date,code_journal,doc_ref,doc_type";
+		$sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element;
+		$sql .= " WHERE piece_num = " . $piecenum;
+		
+		$result = $this->db->query($sql);
+		if ($result) {
+			$obj = $this->db->fetch_object($result);
+			
+			$this->piece_num = $obj->piece_num;
+			$this->code_journal = $obj->code_journal;
+			$this->doc_date = $this->db->jdate($obj->doc_date);
+			$this->doc_ref = $obj->doc_ref;
+			$this->doc_type = $obj->doc_type;
 		} else {
-			$this->db->commit();
-			return 1;
+			$this->error = "Error " . $this->db->lasterror();
+			dol_syslog(get_class($this) . "::".__METHOD__ . $this->error, LOG_ERR);
+			return - 1;
 		}
+		
+		return 1;
 	}
-
+	
 	/**
-	 *	Delete object in database
+	 * Return next number movement
 	 *
-	 *	@param	User	$user      		Object user that create
-	 *	@param  int		$notrigger		1=Does not execute triggers, 0 otherwise
-	 *	@return	int						<0 if KO, >0 if OK
+	 * @return string Last number
 	 */
-	function delete($user, $notrigger = 0)
-	{
-		$error = 0;
-
-		$this->db->begin();
-
-//		if (! $notrigger)
-//		{
-//			// Call trigger
-//			$result=$this->call_trigger('ACCOUNTING_NUMPIECE_DELETE',$user);
-//			if ($result < 0) $error++;
-//            // End call triggers
-//		}
-
-		if (! $error) {
-			$sql = "DELETE FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping";
-			$sql .= " WHERE rowid=" . $this->id;
-
-			dol_syslog(get_class($this) . "::delete sql=" . $sql);
-			$resql = $this->db->query($sql);
-			if (! $resql) {
-				$error ++;
-				$this->errors[] = "Error " . $this->db->lasterror();
-			}
+	public function getNextNumMvt() {
+		$sql = "SELECT MAX(piece_num)+1 as max FROM " . MAIN_DB_PREFIX . $this->table_element;
+		
+		dol_syslog(get_class($this) . "getNextNumMvt sql=" . $sql, LOG_DEBUG);
+		$result = $this->db->query($sql);
+		
+		if ($result) {
+			$obj = $this->db->fetch_object($result);
+			
+			return $obj->max;
+		} else {
+			$this->error = "Error " . $this->db->lasterror();
+			dol_syslog(get_class($this) . "::getNextNumMvt " . $this->error, LOG_ERR);
+			return - 1;
 		}
-
-		// Commit or rollback
-		if ($error) {
-			foreach ( $this->errors as $errmsg ) {
-				dol_syslog(get_class($this) . "::delete " . $errmsg, LOG_ERR);
-				$this->error .= ($this->error ? ', ' . $errmsg : $errmsg);
+	}
+	
+	/**
+	 * Load all informations of accountancy document
+	 *
+	 * @param int $piecenum id of line to get
+	 * @return int <0 if KO, >0 if OK
+	 */
+	function fetch_all_per_mvt($piecenum) {
+		$sql = "SELECT rowid, doc_date, doc_type,";
+		$sql .= " doc_ref, fk_doc, fk_docdet, code_tiers,";
+		$sql .= " numero_compte, label_compte, debit, credit,";
+		$sql .= " montant, sens, fk_user_author, import_key, code_journal, piece_num";
+		$sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element;
+		$sql .= " WHERE piece_num = " . $piecenum;
+		
+		dol_syslog(get_class($this) . "fetch_all_per_mvt sql=" . $sql, LOG_DEBUG);
+		$result = $this->db->query($sql);
+		if ($result) {
+			
+			while ( $obj = $this->db->fetch_object($result) ) {
+				
+				$line = new BookKeepingLine();
+				
+				$line->id = $obj->rowid;
+				
+				$line->doc_date = $this->db->jdate($obj->doc_date);
+				$line->doc_type = $obj->doc_type;
+				$line->doc_ref = $obj->doc_ref;
+				$line->fk_doc = $obj->fk_doc;
+				$line->fk_docdet = $obj->fk_docdet;
+				$line->code_tiers = $obj->code_tiers;
+				$line->numero_compte = $obj->numero_compte;
+				$line->label_compte = $obj->label_compte;
+				$line->debit = $obj->debit;
+				$line->credit = $obj->credit;
+				$line->montant = $obj->montant;
+				$line->sens = $obj->sens;
+				$line->code_journal = $obj->code_journal;
+				$line->piece_num = $obj->piece_num;
+				
+				$this->linesmvt[] = $line;
 			}
-			$this->db->rollback();
-			return - 1 * $error;
-		}
-		else
-		{
-			$this->db->commit();
-			return 1;
+		} else {
+			$this->error = "Error " . $this->db->lasterror();
+			dol_syslog(get_class($this) . "::fetch_per_mvt " . $this->error, LOG_ERR);
+			return - 1;
 		}
+		
+		return 1;
 	}
-
+	
 	/**
-	 * Delete bookkepping by importkey
+	 * Export bookkeping
 	 *
 	 * @param	string	$model		Model
 	 * @return	int					Result
@@ -694,21 +1088,21 @@ class BookKeeping extends CommonObject
 		$sql .= " doc_ref, fk_doc, fk_docdet, code_tiers,";
 		$sql .= " numero_compte, label_compte, debit, credit,";
 		$sql .= " montant, sens, fk_user_author, import_key, code_journal, piece_num";
-		$sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping";
-
+		$sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element;
+	
 		dol_syslog(get_class($this) . "::export_bookkeping", LOG_DEBUG);
-
+	
 		$resql = $this->db->query($sql);
-
+	
 		if ($resql) {
 			$this->linesexport = array ();
-
+	
 			$num = $this->db->num_rows($resql);
 			while ( $obj = $this->db->fetch_object($resql) ) {
 				$line = new BookKeepingLine();
-
+	
 				$line->id = $obj->rowid;
-
+	
 				$line->doc_date = $this->db->jdate($obj->doc_date);
 				$line->doc_type = $obj->doc_type;
 				$line->doc_ref = $obj->doc_ref;
@@ -723,11 +1117,11 @@ class BookKeeping extends CommonObject
 				$line->sens = $obj->sens;
 				$line->code_journal = $obj->code_journal;
 				$line->piece_num = $obj->piece_num;
-
+	
 				$this->linesexport[] = $line;
 			}
 			$this->db->free($resql);
-
+	
 			return $num;
 		}
 		else
@@ -744,20 +1138,21 @@ class BookKeeping extends CommonObject
  */
 class BookKeepingLine
 {
-	var $id;
-	var $doc_date;
-	var $doc_type;
-	var $doc_ref;
-	var $fk_doc;
-	var $fk_docdet;
-	var $code_tiers;
-	var $numero_compte;
-	var $label_compte;
-	var $debit;
-	var $credit;
-	var $montant;
-	var $sens;
-	var $fk_user_author;
-	var $code_journal;
-	var $piece_num;
+	public $id;
+	public $doc_date = '';
+	public $doc_type;
+	public $doc_ref;
+	public $fk_doc;
+	public $fk_docdet;
+	public $code_tiers;
+	public $numero_compte;
+	public $label_compte;
+	public $debit;
+	public $credit;
+	public $montant;
+	public $sens;
+	public $fk_user_author;
+	public $import_key;
+	public $code_journal;
+	public $piece_num;
 }
diff --git a/htdocs/accountancy/class/html.formventilation.class.php b/htdocs/accountancy/class/html.formventilation.class.php
index 5e838fb475fc1aeefa3c7107ea84fb4112125dd9..f2fb6caea488b1d871af4e407df4eefd9d8ad2c3 100644
--- a/htdocs/accountancy/class/html.formventilation.class.php
+++ b/htdocs/accountancy/class/html.formventilation.class.php
@@ -37,8 +37,7 @@ class FormVentilation extends Form
      *
      * @param		DoliDB		$db      Database handler
      */
-	public function __construct($db)
-    {
+	public function __construct($db) {
         $this->db = $db;
     }
 
@@ -49,8 +48,7 @@ class FormVentilation extends Form
 	 *	@param	string	$selectedkey	Value
 	 *	@return	string					HTML edit field
 	 */
-	function select_bookkeeping_importkey($htmlname = 'importkey', $selectedkey='')
-	{
+	function select_bookkeeping_importkey($htmlname = 'importkey', $selectedkey = '') {
 		$sql  = 'SELECT DISTINCT import_key from ' . MAIN_DB_PREFIX . 'accounting_bookkeeping';
 		$sql .= ' ORDER BY import_key DESC';
 
@@ -94,12 +92,11 @@ class FormVentilation extends Form
 	 *  @param	array	$event			Event options
      *	@param	int		$select_in		$selectid value is a aa.rowid (0 default) or aa.account_number (1)
      *	@param	int		$select_out		set value returned by select 0=rowid (default), 1=account_number
-     *	@param	int		$aabase			set accounting_account base class to display empty=all or from 1 to 8 will display only account beginning by
+	 * @param int $aabase set accountingaccount base class to display empty=all or from 1 to 8 will display only account beginning by
      *
 	 *	@return	string					String with HTML select
 	 */
-	function select_account($selectid, $htmlname = 'account', $showempty = 0, $event = array(), $select_in = 0, $select_out = 0, $aabase = '')
-	{
+	function select_account($selectid, $htmlname = 'account', $showempty = 0, $event = array(), $select_in = 0, $select_out = 0, $aabase = '') {
 		global $conf;
 
 		$out = '';
@@ -128,10 +125,14 @@ class FormVentilation extends Form
 					$obj = $this->db->fetch_object($resql);
 					$label = $obj->account_number . ' - ' . $obj->label;
 					$label = dol_trunc($label, $trunclength);
-					if ($select_in == 0 )  $select_value_in =  $obj->rowid;
-					if ($select_in == 1 )  $select_value_in =  $obj->account_number;
-					if ($select_out == 0 ) $select_value_out = $obj->rowid;
-					if ($select_out == 1 ) $select_value_out = $obj->account_number;
+					if ($select_in == 0)
+						$select_value_in = $obj->rowid;
+					if ($select_in == 1)
+						$select_value_in = $obj->account_number;
+					if ($select_out == 0)
+						$select_value_out = $obj->rowid;
+					if ($select_out == 1)
+						$select_value_out = $obj->account_number;
 					// Remember guy's we store in database llx_facturedet the rowid of accounting_account and not the account_number
 					// Because same account_number can be share between different accounting_system and do have the same meaning
 					if (($selectid != '') && $selectid == $select_value_in) {
@@ -164,8 +165,7 @@ class FormVentilation extends Form
      *
 	 *	@return	string					String with HTML select
 	 */
-	function select_pcgtype($selectid, $htmlname = 'pcg_type', $showempty = 0, $event = array())
-	{
+	function select_pcgtype($selectid, $htmlname = 'pcg_type', $showempty = 0, $event = array()) {
 		global $conf;
 
 		$out = '';
@@ -220,8 +220,7 @@ class FormVentilation extends Form
      *
 	 *	@return	string					String with HTML select
 	 */
-	function select_pcgsubtype($selectid, $htmlname = 'pcg_subtype', $showempty = 0, $event = array())
-	{
+	function select_pcgsubtype($selectid, $htmlname = 'pcg_subtype', $showempty = 0, $event = array()) {
 		global $conf;
 
 		$out = '';
@@ -342,4 +341,66 @@ class FormVentilation extends Form
 		
 		return $out;
 	}
+	
+	/**
+	 * Return HTML combo list of years existing into book keepping
+	 *
+	 * @param string $selected Preselected value
+	 * @param string $htmlname Name of HTML select object
+	 * @param int $useempty Affiche valeur vide dans liste
+	 * @param string $output_format (html/opton (for option html only)/array (to return options arrays
+	 * @return string/array
+	 */
+	function selectyear_accountancy_bookkepping($selected = '', $htmlname = 'yearid', $useempty = 0, $output_format = 'html') {
+		$out = '';
+		$out_array = array ();
+	
+		if ($output_format == 'html') {
+			$out .= '<select class="flat" placeholder="aa" id="' . $htmlname . '" name="' . $htmlname . '"' . $option . ' >';
+		}
+		if ($useempty) {
+			$selected_html = '';
+			if ($selected == '') {
+				$selected_html = ' selected';
+			}
+			if ($output_format == 'html' || $output_format == 'options') {
+				$out .= '<option value=""' . $selected_html . '>&nbsp;</option>';
+			} elseif ($output_format == 'array') {
+				$out_array[''] = '';
+			}
+		}
+	
+		$sql = "SELECT DISTINCT date_format(doc_date,'%Y') as dtyear";
+		$sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping";
+		$sql .= " ORDER BY doc_date";
+		dol_syslog(get_class($this) . "::".__METHOD__, LOG_DEBUG);
+		$resql = $this->db->query($sql);
+		if ($resql) {
+			while ( $obj = $this->db->fetch_object($resql) ) {
+				$selected_html = '';
+				if ($selected > 0 && $obj->dtyear == $selected)
+					$selected_html = ' selected';
+					if ($output_format == 'html' || $output_format == 'options') {
+						$out .= '<option value="' . $obj->dtyear . '"' . $selected_html . ' >' . $obj->dtyear . '</option>';
+					} elseif ($output_format == 'array') {
+						$out_array[$obj->dtyear] = $obj->dtyear;
+					}
+			}
+		} else {
+			$this->error = "Error " . $this->db->lasterror();
+			dol_syslog(get_class($this) . "::".__METHOD__ . $this->error, LOG_ERR);
+			return - 1;
+		}
+		$this->db->free($resql);
+	
+		if ($output_format == 'html') {
+			$out .= "</select>\n";
+		}
+	
+		if ($output_format == 'html' || $output_format == 'options') {
+			return $out;
+		} elseif ($output_format == 'array') {
+			return $out_array;
+		}
+	}
 }
diff --git a/htdocs/accountancy/customer/lines.php b/htdocs/accountancy/customer/lines.php
index 4c2b8ee7686480ceff9e5d08fddb71f73c23753a..3c899fcdd8530bf29d587b935cd7ef57b19420bd 100644
--- a/htdocs/accountancy/customer/lines.php
+++ b/htdocs/accountancy/customer/lines.php
@@ -238,7 +238,7 @@ if ($result) {
 	print '<td class="liste_titre"><input type="text" class="flat" size="15" 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="center"><input type="text" class="flat" size="8" 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"><input type="text" class="flat" size="5" name="search_vat" value="' . $search_vat . '">%</td>';
 	print '<td class="liste_titre" align="center"><input type="text" class="flat" size="15" name="search_account" value="' . $search_account . '"></td>';
 	print '<td class="liste_titre" colspan="2">&nbsp;</td>';
 	print '<td class="liste_titre" align="center"><input type="image" class="liste_titre" name="button_search" src="'.img_picto($langs->trans("Search"),'search.png','','',1).'" value="'.dol_escape_htmltag($langs->trans("Search")).'" title="'.dol_escape_htmltag($langs->trans("Search")).'">';
diff --git a/htdocs/accountancy/customer/list.php b/htdocs/accountancy/customer/list.php
index 7c025c8a893d92554f27dd45bde56b4f26a67b89..cf47c0e4fcea56b844e7a5e8d9809921e37e3ef4 100644
--- a/htdocs/accountancy/customer/list.php
+++ b/htdocs/accountancy/customer/list.php
@@ -1,6 +1,6 @@
 <?php
 /* Copyright (C) 2013-2014 Olivier Geffroy      <jeff@jeffinfo.com>
- * Copyright (C) 2013-2015 Alexandre Spangaro	<aspangaro.dolibarr@gmail.com>
+ * Copyright (C) 2013-2016 Alexandre Spangaro	<aspangaro.dolibarr@gmail.com>
  * Copyright (C) 2014-2015 Ari Elbaz (elarifr)	<github@accedinfo.com>
  * Copyright (C) 2013-2014 Florian Henry		<florian.henry@open-concept.pro>
  * Copyright (C) 2014	   Juanjo Menent		<jmenent@2byte.es>
@@ -149,7 +149,7 @@ if ($action == 'ventil' && !empty($btn_ventil)) {
 			
 			dol_syslog("/accountancy/customer/list.php sql=" . $sql, LOG_DEBUG);
 			if ($db->query($sql)) {
-				print '<div><font color="green">' . $langs->trans("Lineofinvoice") . ' ' . $monId . ' ' . $langs->trans("VentilatedinAccount") . ' : ' . $monCompte . '</font></div>';
+				print '<div><font color="green">' . $langs->trans("Lineofinvoice") . ' ' . $monId . ' - ' . $langs->trans("VentilatedinAccount") . ' : ' . $monCompte . '</font></div>';
 			} else {
 				print '<div><font color="red">' . $langs->trans("ErrorDB") . ' : ' . $langs->trans("Lineofinvoice") . ' ' . $monId . ' ' . $langs->trans("NotVentilatedinAccount") . ' : ' . $monCompte . '<br/> <pre>' . $sql . '</pre></font></div>';
 			}
@@ -228,6 +228,9 @@ if ($result) {
 	
 	print_barre_liste($langs->trans("InvoiceLines"), $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, '', $num_lines);
 	print '<br><b>' . $langs->trans("DescVentilTodoCustomer") . '</b></br>';
+	print_liste_field_titre($langs->trans("Date"), $_SERVER["PHP_SELF"], "f.datef", "", $param, '', $sortfield, $sortorder);
+	print '&nbsp;&nbsp;';
+	print_liste_field_titre($langs->trans("RowId"), $_SERVER["PHP_SELF"], "l.rowid", "", $param, '', $sortfield, $sortorder);
 
 	print '<form action="' . $_SERVER["PHP_SELF"] . '" method="post">' . "\n";
 	print '<input type="hidden" name="action" value="ventil">';
@@ -254,7 +257,7 @@ if ($result) {
 	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"><input type="text" class="flat" size="5" name="search_vat" value="' . $search_vat . '">%</td>';
 	print '<td align="right" class="liste_titre" colspan="4">';
 	print '<input type="image" class="liste_titre" src="' . img_picto($langs->trans("Search"), 'search.png', '', '', 1) . '" name="button_search" value="' . dol_escape_htmltag($langs->trans("Search")) . '" title="' . dol_escape_htmltag($langs->trans("Search")) . '">';
 	print '&nbsp;';
diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php
index b33becb3f473e4fb7ade751f9d0520dd4513959c..607eb469b6f666e1bfaf0d28be7ec37c640117a4 100644
--- a/htdocs/accountancy/journal/bankjournal.php
+++ b/htdocs/accountancy/journal/bankjournal.php
@@ -4,7 +4,7 @@
  * Copyright (C) 2011		Juanjo Menent		<jmenent@2byte.es>
  * Copyright (C) 2012		Regis Houssin		<regis@dolibarr.fr>
  * Copyright (C) 2013		Christophe Battarel	<christophe.battarel@altairis.fr>
- * Copyright (C) 2013-2015  Alexandre Spangaro	<aspangaro.dolibarr@gmail.com>
+ * Copyright (C) 2013-2016  Alexandre Spangaro	<aspangaro.dolibarr@gmail.com>
  * Copyright (C) 2013-2014  Florian Henry		<florian.henry@open-concept.pro>
  * Copyright (C) 2013-2014  Olivier Geffroy		<jeff@jeffinfo.com>
  *
@@ -343,7 +343,7 @@ if ($action == 'writebookkeeping')
 				}
 			}
 
-			$result = $bookkeeping->create();
+			$result = $bookkeeping->create($user);
 			if ($result < 0) {
 				$error ++;
 				setEventMessages($object->error, $object->errors, 'errors');
@@ -421,7 +421,7 @@ if ($action == 'writebookkeeping')
 				$bookkeeping->numero_compte = $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER;
 			}
 
-			$result = $bookkeeping->create();
+			$result = $bookkeeping->create($user);
 			if ($result < 0) {
 				$error ++;
 				setEventMessages($object->error, $object->errors, 'errors');
@@ -571,7 +571,7 @@ else
 
 	llxHeader('', $langs->trans("FinanceJournal"));
 
-	$nom = $langs->trans("FinanceJournal" . ' - ' . $journal);
+	$nom = $langs->trans("FinanceJournal") . ' - ' . $journal;
 	$builddate = time();
 	$description = $langs->trans("DescFinanceJournal") . '<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);
diff --git a/htdocs/accountancy/journal/purchasesjournal.php b/htdocs/accountancy/journal/purchasesjournal.php
index 2346df27c7738227d08b79a99d01bc46f7fa78eb..b9f6fe2d5429925496609331b1a7431200429240 100644
--- a/htdocs/accountancy/journal/purchasesjournal.php
+++ b/htdocs/accountancy/journal/purchasesjournal.php
@@ -182,7 +182,7 @@ if ($action == 'writebookkeeping') {
 			$bookkeeping->code_journal = $conf->global->ACCOUNTING_PURCHASE_JOURNAL;
 			$bookkeeping->fk_user_author = $user->id;
 
-			$result = $bookkeeping->create();
+			$result = $bookkeeping->create($user);
 			if ($result < 0) {
 				$error ++;
 				setEventMessages($object->error, $object->errors, 'errors');
@@ -212,7 +212,7 @@ if ($action == 'writebookkeeping') {
 					$bookkeeping->code_journal = $conf->global->ACCOUNTING_PURCHASE_JOURNAL;
 					$bookkeeping->fk_user_author = $user->id;
 
-					$result = $bookkeeping->create();
+					$result = $bookkeeping->create($user);
 					if ($result < 0) {
 						$error ++;
 						setEventMessages($object->error, $object->errors, 'errors');
@@ -243,7 +243,7 @@ if ($action == 'writebookkeeping') {
 				$bookkeeping->code_journal = $conf->global->ACCOUNTING_PURCHASE_JOURNAL;
 				$bookkeeping->fk_user_author = $user->id;
 
-				$result = $bookkeeping->create();
+				$result = $bookkeeping->create($user);
 				if ($result < 0) {
 					$error ++;
 					setEventMessages($object->error, $object->errors, 'errors');
diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php
index b0ebc8e8df7abf79c1d9280fbaf688ff885e61fc..1c7ef749e3317b1a9e53b786c671cc253397311f 100644
--- a/htdocs/accountancy/journal/sellsjournal.php
+++ b/htdocs/accountancy/journal/sellsjournal.php
@@ -217,7 +217,7 @@ if ($action == 'writebookkeeping')
 			$bookkeeping->code_journal = $conf->global->ACCOUNTING_SELL_JOURNAL;
 			$bookkeeping->fk_user_author = $user->id;
 
-			$result = $bookkeeping->create();
+			$result = $bookkeeping->create($user);
 			if ($result < 0) {
 				$error ++;
 				setEventMessages($object->error, $object->errors, 'errors');
@@ -247,7 +247,7 @@ if ($action == 'writebookkeeping')
 					$bookkeeping->code_journal = $conf->global->ACCOUNTING_SELL_JOURNAL;
 					$bookkeeping->fk_user_author = $user->id;
 
-					$result = $bookkeeping->create();
+					$result = $bookkeeping->create($user);
 					if ($result < 0) {
 						$error ++;
 						setEventMessages($object->error, $object->errors, 'errors');
@@ -279,7 +279,7 @@ if ($action == 'writebookkeeping')
 				$bookkeeping->code_journal = $conf->global->ACCOUNTING_SELL_JOURNAL;
 				$bookkeeping->fk_user_author = $user->id;
 
-				$result = $bookkeeping->create();
+				$result = $bookkeeping->create($user);
 				if ($result < 0) {
 					$error ++;
 					setEventMessages($object->error, $object->errors, 'errors');
@@ -531,6 +531,7 @@ if ($action == 'export_csv')
 
 	print "</table>";
 
+	// End of page
 	llxFooter();
 }
 
diff --git a/htdocs/accountancy/supplier/lines.php b/htdocs/accountancy/supplier/lines.php
index 6c2dc69c22ca229e883e7f5399b1187b3c45bbfc..e77c98aae3d8f00e72a531a5d242dc929d930c8e 100644
--- a/htdocs/accountancy/supplier/lines.php
+++ b/htdocs/accountancy/supplier/lines.php
@@ -1,6 +1,6 @@
 <?php
 /* Copyright (C) 2013-2014 Olivier Geffroy		<jeff@jeffinfo.com>
- * Copyright (C) 2013-2015 Alexandre Spangaro	<aspangaro.dolibarr@gmail.com>
+ * Copyright (C) 2013-2016 Alexandre Spangaro	<aspangaro.dolibarr@gmail.com>
  * Copyright (C) 2014-2015 Ari Elbaz (elarifr)	<github@accedinfo.com>  
  * Copyright (C) 2013-2014 Florian Henry		<florian.henry@open-concept.pro>
  * Copyright (C) 2014	   Juanjo Menent		<jmenent@2byte.es>
@@ -225,7 +225,7 @@ if ($result) {
 	print '<td class="liste_titre"><input type="text" class="flat" size="15" 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="center"><input type="text" class="flat" size="8" 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"><input type="text" class="flat" size="5" name="search_vat" value="' . $search_vat . '">%</td>';
 	print '<td class="liste_titre" align="center"><input type="text" class="flat" size="15" name="search_account" value="' . $search_account . '"></td>';
 	print '<td class="liste_titre" colspan="2">&nbsp;</td>';
   print '<td class="liste_titre" align="center"><input type="image" class="liste_titre" name="button_search" src="'.img_picto($langs->trans("Search"),'search.png','','',1).'" value="'.dol_escape_htmltag($langs->trans("Search")).'" title="'.dol_escape_htmltag($langs->trans("Search")).'">';
diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php
index d47c2c924c88c1ddf515d93f0f0c0c1566eee3cc..50356c0539cb934426ef1ba50f80487da1c638a2 100644
--- a/htdocs/accountancy/supplier/list.php
+++ b/htdocs/accountancy/supplier/list.php
@@ -1,6 +1,6 @@
 <?php
 /* Copyright (C) 2013-2014	Olivier Geffroy			<jeff@jeffinfo.com>
- * Copyright (C) 2013-2015	Alexandre Spangaro		<aspangaro.dolibarr@gmail.com>
+ * Copyright (C) 2013-2016	Alexandre Spangaro		<aspangaro.dolibarr@gmail.com>
  * Copyright (C) 2014-2015	Ari Elbaz (elarifr)		<github@accedinfo.com>
  * Copyright (C) 2013-2014	Florian Henry			<florian.henry@open-concept.pro>
  * Copyright (C) 2014		Juanjo Menent			<jmenent@2byte.es>s
@@ -168,7 +168,6 @@ if ($action == 'ventil' && !empty($btn_ventil)) {
 
 /*
  * Supplier Invoice Lines
- *
  */
 
 if (! empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION)) {
@@ -252,11 +251,11 @@ if ($result) {
 	
 	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="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"><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 align="right" colspan="2" class="liste_titre">';
diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php
index 55b9e103474e3759c7b3b75c2569517c81286aad..4f4fa01105d442e1e39b68769b0467343f79c77d 100644
--- a/htdocs/commande/list.php
+++ b/htdocs/commande/list.php
@@ -422,6 +422,7 @@ if ($resql)
                 $notshippable=0;
                 $warning = 0;
                 $text_info='';
+                $text_warning='';
                 $nbprod=0;
                 
                 $numlines = count($generic_commande->lines); // Loop on each line of order
diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php
index 68e35536f1b306152fe2d43cc6e6b7a9c6b0d579..e72ec0d23c3277ec1c3e02cb25d99cedd1f91783 100644
--- a/htdocs/core/menus/standard/eldy.lib.php
+++ b/htdocs/core/menus/standard/eldy.lib.php
@@ -913,33 +913,92 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
 			{
 				$langs->load("accountancy");
 
-				$newmenu->add("/accountancy/customer/index.php?leftmenu=ventil_customer",$langs->trans("CustomersVentilation"),0,$user->rights->accounting->ventilation->read, '', $mainmenu, 'ventil_customer');
-				if (empty($leftmenu) || $leftmenu=="ventil_customer") $newmenu->add("/accountancy/customer/list.php",$langs->trans("ToDispatch"),1,$user->rights->accounting->ventilation->dispatch);
-				if (empty($leftmenu) || $leftmenu=="ventil_customer") $newmenu->add("/accountancy/customer/lines.php",$langs->trans("Dispatched"),1,$user->rights->accounting->ventilation->read);
+				$permtoshowmenu=(! empty($conf->accounting->enabled) || $user->rights->accounting->ventilation->read || $user->rights->accounting->ventilation->dispatch || $user->rights->compta->resultat->lire);
+				$newmenu->add("/accountancy/customer/index.php?leftmenu=accountancy",$langs->trans("MenuAccountancy"), 0, $permtoshowmenu, '', $mainmenu, 'accountancy');
+
+				// Dispatch
+				$newmenu->add("/accountancy/customer/index.php?leftmenu=dispatch_customer&amp;mainmenu=accountancy",$langs->trans("CustomersVentilation"),1,$user->rights->accounting->ventilation->read, '', $mainmenu, 'dispatch_customer');
+					if (empty($leftmenu) || $leftmenu=="dispatch_customer") $newmenu->add("/accountancy/customer/list.php",$langs->trans("ToDispatch"),2,$user->rights->accounting->ventilation->dispatch);
+					if (empty($leftmenu) || $leftmenu=="dispatch_customer") $newmenu->add("/accountancy/customer/lines.php",$langs->trans("Dispatched"),2,$user->rights->accounting->ventilation->read);
 
 				if (! empty($conf->fournisseur->enabled))
 				{
-					$newmenu->add("/accountancy/supplier/index.php?leftmenu=ventil_supplier",$langs->trans("SuppliersVentilation"),0,$user->rights->accounting->ventilation->read, '', $mainmenu, 'ventil_supplier');
-					if (empty($leftmenu) || $leftmenu=="ventil_supplier") $newmenu->add("/accountancy/supplier/list.php",$langs->trans("ToDispatch"),1,$user->rights->accounting->ventilation->dispatch);
-					if (empty($leftmenu) || $leftmenu=="ventil_supplier") $newmenu->add("/accountancy/supplier/lines.php",$langs->trans("Dispatched"),1,$user->rights->accounting->ventilation->read);
+					$newmenu->add("/accountancy/supplier/index.php?leftmenu=dispatch_supplier&amp;mainmenu=accountancy",$langs->trans("SuppliersVentilation"),1,$user->rights->accounting->ventilation->read, '', $mainmenu, 'dispatch_supplier');
+						if (empty($leftmenu) || $leftmenu=="dispatch_supplier") $newmenu->add("/accountancy/supplier/list.php",$langs->trans("ToDispatch"),2,$user->rights->accounting->ventilation->dispatch);
+						if (empty($leftmenu) || $leftmenu=="dispatch_supplier") $newmenu->add("/accountancy/supplier/lines.php",$langs->trans("Dispatched"),2,$user->rights->accounting->ventilation->read);
 				}
+
+				// Journals
+				if(! empty($conf->accounting->enabled) && ! empty($user->rights->accounting->comptarapport->lire) && $mainmenu == 'accountancy')
+				{
+					$newmenu->add('',$langs->trans("Journaux"),1,$user->rights->accounting->comptarapport->lire);
+
+					$sql = "SELECT rowid, label, accountancy_journal";
+					$sql.= " FROM ".MAIN_DB_PREFIX."bank_account";
+					$sql.= " WHERE entity = ".$conf->entity;
+					$sql.= " AND clos = 0";
+					$sql.= " ORDER BY label";
+
+					$resql = $db->query($sql);
+					if ($resql)
+					{
+						$numr = $db->num_rows($resql);
+						$i = 0;
+
+						if ($numr > 0)
+						while ($i < $numr)
+						{
+							$objp = $db->fetch_object($resql);
+							$newmenu->add('/accountancy/journal/bankjournal.php?id_account='.$objp->rowid,$langs->trans("Journal").' - '.$objp->label,2,$user->rights->accounting->comptarapport->lire);
+							$i++;
+						}
+					}
+					else dol_print_error($db);
+					$db->free($resql);
+
+					// Add other journal
+					$newmenu->add("/accountancy/journal/sellsjournal.php?leftmenu=journal",$langs->trans("SellsJournal"),2,$user->rights->accounting->comptarapport->lire);
+					$newmenu->add("/accountancy/journal/purchasesjournal.php?leftmenu=journal",$langs->trans("PurchasesJournal"),2,$user->rights->accounting->comptarapport->lire);
+				}
+
+				// General Ledger
+				$newmenu->add("/accountancy/bookkeeping/list.php?leftmenu=bookkeeping",$langs->trans("Bookkeeping"),1,$user->rights->accounting->mouvements->lire, '', $mainmenu, 'bookkeeping');
+				if (empty($leftmenu) || preg_match('/bookkeeping/',$leftmenu)) $newmenu->add("/accountancy/bookkeeping/listbyyear.php",$langs->trans("ByYear"),2,$user->rights->accounting->mouvements->lire);
+				if (empty($leftmenu) || preg_match('/bookkeeping/',$leftmenu)) $newmenu->add("/accountancy/bookkeeping/balancebymonth.php",$langs->trans("AccountBalanceByMonth"),2,$user->rights->accounting->mouvements->lire);
+
+				// Reports
+				$langs->load("compta");
+
+				$newmenu->add("/compta/resultat/index.php?leftmenu=report&amp;mainmenu=accountancy",$langs->trans("Reportings"),1,$user->rights->accounting->comptarapport->lire, '', $mainmenu, 'ca');
+
+				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/resultat/index.php?leftmenu=report",$langs->trans("ReportInOut"),2,$user->rights->accounting->comptarapport->lire);
+				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/resultat/clientfourn.php?leftmenu=report",$langs->trans("ByCompanies"),3,$user->rights->accounting->comptarapport->lire);
+				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/stats/index.php?leftmenu=report",$langs->trans("ReportTurnover"),2,$user->rights->accounting->comptarapport->lire);
+				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/stats/casoc.php?leftmenu=report",$langs->trans("ByCompanies"),3,$user->rights->accounting->comptarapport->lire);
+				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/stats/cabyuser.php?leftmenu=report",$langs->trans("ByUsers"),3,$user->rights->accounting->comptarapport->lire);
+				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/stats/cabyprodserv.php?leftmenu=report", $langs->trans("ByProductsAndServices"),3,$user->rights->accounting->comptarapport->lire);
+
+				// Admin
+				$langs->load("admin");
+			    $newmenu->add("/accountancy/admin/fiscalyear.php?mainmenu=accountancy", $langs->trans("Fiscalyear"),1,$user->rights->accounting->fiscalyear, '', $mainmenu, 'fiscalyear');
+				$newmenu->add("/accountancy/admin/account.php?mainmenu=accountancy", $langs->trans("Chartofaccounts"),1,$user->rights->accounting->chartofaccount, '', $mainmenu, 'chartofaccount');
 			}
 
-			// Rapports
-			if (! empty($conf->comptabilite->enabled) || ! empty($conf->accounting->enabled))
+			// Comptabilite
+			if (! empty($conf->comptabilite->enabled))
 			{
 				$langs->load("compta");
 
 				// Bilan, resultats
-				$newmenu->add("/compta/resultat/index.php?leftmenu=report&amp;mainmenu=accountancy",$langs->trans("Reportings"),0,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire, '', $mainmenu, 'ca');
+				$newmenu->add("/compta/resultat/index.php?leftmenu=report&amp;mainmenu=accountancy",$langs->trans("Reportings"),0,$user->rights->compta->resultat->lire, '', $mainmenu, 'ca');
 
-				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/resultat/index.php?leftmenu=report",$langs->trans("ReportInOut"),1,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
-				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/resultat/clientfourn.php?leftmenu=report",$langs->trans("ByCompanies"),2,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
+				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/resultat/index.php?leftmenu=report",$langs->trans("ReportInOut"),1,$user->rights->compta->resultat->lire);
+				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/resultat/clientfourn.php?leftmenu=report",$langs->trans("ByCompanies"),2,$user->rights->compta->resultat->lire);
 				/* On verra ca avec module compabilite expert
 				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/resultat/compteres.php?leftmenu=report","Compte de resultat",2,$user->rights->compta->resultat->lire);
 				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/resultat/bilan.php?leftmenu=report","Bilan",2,$user->rights->compta->resultat->lire);
 				*/
-				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/stats/index.php?leftmenu=report",$langs->trans("ReportTurnover"),1,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
+				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/stats/index.php?leftmenu=report",$langs->trans("ReportTurnover"),1,$user->rights->compta->resultat->lire);
 
 				/*
 				 if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/stats/cumul.php?leftmenu=report","Cumule",2,$user->rights->compta->resultat->lire);
@@ -948,74 +1007,14 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
 				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/stats/comp.php?leftmenu=report","Transforme",2,$user->rights->compta->resultat->lire);
 				}
 				*/
-				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/stats/casoc.php?leftmenu=report",$langs->trans("ByCompanies"),2,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
-				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/stats/cabyuser.php?leftmenu=report",$langs->trans("ByUsers"),2,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
-				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/stats/cabyprodserv.php?leftmenu=report", $langs->trans("ByProductsAndServices"),2,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
-
-				if (! empty($conf->comptabilite->enabled))
-				{
-					// Journaux
-					//if ($leftmenu=="ca") $newmenu->add("/compta/journaux/index.php?leftmenu=ca",$langs->trans("Journaux"),1,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
-					//journaux
-					if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/journal/sellsjournal.php?leftmenu=report",$langs->trans("SellsJournal"),1,$user->rights->compta->resultat->lire);
-					if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/journal/purchasesjournal.php?leftmenu=report",$langs->trans("PurchasesJournal"),1,$user->rights->compta->resultat->lire);
-				}
-
-				// Report expert
-				if (! empty($conf->accounting->enabled))
-				{
-					$langs->load("accountancy");
-
-					// Grand livre
-					$newmenu->add("/accountancy/bookkeeping/list.php?leftmenu=bookkeeping",$langs->trans("Bookkeeping"),0,$user->rights->accounting->mouvements->lire, '', $mainmenu, 'bookkeeping');
-					if (empty($leftmenu) || preg_match('/bookkeeping/',$leftmenu)) $newmenu->add("/accountancy/bookkeeping/listbyyear.php",$langs->trans("ByYear"),1,$user->rights->accounting->mouvements->lire);
-					if (empty($leftmenu) || preg_match('/bookkeeping/',$leftmenu)) $newmenu->add("/accountancy/bookkeeping/balancebymonth.php",$langs->trans("AccountBalanceByMonth"),1,$user->rights->accounting->mouvements->lire);
-
-					// Accountancy journals
-					if (! empty($conf->accounting->enabled) && !empty($user->rights->accounting->mouvements->lire) && $mainmenu == 'accountancy')
-					{
-						$newmenu->add('/accountancy/journal/index.php?leftmenu=journal',$langs->trans("Journaux"),0,$user->rights->banque->lire);
-
-						if ($leftmenu == 'journal')
-						{
-							$sql = "SELECT rowid, label, accountancy_journal";
-							$sql.= " FROM ".MAIN_DB_PREFIX."bank_account";
-							$sql.= " WHERE entity = ".$conf->entity;
-							$sql.= " AND clos = 0";
-							$sql.= " ORDER BY label";
-
-							$resql = $db->query($sql);
-							if ($resql)
-							{
-								$numr = $db->num_rows($resql);
-								$i = 0;
-
-								if ($numr > 0)
-
-								while ($i < $numr)
-								{
-									$objp = $db->fetch_object($resql);
-									$newmenu->add('/accountancy/journal/bankjournal.php?id_account='.$objp->rowid,$langs->trans("Journal").' - '.$objp->label,1,$user->rights->accounting->comptarapport->lire);
-									$i++;
-								}
-							}
-							else dol_print_error($db);
-							$db->free($resql);
-
-							// Add other journal
-							$newmenu->add("/accountancy/journal/sellsjournal.php?leftmenu=journal",$langs->trans("SellsJournal"),1,$user->rights->accounting->comptarapport->lire);
-							$newmenu->add("/accountancy/journal/purchasesjournal.php?leftmenu=journal",$langs->trans("PurchasesJournal"),1,$user->rights->accounting->comptarapport->lire);
-						}
-					}
-				}
-			}
-
-			// Setup
-			if (! empty($conf->accounting->enabled))
-			{
-				$langs->load("admin");
-			    $newmenu->add("/accountancy/admin/fiscalyear.php?mainmenu=accountancy", $langs->trans("Fiscalyear"),0,$user->rights->accounting->fiscalyear, '', $mainmenu, 'fiscalyear');
-				$newmenu->add("/accountancy/admin/account.php?mainmenu=accountancy", $langs->trans("Chartofaccounts"),0,$user->rights->accounting->chartofaccount, '', $mainmenu, 'chartofaccount');
+				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/stats/casoc.php?leftmenu=report",$langs->trans("ByCompanies"),2,$user->rights->compta->resultat->lire);
+				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/stats/cabyuser.php?leftmenu=report",$langs->trans("ByUsers"),2,$user->rights->compta->resultat->lire);
+				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/stats/cabyprodserv.php?leftmenu=report", $langs->trans("ByProductsAndServices"),2,$user->rights->compta->resultat->lire);
+
+				// Journaux
+				//if ($leftmenu=="ca") $newmenu->add("/compta/journaux/index.php?leftmenu=ca",$langs->trans("Journaux"),1,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
+				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/journal/sellsjournal.php?leftmenu=report",$langs->trans("SellsJournal"),1,$user->rights->compta->resultat->lire);
+				if (empty($leftmenu) || preg_match('/report/',$leftmenu)) $newmenu->add("/compta/journal/purchasesjournal.php?leftmenu=report",$langs->trans("PurchasesJournal"),1,$user->rights->compta->resultat->lire);
 			}
 		}
 
diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php
index b781d4f3dc691dfcc9543028af3bc44babe4223b..0a85f720c1312d66a182fe845140da6f5de81b95 100644
--- a/htdocs/expensereport/class/expensereport.class.php
+++ b/htdocs/expensereport/class/expensereport.class.php
@@ -370,7 +370,7 @@ class ExpenseReport extends CommonObject
     function set_paid($id, $fuser)
     {
         $sql = "UPDATE ".MAIN_DB_PREFIX."expensereport";
-        $sql.= " SET fk_statut = 6";
+        $sql.= " SET fk_statut = 6, paid=1";
         $sql.= " WHERE rowid = ".$id." AND fk_statut = 5";
 
         dol_syslog(get_class($this)."::set_paid sql=".$sql, LOG_DEBUG);
diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang
index d7db34b11052e31b4cd714ed1c2c6c6eacbad398..1103cbeb739bf2e9b245933cb26adfcdbcfe59ad 100644
--- a/htdocs/langs/en_US/accountancy.lang
+++ b/htdocs/langs/en_US/accountancy.lang
@@ -35,6 +35,7 @@ AccountAccounting=Accounting account
 AccountAccountingSuggest=Accounting account suggest
 Ventilation=Breakdown
 
+MenuAccountancy=Accountancy
 CustomersVentilation=Breakdown customers
 SuppliersVentilation=Breakdown suppliers
 TradeMargin=Trade margin
@@ -109,10 +110,6 @@ DelBookKeeping=Delete the records of the general ledger
 
 DescSellsJournal=Sales journal
 DescPurchasesJournal=Purchases journal
-BankJournal=Bank journal
-DescBankJournal=Bank journal including all the types of payments other than cash
-CashJournal=Cash journal
-DescCashJournal=Cash journal including the type of payment cash
 FinanceJournal=Finance journal
 DescFinanceJournal=Finance journal including all the types of payments by bank account
 
diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php
index 2188293a1ba76ca3ba13e36d7dad6c181459e442..749899e345c056a89a6fdfde3e3aa3dbe8a895a9 100644
--- a/htdocs/product/class/product.class.php
+++ b/htdocs/product/class/product.class.php
@@ -12,6 +12,7 @@
  * Copyright (C) 2014		Henry Florian			<florian.henry@open-concept.pro>
  * Copyright (C) 2014		Philippe Grand			<philippe.grand@atoo-net.com>
  * Copyright (C) 2014		Ion agorria			<ion@agorria.com>
+ * Copyright (C) 2016		Ferran Marcet			<fmarcet@2byte.es>
  *
  * 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
@@ -1673,7 +1674,7 @@ class Product extends CommonObject
 						$sql.= " WHERE entity IN (".getEntity('productprice', 1).")";
 						$sql.= " AND price_level=".$i;
 						$sql.= " AND fk_product = '".$this->id."'";
-						$sql.= " ORDER BY date_price, rowid DESC";
+						$sql.= " ORDER BY date_price DESC, rowid DESC";
 						$sql.= " LIMIT 1";
 						$resql = $this->db->query($sql);
 						if ($resql)
diff --git a/htdocs/product/fournisseurs.php b/htdocs/product/fournisseurs.php
index 1f5e35a043a1351fadb821ec79a522e80daa2a84..0fe2769803d76ee637e12f8e302de90b65d00d6f 100644
--- a/htdocs/product/fournisseurs.php
+++ b/htdocs/product/fournisseurs.php
@@ -7,6 +7,7 @@
  * Copyright (C) 2012      Christophe Battarel  <christophe.battarel@altairis.fr>
  * Copyright (C) 2014      Ion Agorria          <ion@agorria.com>
  * Copyright (C) 2015      Alexandre Spangaro   <aspangaro.dolibarr@gmail.com>
+ * Copyright (C) 2016      Ferran Marcet		<fmarcet@2byte.es>
  *
  * 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
@@ -46,7 +47,7 @@ $rowid=GETPOST('rowid','int');
 $action=GETPOST('action', 'alpha');
 $cancel=GETPOST('cancel', 'alpha');
 $socid=GETPOST('socid', 'int');
-$cost_price=GETPOST('cost_price', 'int');
+$cost_price=GETPOST('cost_price', 'alpha');
 $backtopage=GETPOST('backtopage','alpha');
 $error=0;