From 8222624ff01b158c5011d4c6e43f8279ec9e479b Mon Sep 17 00:00:00 2001
From: Laurent Destailleur <eldy@destailleur.fr>
Date: Fri, 8 Apr 2016 02:39:57 +0200
Subject: [PATCH] NEW Can select fields to show on list also for list of
 customer orders, shipments and invoices.

---
 dev/skeletons/skeleton_list.php    |  28 +-
 htdocs/comm/propal/list.php        |   8 +-
 htdocs/commande/list.php           | 549 ++++++++++++++++++-----------
 htdocs/compta/facture/list.php     | 408 ++++++++++++++-------
 htdocs/expedition/list.php         | 208 ++++++++---
 htdocs/langs/en_US/deliveries.lang |   1 +
 htdocs/langs/en_US/orders.lang     |   1 +
 7 files changed, 821 insertions(+), 382 deletions(-)

diff --git a/dev/skeletons/skeleton_list.php b/dev/skeletons/skeleton_list.php
index 46111e14716..78f17dc1a63 100644
--- a/dev/skeletons/skeleton_list.php
+++ b/dev/skeletons/skeleton_list.php
@@ -43,7 +43,9 @@ if (! $res && file_exists("../../../dolibarr/htdocs/main.inc.php")) $res=@includ
 if (! $res && file_exists("../../../../dolibarr/htdocs/main.inc.php")) $res=@include '../../../../dolibarr/htdocs/main.inc.php';   // Used on dev env only
 if (! $res) die("Include of main fails");
 // Change this following line to use the correct relative path from htdocs
-include_once(DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php');
+require_once(DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php');
+require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
 dol_include_once('/mymodule/class/skeleton_class.class.php');
 
 // Load traductions files requiredby by page
@@ -396,7 +398,9 @@ if ($resql)
 	print '</tr>'."\n";
         
     
-    $i = 0;
+	$i=0;
+	$var=true;
+	$totalarray=array();
     while ($i < min($num, $limit))
     {
         $obj = $db->fetch_object($resql);
@@ -404,8 +408,16 @@ if ($resql)
         {
             // You can use here results
             print '<tr>';
-            if (! empty($arrayfields['t.field1']['checked'])) print '<td>'.$obj->field1.'</td>';
-            if (! empty($arrayfields['t.field2']['checked'])) print '<td>'.$obj->field2.'</td>';
+            if (! empty($arrayfields['t.field1']['checked'])) 
+            {
+                print '<td>'.$obj->field1.'</td>';
+    		    if (! $i) $totalarray['nbfield']++;
+            }
+            if (! empty($arrayfields['t.field2']['checked'])) 
+            {
+                print '<td>'.$obj->field2.'</td>';
+    		    if (! $i) $totalarray['nbfield']++;
+            }
         	// Extra fields
     		if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label))
     		{
@@ -420,6 +432,7 @@ if ($resql)
     					$tmpkey='options_'.$key;
     					print $extrafields->showOutputField($key, $obj->$tmpkey, '', 1);
     					print '</td>';
+    		            if (! $i) $totalarray['nbfield']++;
     				}
     		   }
     		}
@@ -433,6 +446,7 @@ if ($resql)
                 print '<td align="center">';
                 print dol_print_date($db->jdate($obj->date_creation), 'dayhour');
                 print '</td>';
+    		    if (! $i) $totalarray['nbfield']++;
             }
             // Date modification
             if (! empty($arrayfields['t.tms']['checked']))
@@ -440,6 +454,7 @@ if ($resql)
                 print '<td align="center">';
                 print dol_print_date($db->jdate($obj->date_update), 'dayhour');
                 print '</td>';
+    		    if (! $i) $totalarray['nbfield']++;
             }
             // Status
             /*
@@ -448,9 +463,12 @@ if ($resql)
     		  $userstatic->statut=$obj->statut;
               print '<td align="center">'.$userstatic->getLibStatut(3).'</td>';
             }*/
+
             // Action column
             print '<td></td>';
-    		print '</tr>';
+            if (! $i) $totalarray['nbfield']++;
+
+            print '</tr>';
         }
         $i++;
     }
diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php
index 4aff2989462..3e59a76d7d0 100644
--- a/htdocs/comm/propal/list.php
+++ b/htdocs/comm/propal/list.php
@@ -607,20 +607,20 @@ if ($result)
 	    print '</td>';
 	}
 	// Action column
-	print '<td class="liste_titre" align="right">';
+	print '<td class="liste_titre" align="middle">';
 	$searchpitco=$form->showFilterAndCheckAddButtons(0);
 	print $searchpitco;
 	print '</td>';
 	
 	print "</tr>\n";
 
+	$now = dol_now();
 	$i=0;
 	$var=true;
 	$totalarray=array();
 	while ($i < min($num,$limit))
 	{
 		$obj = $db->fetch_object($result);
-		$now = dol_now();
 		$var=!$var;
 		print '<tr '.$bc[$var].'>';
 		
@@ -669,11 +669,12 @@ if ($result)
 		
 		$url = DOL_URL_ROOT.'/comm/card.php?socid='.$obj->rowid;
 
-		// Company
 		$companystatic->id=$obj->rowid;
 		$companystatic->name=$obj->name;
 		$companystatic->client=$obj->client;
 		$companystatic->code_client=$obj->code_client;
+		
+		// Thirdparty
 		if (! empty($arrayfields['s.nom']['checked']))
 		{
     		print '<td>';
@@ -774,6 +775,7 @@ if ($result)
         
         $userstatic->id=$obj->fk_user_author;
 		$userstatic->login=$obj->login;
+
         // Author
         if (! empty($arrayfields['u.login']['checked']))
         {
diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php
index ffe17e44e2a..1ed03c2f614 100644
--- a/htdocs/commande/list.php
+++ b/htdocs/commande/list.php
@@ -34,6 +34,7 @@
 
 require '../main.inc.php';
 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
@@ -41,6 +42,7 @@ require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
 require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
 
 $langs->load('orders');
+$langs->load('sendings');
 $langs->load('deliveries');
 $langs->load('companies');
 $langs->load('compta');
@@ -95,7 +97,7 @@ $hookmanager->initHooks(array('orderlist'));
 $extrafields = new ExtraFields($db);
 
 // fetch optionals attributes and labels
-$extralabels = $extrafields->fetch_name_optionals_label('order');
+$extralabels = $extrafields->fetch_name_optionals_label('commande');
 $search_array_options=$extrafields->getOptionalsFromPost($extralabels,'','search_');
 
 // List of fields to search into when doing a "search in all"
@@ -118,8 +120,8 @@ $arrayfields=array(
     'state.nom'=>array('label'=>$langs->trans("StateShort"), 'checked'=>0),
     'country.code_iso'=>array('label'=>$langs->trans("Country"), 'checked'=>0),
     'typent.code'=>array('label'=>$langs->trans("ThirdPartyType"), 'checked'=>$checkedtypetiers),
-    'c.date_commande'=>array('label'=>$langs->trans("DateOrder"), 'checked'=>1),
-    'c.date_livraison'=>array('label'=>$langs->trans("DateDelivery"), 'checked'=>1, 'enabled'=>empty($conf->global->ORDER_DISABLE_DELIVERY_DATE)),
+    'c.date_commande'=>array('label'=>$langs->trans("OrderDateShort"), 'checked'=>1),
+    'c.date_delivery'=>array('label'=>$langs->trans("DateDeliveryPlanned"), 'checked'=>1, 'enabled'=>empty($conf->global->ORDER_DISABLE_DELIVERY_DATE)),
     'c.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500),
     'c.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500),
     'c.fk_statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000),
@@ -216,8 +218,12 @@ llxHeader('',$langs->trans("Orders"),$help_url);
 
 $sql = 'SELECT';
 if ($sall || $search_product_category > 0) $sql = 'SELECT DISTINCT';
-$sql.= ' s.nom as name, s.rowid as socid, s.client, s.code_client, c.rowid, c.ref, c.total_ht, c.tva as total_tva, c.total_ttc, c.ref_client,';
-$sql.= ' c.date_valid, c.date_commande, c.note_private, c.date_livraison as date_delivery, c.fk_statut, c.facture as billed';
+$sql.= ' s.rowid as socid, s.nom as name, s.town, s.zip, s.fk_pays, s.client, s.code_client, ';
+$sql.= " typent.code as typent_code,";
+$sql.= " state.code_departement as state_code, state.nom as state_name,";
+$sql.= ' c.rowid, c.ref, c.total_ht, c.tva as total_tva, c.total_ttc, c.ref_client,';
+$sql.= ' c.date_valid, c.date_commande, c.note_private, c.date_livraison as date_delivery, c.fk_statut, c.facture as billed,';
+$sql.= ' c.date_creation as date_creation, c.tms as date_update';
 // Add fields from extrafields
 foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : '');
 // Add fields from hooks
@@ -296,12 +302,16 @@ else if ($deliveryyear > 0)
 {
     $sql.= " AND c.date_livraison BETWEEN '".$db->idate(dol_get_first_day($deliveryyear,1,false))."' AND '".$db->idate(dol_get_last_day($deliveryyear,12,false))."'";
 }
-if (!empty($search_company)) $sql .= natural_search('s.nom', $search_company);
-if (!empty($search_ref_customer)) $sql.= natural_search('c.ref_client', $search_ref_customer);
+if ($search_town)  $sql.= natural_search('s.town', $search_town);
+if ($search_zip)   $sql.= natural_search("s.zip",$search_zip);
+if ($search_state) $sql.= natural_search("state.nom",$search_state);
+if ($search_country) $sql .= " AND s.fk_pays IN (".$search_country.')';
+if ($search_type_thirdparty) $sql .= " AND s.fk_typent IN (".$search_type_thirdparty.')';
+if ($search_company) $sql .= natural_search('s.nom', $search_company);
+if ($search_ref_customer) $sql.= natural_search('c.ref_client', $search_ref_customer);
 if ($search_sale > 0) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$search_sale;
 if ($search_user > 0) $sql.= " AND ec.fk_c_type_contact = tc.rowid AND tc.element='commande' AND tc.source='internal' AND ec.element_id = c.rowid AND ec.fk_socpeople = ".$search_user;
 if ($search_total_ht != '') $sql.= natural_search('c.total_ht', $search_total_ht, 1);
-$sql.= $db->order($sortfield,$sortorder);
 
 // Add where from extra fields
 foreach ($search_array_options as $key => $val)
@@ -321,6 +331,8 @@ $parameters=array();
 $reshook=$hookmanager->executeHooks('printFieldListWhere',$parameters);    // Note that $action and $object may have been modified by hook
 $sql.=$hookmanager->resPrint;
 
+$sql.= $db->order($sortfield,$sortorder);
+
 $nbtotalofrecords = 0;
 if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
 {
@@ -454,7 +466,7 @@ if ($resql)
 	print '<table class="tagtable liste'.($moreforfilter?" listwithfilterbefore":"").'">'."\n";
 
 	print '<tr class="liste_titre">';
-	if (! empty($arrayfields['c.ref']['checked']))            print_liste_field_titre($arrayfields['c.ref']['label'],$_SERVER["PHP_SELF"],'c.ref','',$param,'width="25%"',$sortfield,$sortorder);
+	if (! empty($arrayfields['c.ref']['checked']))            print_liste_field_titre($arrayfields['c.ref']['label'],$_SERVER["PHP_SELF"],'c.ref','',$param,'',$sortfield,$sortorder);
 	if (! empty($arrayfields['c.ref_client']['checked']))     print_liste_field_titre($arrayfields['c.ref_client']['label'],$_SERVER["PHP_SELF"],'c.ref_client','',$param,'',$sortfield,$sortorder);
 	if (! empty($arrayfields['s.nom']['checked']))            print_liste_field_titre($arrayfields['s.nom']['label'],$_SERVER["PHP_SELF"],'s.nom','',$param,'',$sortfield,$sortorder);
 	if (! empty($arrayfields['s.town']['checked']))           print_liste_field_titre($arrayfields['s.town']['label'],$_SERVER["PHP_SELF"],'s.town','',$param,'',$sortfield,$sortorder);
@@ -463,7 +475,7 @@ if ($resql)
 	if (! empty($arrayfields['country.code_iso']['checked'])) print_liste_field_titre($arrayfields['country.code_iso']['label'],$_SERVER["PHP_SELF"],"country.code_iso","",$param,'align="center"',$sortfield,$sortorder);
 	if (! empty($arrayfields['typent.code']['checked']))      print_liste_field_titre($arrayfields['typent.code']['label'],$_SERVER["PHP_SELF"],"typent.code","",$param,'align="center"',$sortfield,$sortorder);
 	if (! empty($arrayfields['c.date_commande']['checked']))  print_liste_field_titre($arrayfields['c.date_commande']['label'],$_SERVER["PHP_SELF"],'c.date_commande','',$param, 'align="center"',$sortfield,$sortorder);
-	if (! empty($arrayfields['c.date_livraison']['checked'])) print_liste_field_titre($arrayfields['c.date_livraison']['label'],$_SERVER["PHP_SELF"],'c.date_livraison','',$param, 'align="center"',$sortfield,$sortorder);
+	if (! empty($arrayfields['c.date_delivery']['checked']))  print_liste_field_titre($arrayfields['c.date_delivery']['label'],$_SERVER["PHP_SELF"],'c.date_livraison','',$param, 'align="center"',$sortfield,$sortorder);
 	if (! empty($arrayfields['c.total_ht']['checked']))       print_liste_field_titre($arrayfields['c.total_ht']['label'],$_SERVER["PHP_SELF"],'c.total_ht','',$param, 'align="right"',$sortfield,$sortorder);
 	if (! empty($arrayfields['c.tva']['checked']))            print_liste_field_titre($arrayfields['c.tva']['label'],$_SERVER["PHP_SELF"],'c.total_vat','',$param, 'align="right"',$sortfield,$sortorder);
 	if (! empty($arrayfields['c.total_ttc']['checked']))      print_liste_field_titre($arrayfields['c.total_ttc']['label'],$_SERVER["PHP_SELF"],'c.total_ttc','',$param, 'align="right"',$sortfield,$sortorder);
@@ -483,7 +495,7 @@ if ($resql)
 	$parameters=array('arrayfields'=>$arrayfields);
     $reshook=$hookmanager->executeHooks('printFieldListTitle',$parameters);    // Note that $action and $object may have been modified by hook
     print $hookmanager->resPrint;
-	if (! empty($arrayfields['c.datec']['checked']))     print_liste_field_titre($arrayfields['c.datec']['label'],$_SERVER["PHP_SELF"],"c.datec","",$param,'align="center" class="nowrap"',$sortfield,$sortorder);
+	if (! empty($arrayfields['c.datec']['checked']))     print_liste_field_titre($arrayfields['c.datec']['label'],$_SERVER["PHP_SELF"],"c.date_creation","",$param,'align="center" class="nowrap"',$sortfield,$sortorder);
 	if (! empty($arrayfields['c.tms']['checked']))       print_liste_field_titre($arrayfields['c.tms']['label'],$_SERVER["PHP_SELF"],"c.tms","",$param,'align="center" class="nowrap"',$sortfield,$sortorder);
 	if (! empty($arrayfields['c.fk_statut']['checked'])) print_liste_field_titre($arrayfields['c.fk_statut']['label'],$_SERVER["PHP_SELF"],"c.fk_statut","",$param,'align="right"',$sortfield,$sortorder);
 	if (! empty($arrayfields['c.facture']['checked']))   print_liste_field_titre($arrayfields['c.facture']['label'],$_SERVER["PHP_SELF"],'c.facture','',$param,'align="center"',$sortfield,$sortorder,'');
@@ -546,7 +558,7 @@ if ($resql)
         $formother->select_year($orderyear?$orderyear:-1,'orderyear',1, 20, 5);
     	print '</td>';
 	}
-	if (! empty($arrayfields['c.date_livraison']['checked'])) 
+	if (! empty($arrayfields['c.date_delivery']['checked'])) 
 	{
     	print '<td class="liste_titre" align="center">';
         if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print '<input class="flat" type="text" size="1" maxlength="2" name="deliveryday" value="'.$deliveryday.'">';
@@ -636,248 +648,391 @@ if ($resql)
 	    print '</td>';
 	}
 	// Action column
-	print '<td class="liste_titre" align="right">';
+	print '<td class="liste_titre" align="middle">';
 	$searchpitco=$form->showFilterAndCheckAddButtons(0);
 	print $searchpitco;
 	print '</td>';
 	
     print "</tr>\n";
 
-	$var=true;
 	$total=0;
 	$subtotal=0;
     $productstat_cache=array();
-    $i=0;
     
     $generic_commande = new Commande($db);
     $generic_product = new Product($db);
+	
+    $i=0;
+	$var=true;
+	$totalarray=array();
     while ($i < min($num,$limit))
     {
-        $objp = $db->fetch_object($resql);
+        $obj = $db->fetch_object($resql);
         $var=!$var;
         print '<tr '.$bc[$var].'>';
-        print '<td class="nowrap">';
-        $generic_commande->id=$objp->rowid;
-        $generic_commande->ref=$objp->ref;
-	    $generic_commande->statut = $objp->fk_statut;
-	    $generic_commande->date_commande = $db->jdate($objp->date_commande);
-	    $generic_commande->date_livraison = $db->jdate($objp->date_delivery);
-        $generic_commande->ref_client = $objp->ref_client;
-        $generic_commande->total_ht = $objp->total_ht;
-        $generic_commande->total_tva = $objp->total_tva;
-        $generic_commande->total_ttc = $objp->total_ttc;
-        $generic_commande->lines=array();
-        $generic_commande->getLinesArray();
-
-        print '<table class="nobordernopadding"><tr class="nocellnopadd">';
-        print '<td class="nobordernopadding nowrap">';
-        print $generic_commande->getNomUrl(1,($viewstatut != 2?0:$objp->fk_statut));
-        print '</td>';
-
-        // Show shippable Icon (create subloop, so may be slow)
-        if ($conf->stock->enabled) 
+
+        if (! empty($arrayfields['c.ref']['checked']))
         {
-            $langs->load("stocks");
-            if (($objp->fk_statut > 0) && ($objp->fk_statut < 3))
+            print '<td class="nowrap">';
+            $generic_commande->id=$obj->rowid;
+            $generic_commande->ref=$obj->ref;
+    	    $generic_commande->statut = $obj->fk_statut;
+    	    $generic_commande->date_commande = $db->jdate($obj->date_commande);
+    	    $generic_commande->date_livraison = $db->jdate($obj->date_delivery);
+            $generic_commande->ref_client = $obj->ref_client;
+            $generic_commande->total_ht = $obj->total_ht;
+            $generic_commande->total_tva = $obj->total_tva;
+            $generic_commande->total_ttc = $obj->total_ttc;
+            $generic_commande->lines=array();
+            $generic_commande->getLinesArray();
+    
+            print '<table class="nobordernopadding"><tr class="nocellnopadd">';
+            print '<td class="nobordernopadding nowrap">';
+            print $generic_commande->getNomUrl(1,($viewstatut != 2?0:$obj->fk_statut));
+            print '</td>';
+    		
+            // Show shippable Icon (create subloop, so may be slow)
+            if ($conf->stock->enabled) 
             {
-                $notshippable=0;
-                $warning = 0;
-                $text_info='';
-                $text_warning='';
-                $nbprod=0;
-                
-                $numlines = count($generic_commande->lines); // Loop on each line of order
-                for ($lig=0; $lig < $numlines; $lig++) 
+                $langs->load("stocks");
+                if (($obj->fk_statut > 0) && ($obj->fk_statut < 3))
                 {
-                    if ($generic_commande->lines[$lig]->product_type == 0 && $generic_commande->lines[$lig]->fk_product > 0)  // If line is a product and not a service
+                    $notshippable=0;
+                    $warning = 0;
+                    $text_info='';
+                    $text_warning='';
+                    $nbprod=0;
+                    
+                    $numlines = count($generic_commande->lines); // Loop on each line of order
+                    for ($lig=0; $lig < $numlines; $lig++) 
                     {
-                        $nbprod++; // order contains real products
-                        $generic_product->id = $generic_commande->lines[$lig]->fk_product;
-                        if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product])) {
-                            $generic_product->load_stock();
-                            $generic_product->load_virtual_stock();
-                            $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_reel;
-                            $productstat_cachevirtual[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_theorique;
-                        } else {
-                            $generic_product->stock_reel = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stock_reel'];
-                            $generic_product->stock_theorique = $productstat_cachevirtual[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_theorique;
-                        }
-                        
-                        if (empty($conf->global->SHIPPABLE_ORDER_ICON_IN_LIST))  // Default code is when this option is not set, setting it create strange result
+                        if ($generic_commande->lines[$lig]->product_type == 0 && $generic_commande->lines[$lig]->fk_product > 0)  // If line is a product and not a service
                         {
-                            $text_info .= $generic_commande->lines[$lig]->qty.' X '.$generic_commande->lines[$lig]->ref.'&nbsp;'.dol_trunc($generic_commande->lines[$lig]->product_label, 25);
-                            $text_info .= ' - '.$langs->trans("Stock").': '.$generic_product->stock_reel;
-                            $text_info .= ' - '.$langs->trans("VirtualStock").': '.$generic_product->stock_theorique;
-                            $text_info .= '<br>';
-                            
-                            if ($generic_commande->lines[$lig]->qty > $generic_product->stock_reel) 
-                            {
-                                $notshippable++;
+                            $nbprod++; // order contains real products
+                            $generic_product->id = $generic_commande->lines[$lig]->fk_product;
+                            if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product])) {
+                                $generic_product->load_stock();
+                                $generic_product->load_virtual_stock();
+                                $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_reel;
+                                $productstat_cachevirtual[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_theorique;
+                            } else {
+                                $generic_product->stock_reel = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stock_reel'];
+                                $generic_product->stock_theorique = $productstat_cachevirtual[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_theorique;
                             }
-                        }
-                        else {  // Detailed code, looks bugged
-                            // stock order and stock order_supplier
-                            $stock_order=0;
-                            $stock_order_supplier=0;
-                            if (! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT))    // What about other options ?
+                            
+                            if (empty($conf->global->SHIPPABLE_ORDER_ICON_IN_LIST))  // Default code is when this option is not set, setting it create strange result
                             {
-                                if (! empty($conf->commande->enabled))
+                                $text_info .= $generic_commande->lines[$lig]->qty.' X '.$generic_commande->lines[$lig]->ref.'&nbsp;'.dol_trunc($generic_commande->lines[$lig]->product_label, 25);
+                                $text_info .= ' - '.$langs->trans("Stock").': '.$generic_product->stock_reel;
+                                $text_info .= ' - '.$langs->trans("VirtualStock").': '.$generic_product->stock_theorique;
+                                $text_info .= '<br>';
+                                
+                                if ($generic_commande->lines[$lig]->qty > $generic_product->stock_reel) 
                                 {
-                                    if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer'])) {
-                                        $generic_product->load_stats_commande(0,'1,2');
-                                        $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer'] = $generic_product->stats_commande['qty'];
-                                    } else {
-                                        $generic_product->stats_commande['qty'] = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer'];
-                                    }
-                                    $stock_order=$generic_product->stats_commande['qty'];
+                                    $notshippable++;
                                 }
-                                if (! empty($conf->fournisseur->enabled))
+                            }
+                            else {  // Detailed code, looks bugged
+                                // stock order and stock order_supplier
+                                $stock_order=0;
+                                $stock_order_supplier=0;
+                                if (! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT))    // What about other options ?
                                 {
-                                    if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier'])) {
-                                        $generic_product->load_stats_commande_fournisseur(0,'3');
-                                        $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier'] = $generic_product->stats_commande_fournisseur['qty'];
-                                    } else {
-                                        $generic_product->stats_commande_fournisseur['qty'] = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier'];
+                                    if (! empty($conf->commande->enabled))
+                                    {
+                                        if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer'])) {
+                                            $generic_product->load_stats_commande(0,'1,2');
+                                            $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer'] = $generic_product->stats_commande['qty'];
+                                        } else {
+                                            $generic_product->stats_commande['qty'] = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer'];
+                                        }
+                                        $stock_order=$generic_product->stats_commande['qty'];
+                                    }
+                                    if (! empty($conf->fournisseur->enabled))
+                                    {
+                                        if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier'])) {
+                                            $generic_product->load_stats_commande_fournisseur(0,'3');
+                                            $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier'] = $generic_product->stats_commande_fournisseur['qty'];
+                                        } else {
+                                            $generic_product->stats_commande_fournisseur['qty'] = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier'];
+                                        }
+                                        $stock_order_supplier=$generic_product->stats_commande_fournisseur['qty'];
                                     }
-                                    $stock_order_supplier=$generic_product->stats_commande_fournisseur['qty'];
                                 }
-                            }
-                            $text_info .= $generic_commande->lines[$lig]->qty.' X '.$generic_commande->lines[$lig]->ref.'&nbsp;'.dol_trunc($generic_commande->lines[$lig]->product_label, 25);
-                            $text_stock_reel = $generic_product->stock_reel.'/'.$stock_order;
-                            if ($stock_order > $generic_product->stock_reel && ! ($generic_product->stock_reel < $generic_commande->lines[$lig]->qty)) {
-                                $warning++;
-                                $text_warning.='<span class="warning">'.$langs->trans('Available').'&nbsp;:&nbsp;'.$text_stock_reel.'</span>';
-                            }
-                            if ($generic_product->stock_reel < $generic_commande->lines[$lig]->qty) {
-                                $notshippable++;
-                                $text_info.='<span class="warning">'.$langs->trans('Available').'&nbsp;:&nbsp;'.$text_stock_reel.'</span>';
-                            } else {
-                                $text_info.='<span class="ok">'.$langs->trans('Available').'&nbsp;:&nbsp;'.$text_stock_reel.'</span>';
-                            }
-                            if (! empty($conf->fournisseur->enabled)) {
-                                $text_info.= '&nbsp;'.$langs->trans('SupplierOrder').'&nbsp;:&nbsp;'.$stock_order_supplier.'<br>';
-                            } else {
-                                $text_info.= '<br>';
+                                $text_info .= $generic_commande->lines[$lig]->qty.' X '.$generic_commande->lines[$lig]->ref.'&nbsp;'.dol_trunc($generic_commande->lines[$lig]->product_label, 25);
+                                $text_stock_reel = $generic_product->stock_reel.'/'.$stock_order;
+                                if ($stock_order > $generic_product->stock_reel && ! ($generic_product->stock_reel < $generic_commande->lines[$lig]->qty)) {
+                                    $warning++;
+                                    $text_warning.='<span class="warning">'.$langs->trans('Available').'&nbsp;:&nbsp;'.$text_stock_reel.'</span>';
+                                }
+                                if ($generic_product->stock_reel < $generic_commande->lines[$lig]->qty) {
+                                    $notshippable++;
+                                    $text_info.='<span class="warning">'.$langs->trans('Available').'&nbsp;:&nbsp;'.$text_stock_reel.'</span>';
+                                } else {
+                                    $text_info.='<span class="ok">'.$langs->trans('Available').'&nbsp;:&nbsp;'.$text_stock_reel.'</span>';
+                                }
+                                if (! empty($conf->fournisseur->enabled)) {
+                                    $text_info.= '&nbsp;'.$langs->trans('SupplierOrder').'&nbsp;:&nbsp;'.$stock_order_supplier.'<br>';
+                                } else {
+                                    $text_info.= '<br>';
+                                }
                             }
                         }
                     }
+                    if ($notshippable==0) {
+                        $text_icon = img_picto('', 'object_sending');
+                        $text_info = $langs->trans('Shippable').'<br>'.$text_info;
+                    } else {
+                        $text_icon = img_picto('', 'error');
+                        $text_info = $langs->trans('NonShippable').'<br>'.$text_info;
+                    }
                 }
-                if ($notshippable==0) {
-                    $text_icon = img_picto('', 'object_sending');
-                    $text_info = $langs->trans('Shippable').'<br>'.$text_info;
-                } else {
-                    $text_icon = img_picto('', 'error');
-                    $text_info = $langs->trans('NonShippable').'<br>'.$text_info;
+                
+                print '<td>';
+                if ($nbprod)
+                {
+                    print $form->textwithtooltip('',$text_info,2,1,$text_icon,'',2);
                 }
+                if ($warning) {
+                    print $form->textwithtooltip('', $langs->trans('NotEnoughForAllOrders').'<br>'.$text_warning, 2, 1, img_picto('', 'error'),'',2);
+                }
+                print '</td>';
             }
-            
-            print '<td>';
-            if ($nbprod)
-            {
-                print $form->textwithtooltip('',$text_info,2,1,$text_icon,'',2);
-            }
-            if ($warning) {
-                print $form->textwithtooltip('', $langs->trans('NotEnoughForAllOrders').'<br>'.$text_warning, 2, 1, img_picto('', 'error'),'',2);
-            }
-            print '</td>';
+    
+            // Warning late icon
+    		print '<td class="nobordernopadding nowrap">';
+    		if ($generic_commande->hasDelay()) {
+    			print img_picto($langs->trans("Late").' : '.$generic_commande->showDelay(), "warning");
+    		}
+    		if(!empty($obj->note_private))
+    		{
+    			print ' <span class="note">';
+    			print '<a href="'.DOL_URL_ROOT.'/commande/note.php?id='.$obj->rowid.'">'.img_picto($langs->trans("ViewPrivateNote"),'object_generic').'</a>';
+    			print '</span>';
+    		}
+    		print '</td>';
+    
+    		print '<td width="16" align="right" class="nobordernopadding hideonsmartphone">';
+    		$filename=dol_sanitizeFileName($obj->ref);
+    		$filedir=$conf->commande->dir_output . '/' . dol_sanitizeFileName($obj->ref);
+    		$urlsource=$_SERVER['PHP_SELF'].'?id='.$obj->rowid;
+    		print $formfile->getDocumentsLink($generic_commande->element, $filename, $filedir);
+    		print '</td>';
+    		print '</tr></table>';
+    
+    		print '</td>';
+    		if (! $i) $totalarray['nbfield']++;
         }
-
-        // Warning late icon
-		print '<td class="nobordernopadding nowrap">';
-		if ($generic_commande->hasDelay()) {
-			print img_picto($langs->trans("Late").' : '.$generic_commande->showDelay(), "warning");
-		}
-		if(!empty($objp->note_private))
+        
+		// Ref customer
+		if (! empty($arrayfields['c.ref_client']['checked']))
 		{
-			print ' <span class="note">';
-			print '<a href="'.DOL_URL_ROOT.'/commande/note.php?id='.$objp->rowid.'">'.img_picto($langs->trans("ViewPrivateNote"),'object_generic').'</a>';
-			print '</span>';
+            print '<td>'.$obj->ref_client.'</td>';
+    		if (! $i) $totalarray['nbfield']++;
 		}
-		print '</td>';
-
-		print '<td width="16" align="right" class="nobordernopadding hideonsmartphone">';
-		$filename=dol_sanitizeFileName($objp->ref);
-		$filedir=$conf->commande->dir_output . '/' . dol_sanitizeFileName($objp->ref);
-		$urlsource=$_SERVER['PHP_SELF'].'?id='.$objp->rowid;
-		print $formfile->getDocumentsLink($generic_commande->element, $filename, $filedir);
-		print '</td>';
-		print '</tr></table>';
 
-		print '</td>';
+		$companystatic->id=$obj->socid;
+        $companystatic->code_client = $obj->code_client;
+		$companystatic->name=$obj->name;
+		$companystatic->client=$obj->client;
 
-		// Ref customer
-		print '<td>'.$objp->ref_client.'</td>';
-
-		// Company
-		$companystatic->id=$objp->socid;
-        $companystatic->code_client = $objp->code_client;
-		$companystatic->name=$objp->name;
-		$companystatic->client=$objp->client;
-		print '<td>';
-		print $companystatic->getNomUrl(1,'customer');
-
-		// If module invoices enabled and user with invoice creation permissions
-		if (! empty($conf->facture->enabled) && ! empty($conf->global->ORDER_BILLING_ALL_CUSTOMER))
+		// Third party
+		if (! empty($arrayfields['s.nom']['checked']))
 		{
-			if ($user->rights->facture->creer)
-			{
-				if (($objp->fk_statut > 0 && $objp->fk_statut < 3) || ($objp->fk_statut == 3 && $objp->billed == 0))
-				{
-					print '&nbsp;<a href="'.DOL_URL_ROOT.'/commande/orderstoinvoice.php?socid='.$companystatic->id.'">';
-					print img_picto($langs->trans("CreateInvoiceForThisCustomer").' : '.$companystatic->name, 'object_bill', 'hideonsmartphone').'</a>';
-				}
-			}
+    		print '<td>';
+    		print $companystatic->getNomUrl(1,'customer');
+    
+    		// If module invoices enabled and user with invoice creation permissions
+    		if (! empty($conf->facture->enabled) && ! empty($conf->global->ORDER_BILLING_ALL_CUSTOMER))
+    		{
+    			if ($user->rights->facture->creer)
+    			{
+    				if (($obj->fk_statut > 0 && $obj->fk_statut < 3) || ($obj->fk_statut == 3 && $obj->billed == 0))
+    				{
+    					print '&nbsp;<a href="'.DOL_URL_ROOT.'/commande/orderstoinvoice.php?socid='.$companystatic->id.'">';
+    					print img_picto($langs->trans("CreateInvoiceForThisCustomer").' : '.$companystatic->name, 'object_bill', 'hideonsmartphone').'</a>';
+    				}
+    			}
+    		}
+    		print '</td>';
+    		if (! $i) $totalarray['nbfield']++;
 		}
-		print '</td>';
-
+		// Town
+		if (! empty($arrayfields['s.town']['checked']))
+		{
+		    print '<td class="nocellnopadd">';
+		    print $obj->town;
+		    print '</td>';
+		    if (! $i) $totalarray['nbfield']++;
+		}
+		// Zip
+		if (! empty($arrayfields['s.zip']['checked']))
+		{
+		    print '<td class="nocellnopadd">';
+		    print $obj->zip;
+		    print '</td>';
+		    if (! $i) $totalarray['nbfield']++;
+		}
+		// State
+		if (! empty($arrayfields['state.nom']['checked']))
+		{
+		    print "<td>".$obj->state_name."</td>\n";
+		    if (! $i) $totalarray['nbfield']++;
+		}
+		// Country
+		if (! empty($arrayfields['country.code_iso']['checked']))
+		{
+		    print '<td align="center">';
+		    $tmparray=getCountry($obj->fk_pays,'all');
+		    print $tmparray['label'];
+		    print '</td>';
+		    if (! $i) $totalarray['nbfield']++;
+		}
+		// Type ent
+		if (! empty($arrayfields['typent.code']['checked']))
+		{
+		    print '<td align="center">';
+		    if (count($typenArray)==0) $typenArray = $formcompany->typent_array(1);
+		    print $typenArray[$obj->typent_code];
+		    print '</td>';
+		    if (! $i) $totalarray['nbfield']++;
+		}
+		
 		// Order date
-		print '<td align="center">';
-		print dol_print_date($db->jdate($objp->date_commande), 'day');
-		print '</td>';
-
-		// Delivery date
-		print '<td align="center">';
-		print dol_print_date($db->jdate($objp->date_delivery), 'day');
-		print '</td>';
-
-		// Amount HT
-		print '<td align="right" class="nowrap">'.price($objp->total_ht).'</td>';
-
-		// Statut
-		print '<td align="right" class="nowrap">'.$generic_commande->LibStatut($objp->fk_statut, $objp->billed, 5, 1).'</td>';
-
+		if (! empty($arrayfields['c.date_commande']['checked']))
+		{
+    		print '<td align="center">';
+    		print dol_print_date($db->jdate($obj->date_commande), 'day');
+    		print '</td>';
+    		if (! $i) $totalarray['nbfield']++;
+		}
+		// Plannned date of delivery
+		if (! empty($arrayfields['c.date_delivery']['checked']))
+		{
+    		print '<td align="center">';
+    		print dol_print_date($db->jdate($obj->date_delivery), 'day');
+    		print '</td>';
+    		if (! $i) $totalarray['nbfield']++;
+		}
+        // Amount HT
+        if (! empty($arrayfields['c.total_ht']['checked']))
+        {
+		      print '<td align="right">'.price($obj->total_ht)."</td>\n";
+		      if (! $i) $totalarray['nbfield']++;
+		      if (! $i) $totalarray['totalhtfield']=$totalarray['nbfield'];
+		      $totalarray['totalht'] += $obj->total_ht;
+        }
+        // Amount VAT
+        if (! empty($arrayfields['c.total_vat']['checked']))
+        {
+            print '<td align="right">'.price($obj->total_vat)."</td>\n";
+            if (! $i) $totalarray['nbfield']++;
+		    if (! $i) $totalarray['totalvatfield']=$totalarray['nbfield'];
+		    $totalarray['totalvat'] += $obj->total_vat;
+        }
+        // Amount TTC
+        if (! empty($arrayfields['c.total_ttc']['checked']))
+        {
+            print '<td align="right">'.price($obj->total_ttc)."</td>\n";
+            if (! $i) $totalarray['nbfield']++;
+		    if (! $i) $totalarray['totalttcfield']=$totalarray['nbfield'];
+		    $totalarray['totalttc'] += $obj->total_ttc;
+        }
+		
+        // Extra fields
+        if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label))
+        {
+            foreach($extrafields->attribute_label as $key => $val)
+            {
+                if (! empty($arrayfields["ef.".$key]['checked']))
+                {
+                    print '<td';
+                    $align=$extrafields->getAlignFlag($key);
+                    if ($align) print ' align="'.$align.'"';
+                    print '>';
+                    $tmpkey='options_'.$key;
+                    print $extrafields->showOutputField($key, $obj->$tmpkey, '', 1);
+                    print '</td>';
+                    if (! $i) $totalarray['nbfield']++;
+                }
+            }
+        }
+        // Fields from hook
+        $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj);
+        $reshook=$hookmanager->executeHooks('printFieldListValue',$parameters);    // Note that $action and $object may have been modified by hook
+        print $hookmanager->resPrint;
+        // Date creation
+        if (! empty($arrayfields['c.datec']['checked']))
+        {
+            print '<td align="center" class="nowrap">';
+            print dol_print_date($db->jdate($obj->date_creation), 'dayhour');
+            print '</td>';
+            if (! $i) $totalarray['nbfield']++;
+        }
+        // Date modification
+        if (! empty($arrayfields['c.tms']['checked']))
+        {
+            print '<td align="center" class="nowrap">';
+            print dol_print_date($db->jdate($obj->date_update), 'dayhour');
+            print '</td>';
+            if (! $i) $totalarray['nbfield']++;
+        }
+        // Status
+        if (! empty($arrayfields['c.fk_statut']['checked']))
+        {
+            print '<td align="right" class="nowrap">'.$generic_commande->LibStatut($obj->fk_statut, $obj->billed, 5, 1).'</td>';
+            if (! $i) $totalarray['nbfield']++;
+        }
 		// Billed
-		if (empty($conf->global->WORKFLOW_BILL_ON_SHIPMENT)) print '<td align="center">'.yn($objp->billed).'</td>';
+        if (! empty($arrayfields['c.facture']['checked']))
+        {
+            print '<td align="center">'.yn($obj->billed).'</td>';
+        }
+        
+        // Action column
+        print '<td></td>';
+        if (! $i) $totalarray['nbfield']++;
 		
-		print '<td></td>';
-
 		print '</tr>';
 
-		$total+=$objp->total_ht;
-		$subtotal+=$objp->total_ht;
+		$total+=$obj->total_ht;
+		$subtotal+=$obj->total_ht;
 		$i++;
 	}
 
-	if (! empty($conf->global->MAIN_SHOW_TOTAL_FOR_LIMITED_LIST))
+	// Show total line
+	if (isset($totalarray['totalhtfield']))
 	{
-		$var=!$var;
-		print '<tr '.$bc[$var].'>';
-		print '<td class="nowrap" colspan="5">'.$langs->trans('TotalHT').'</td>';
-		// Total HT
-		print '<td align="right" class="nowrap">'.price($total).'</td>';
-		print '<td></td>';
-		print '<td></td>';
-		print '<td></td>';
-		print '</tr>';
+	    print '<tr class="liste_total">';
+	    $i=0;
+	    while ($i < $totalarray['nbfield'])
+	    {
+	        $i++;
+	        if ($i == 1)
+	        {
+	            if ($num < $limit) print '<td align="left">'.$langs->trans("Total").'</td>';
+	            else print '<td align="left">'.$langs->trans("Totalforthispage").'</td>';
+	        }
+	        elseif ($totalarray['totalhtfield'] == $i) print '<td align="right">'.price($totalarray['totalht']).'</td>';
+	        elseif ($totalarray['totalvatfield'] == $i) print '<td align="right">'.price($totalarray['totalvat']).'</td>';
+	        elseif ($totalarray['totalttcfield'] == $i) print '<td align="right">'.price($totalarray['totalttc']).'</td>';
+	        else print '<td></td>';
+	    }
+	    print '</tr>';
+	
 	}
 
+	$db->free($resql);
+	
+	$parameters=array('arrayfields'=>$arrayfields, 'sql'=>$sql);
+	$reshook=$hookmanager->executeHooks('printFieldListFooter',$parameters);    // Note that $action and $object may have been modified by hook
+	print $hookmanager->resPrint;
+				
 	print '</table>';
 
 	print '</form>'."\n";
 
 	print '<br>'.img_help(1,'').' '.$langs->trans("ToBillSeveralOrderSelectCustomer", $langs->transnoentitiesnoconv("CreateInvoiceForThisCustomer")).'<br>';
-
-	$db->free($resql);
 }
 else
 {
diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php
index f6c9e79660a..fc6f5cf2186 100644
--- a/htdocs/compta/facture/list.php
+++ b/htdocs/compta/facture/list.php
@@ -43,6 +43,7 @@ require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
 require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
 require_once DOL_DOCUMENT_ROOT.'/core/lib/invoice.lib.php';
 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
 if (! empty($conf->commande->enabled)) require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
 if (! empty($conf->projet->enabled))
 {
@@ -126,7 +127,7 @@ $hookmanager->initHooks(array('invoicelist'));
 $extrafields = new ExtraFields($db);
 
 // fetch optionals attributes and labels
-$extralabels = $extrafields->fetch_name_optionals_label('invoice');
+$extralabels = $extrafields->fetch_name_optionals_label('facture');
 $search_array_options=$extrafields->getOptionalsFromPost($extralabels,'','search_');
 
 // List of fields to search into when doing a "search in all"
@@ -155,6 +156,7 @@ $arrayfields=array(
     'f.total_ht'=>array('label'=>$langs->trans("AmountHT"), 'checked'=>1),
     'f.total_vat'=>array('label'=>$langs->trans("AmountVAT"), 'checked'=>0),
     'f.total_ttc'=>array('label'=>$langs->trans("AmountTTC"), 'checked'=>0),
+    'am'=>array('label'=>$langs->trans("Received"), 'checked'=>0),
     'f.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500),
     'f.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500),
     'f.fk_statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000),
@@ -211,6 +213,7 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both
     $day_lim='';
     $year_lim='';
     $month_lim='';
+    $search_array_options=array();
 }
 
 if (empty($reshook))
@@ -635,10 +638,13 @@ $formcompany=new FormCompany($db);
 
 $sql = 'SELECT';
 if ($sall || $search_product_category > 0) $sql = 'SELECT DISTINCT';
-$sql.= ' f.rowid as facid, f.facnumber, f.ref_client, f.type, f.note_private, f.note_public, f.increment, f.fk_mode_reglement, f.total as total_ht, f.tva as total_tva, f.total_ttc,';
+$sql.= ' f.rowid as facid, f.facnumber, f.ref_client, f.type, f.note_private, f.note_public, f.increment, f.fk_mode_reglement, f.total as total_ht, f.tva as total_vat, f.total_ttc,';
 $sql.= ' f.datef as df, f.date_lim_reglement as datelimite,';
 $sql.= ' f.paye as paye, f.fk_statut,';
-$sql.= ' s.nom as name, s.rowid as socid, s.code_client, s.client ';
+$sql.= ' f.datec as date_creation, f.tms as date_update,';
+$sql.= ' s.rowid as socid, s.nom as name, s.town, s.zip, s.fk_pays, s.client, s.code_client, ';
+$sql.= " typent.code as typent_code,";
+$sql.= " state.code_departement as state_code, state.nom as state_name";
 if (! $sall) $sql.= ', SUM(pf.amount) as am';   // To be able to sort on status
 // Add fields from extrafields
 foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : '');
@@ -722,22 +728,6 @@ if ($search_user > 0)
 {
     $sql.= " AND ec.fk_c_type_contact = tc.rowid AND tc.element='facture' AND tc.source='internal' AND ec.element_id = f.rowid AND ec.fk_socpeople = ".$search_user;
 }
-if (! $sall)
-{
-    $sql.= ' GROUP BY f.rowid, f.facnumber, ref_client, f.type, f.note_private, f.note_public, f.increment, f.total, f.tva, f.total_ttc,';
-    $sql.= ' f.datef, f.date_lim_reglement,';
-    $sql.= ' f.paye, f.fk_statut,';
-    $sql.= ' s.nom, s.rowid, s.code_client, s.client';
-}
-else
-{
-    $sql .= natural_search(array_keys($fieldstosearchall), $sall);
-}
-$sql.= ' ORDER BY ';
-$listfield=explode(',',$sortfield);
-foreach ($listfield as $key => $value) $sql.= $listfield[$key].' '.$sortorder.',';
-$sql.= ' f.rowid DESC ';
-
 // Add where from extra fields
 foreach ($search_array_options as $key => $val)
 {
@@ -756,6 +746,24 @@ $parameters=array();
 $reshook=$hookmanager->executeHooks('printFieldListWhere',$parameters);    // Note that $action and $object may have been modified by hook
 $sql.=$hookmanager->resPrint;
 
+if (! $sall)
+{
+    $sql.= ' GROUP BY f.rowid, f.facnumber, ref_client, f.type, f.note_private, f.note_public, f.increment, f.total, f.tva, f.total_ttc,';
+    $sql.= ' f.datef, f.date_lim_reglement,';
+    $sql.= ' f.paye, f.fk_statut,';
+    $sql.= ' f.datec, f.tms,';
+    $sql.= ' s.rowid, s.nom, s.town, s.zip, s.fk_pays, s.code_client, s.client';
+}
+else
+{
+    $sql .= natural_search(array_keys($fieldstosearchall), $sall);
+}
+
+$sql.= ' ORDER BY ';
+$listfield=explode(',',$sortfield);
+foreach ($listfield as $key => $value) $sql.= $listfield[$key].' '.$sortorder.',';
+$sql.= ' f.rowid DESC ';
+
 $nbtotalofrecords = 0;
 if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
 {
@@ -1100,7 +1108,12 @@ if ($resql)
     	print '<input class="flat" type="text" size="5" name="search_montant_ttc" value="'.$search_montant_ttc.'">';
     	print '</td>';
 	}
-	// Extra fields
+    if (! empty($arrayfields['am']['checked']))
+    {
+        print '<td class="liste_titre" align="right">';
+        print '</td>';
+    }
+    // Extra fields
 	if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label))
 	{
 	    foreach($extrafields->attribute_label as $key => $val)
@@ -1147,15 +1160,8 @@ if ($resql)
     	print $form->selectarray('search_status', $liststatus, $search_status, 1);
 	    print '</td>';
 	}
-	// Status
-	if (! empty($arrayfields['c.facture']['checked']))
-	{
-	    print '<td class="liste_titre maxwidthonsmartphone" align="right">';
-	    print $form->selectyesno('billed', $billed, 1, 0, 1);
-	    print '</td>';
-	}
 	// Action column
-	print '<td class="liste_titre" align="right">';
+	print '<td class="liste_titre" align="middle">';
 	$searchpitco=$form->showFilterAndCheckAddButtons(1, 'checkforselect', 1);
 	print $searchpitco;
     print '</td>';
@@ -1163,132 +1169,274 @@ if ($resql)
 
     if ($num > 0)
     {
+        $i=0;
         $var=true;
-        $total_ht=0;
-        $total_tva=0;
-        $total_ttc=0;
-        $totalrecu=0;
-
+        $totalarray=array();
         while ($i < min($num,$limit))
         {
-            $objp = $db->fetch_object($resql);
+            $obj = $db->fetch_object($resql);
             $var=!$var;
 
-            $datelimit=$db->jdate($objp->datelimite);
+            $datelimit=$db->jdate($obj->datelimite);
 
             print '<tr '.$bc[$var].'>';
-            print '<td class="nowrap">';
-
-            $facturestatic->id=$objp->facid;
-            $facturestatic->ref=$objp->facnumber;
-            $facturestatic->type=$objp->type;
-            $facturestatic->statut=$objp->fk_statut;
-            $facturestatic->date_lim_reglement=$db->jdate($objp->datelimite);
-            $notetoshow=dol_string_nohtmltag(($user->societe_id>0?$objp->note_public:$objp->note_private),1);
-            $paiement = $facturestatic->getSommePaiement();
-
-            print '<table class="nobordernopadding"><tr class="nocellnopadd">';
-
-            print '<td class="nobordernopadding nowrap">';
-            print $facturestatic->getNomUrl(1,'',200,0,$notetoshow);
-            print $objp->increment;
-            print '</td>';
-
-            print '<td style="min-width: 20px" class="nobordernopadding nowrap">';
-            if (! empty($objp->note_private))
-            {
-				print ' <span class="note">';
-				print '<a href="'.DOL_URL_ROOT.'/compta/facture/note.php?id='.$objp->facid.'">'.img_picto($langs->trans("ViewPrivateNote"),'object_generic').'</a>';
-				print '</span>';
-			}
-            $filename=dol_sanitizeFileName($objp->facnumber);
-            $filedir=$conf->facture->dir_output . '/' . dol_sanitizeFileName($objp->facnumber);
-            $urlsource=$_SERVER['PHP_SELF'].'?id='.$objp->facid;
-            print $formfile->getDocumentsLink($facturestatic->element, $filename, $filedir);
-			print '</td>';
-            print '</tr>';
-            print '</table>';
-
-            print "</td>\n";
-
+    		if (! empty($arrayfields['f.facnumber']['checked']))
+    		{
+                print '<td class="nowrap">';
+    
+                $facturestatic->id=$obj->facid;
+                $facturestatic->ref=$obj->facnumber;
+                $facturestatic->type=$obj->type;
+                $facturestatic->statut=$obj->fk_statut;
+                $facturestatic->date_lim_reglement=$db->jdate($obj->datelimite);
+                $notetoshow=dol_string_nohtmltag(($user->societe_id>0?$obj->note_public:$obj->note_private),1);
+                $paiement = $facturestatic->getSommePaiement();
+    
+                print '<table class="nobordernopadding"><tr class="nocellnopadd">';
+    
+                print '<td class="nobordernopadding nowrap">';
+                print $facturestatic->getNomUrl(1,'',200,0,$notetoshow);
+                print $obj->increment;
+                print '</td>';
+    
+                print '<td style="min-width: 20px" class="nobordernopadding nowrap">';
+                if (! empty($obj->note_private))
+                {
+    				print ' <span class="note">';
+    				print '<a href="'.DOL_URL_ROOT.'/compta/facture/note.php?id='.$obj->facid.'">'.img_picto($langs->trans("ViewPrivateNote"),'object_generic').'</a>';
+    				print '</span>';
+    			}
+                $filename=dol_sanitizeFileName($obj->facnumber);
+                $filedir=$conf->facture->dir_output . '/' . dol_sanitizeFileName($obj->facnumber);
+                $urlsource=$_SERVER['PHP_SELF'].'?id='.$obj->facid;
+                print $formfile->getDocumentsLink($facturestatic->element, $filename, $filedir);
+    			print '</td>';
+                print '</tr>';
+                print '</table>';
+    
+                print "</td>\n";
+    		    if (! $i) $totalarray['nbfield']++;
+    		}
+    		
 			// Customer ref
-			print '<td class="nowrap">';
-			print $objp->ref_client;
-			print '</td>';
-
+    		if (! empty($arrayfields['f.ref_client']['checked']))
+    		{
+        		print '<td class="nowrap">';
+    			print $obj->ref_client;
+    			print '</td>';
+    		    if (! $i) $totalarray['nbfield']++;
+    		}
+    		
 			// Date
-            print '<td align="center" class="nowrap">';
-            print dol_print_date($db->jdate($objp->df),'day');
-            print '</td>';
-
+    		if (! empty($arrayfields['f.date']['checked']))
+    		{
+        		print '<td align="center" class="nowrap">';
+                print dol_print_date($db->jdate($obj->df),'day');
+                print '</td>';
+    		    if (! $i) $totalarray['nbfield']++;
+    		}
+    		
             // Date limit
-            print '<td align="center" class="nowrap">'.dol_print_date($datelimit,'day');
-            if ($facturestatic->hasDelay())
+    		if (! empty($arrayfields['f.date_lim_reglement']['checked']))
+    		{
+        		print '<td align="center" class="nowrap">'.dol_print_date($datelimit,'day');
+                if ($facturestatic->hasDelay())
+                {
+                    print img_warning($langs->trans('Late'));
+                }
+                print '</td>';
+    		    if (! $i) $totalarray['nbfield']++;
+    		}
+    		
+    		// Third party
+    		if (! empty($arrayfields['s.nom']['checked']))
+    		{
+                print '<td>';
+                $thirdparty=new Societe($db);
+                $thirdparty->id=$obj->socid;
+                $thirdparty->name=$obj->name;
+                $thirdparty->client=$obj->client;
+                $thirdparty->code_client=$obj->code_client;
+                print $thirdparty->getNomUrl(1,'customer');
+                print '</td>';
+                if (! $i) $totalarray['nbfield']++;
+    		}
+    		// Town
+    		if (! empty($arrayfields['s.town']['checked']))
+    		{
+    		    print '<td class="nocellnopadd">';
+    		    print $obj->town;
+    		    print '</td>';
+    		    if (! $i) $totalarray['nbfield']++;
+    		}
+    		// Zip
+    		if (! empty($arrayfields['s.zip']['checked']))
+    		{
+    		    print '<td class="nocellnopadd">';
+    		    print $obj->zip;
+    		    print '</td>';
+    		    if (! $i) $totalarray['nbfield']++;
+    		}
+    		// State
+    		if (! empty($arrayfields['state.nom']['checked']))
+    		{
+    		    print "<td>".$obj->state_name."</td>\n";
+    		    if (! $i) $totalarray['nbfield']++;
+    		}
+    		// Country
+    		if (! empty($arrayfields['country.code_iso']['checked']))
+    		{
+    		    print '<td align="center">';
+    		    $tmparray=getCountry($obj->fk_pays,'all');
+    		    print $tmparray['label'];
+    		    print '</td>';
+    		    if (! $i) $totalarray['nbfield']++;
+    		}
+    		// Type ent
+    		if (! empty($arrayfields['typent.code']['checked']))
+    		{
+    		    print '<td align="center">';
+    		    if (count($typenArray)==0) $typenArray = $formcompany->typent_array(1);
+    		    print $typenArray[$obj->typent_code];
+    		    print '</td>';
+    		    if (! $i) $totalarray['nbfield']++;
+    		}
+    		
+            // Payment mode
+    		if (! empty($arrayfields['f.fk_mode_reglement']['checked']))
+    		{
+        		print '<td>';
+                $form->form_modes_reglement($_SERVER['PHP_SELF'], $obj->fk_mode_reglement, 'none', '', -1);
+                print '</td>';
+    		    if (! $i) $totalarray['nbfield']++;
+    		}
+    		
+            // Amount HT
+            if (! empty($arrayfields['f.total_ht']['checked']))
             {
-                print img_warning($langs->trans('Late'));
+    		      print '<td align="right">'.price($obj->total_ht)."</td>\n";
+    		      if (! $i) $totalarray['nbfield']++;
+    		      if (! $i) $totalarray['totalhtfield']=$totalarray['nbfield'];
+    		      $totalarray['totalht'] += $obj->total_ht;
+            }
+            // Amount VAT
+            if (! empty($arrayfields['f.total_vat']['checked']))
+            {
+                print '<td align="right">'.price($obj->total_vat)."</td>\n";
+                if (! $i) $totalarray['nbfield']++;
+    		    if (! $i) $totalarray['totalvatfield']=$totalarray['nbfield'];
+    		    $totalarray['totalvat'] += $obj->total_vat;
+            }
+            // Amount TTC
+            if (! empty($arrayfields['f.total_ttc']['checked']))
+            {
+                print '<td align="right">'.price($obj->total_ttc)."</td>\n";
+                if (! $i) $totalarray['nbfield']++;
+    		    if (! $i) $totalarray['totalttcfield']=$totalarray['nbfield'];
+    		    $totalarray['totalttc'] += $obj->total_ttc;
             }
-            print '</td>';
-
-            print '<td>';
-            $thirdparty=new Societe($db);
-            $thirdparty->id=$objp->socid;
-            $thirdparty->name=$objp->name;
-            $thirdparty->client=$objp->client;
-            $thirdparty->code_client=$objp->code_client;
-            print $thirdparty->getNomUrl(1,'customer');
-            print '</td>';
 
-            // Payment mode
-            print '<td>';
-            $form->form_modes_reglement($_SERVER['PHP_SELF'], $objp->fk_mode_reglement, 'none', '', -1);
-            print '</td>';
+            if (! empty($arrayfields['am']['checked']))
+            {
+                print '<td align="right">'.(! empty($paiement)?price($paiement,0,$langs):'&nbsp;').'</td>';
+                if (! $i) $totalarray['nbfield']++;
+    		    if (! $i) $totalarray['totalamfield']=$totalarray['nbfield'];
+    		    $totalarray['totalam'] += $paiement;
+            }
             
-            print '<td align="right">'.price($objp->total_ht,0,$langs).'</td>';
-
-            print '<td align="right">'.price($objp->total_tva,0,$langs).'</td>';
-
-            print '<td align="right">'.price($objp->total_ttc,0,$langs).'</td>';
-
-            print '<td align="right">'.(! empty($paiement)?price($paiement,0,$langs):'&nbsp;').'</td>';
-
+            // Extra fields
+            if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label))
+            {
+                foreach($extrafields->attribute_label as $key => $val)
+                {
+                    if (! empty($arrayfields["ef.".$key]['checked']))
+                    {
+                        print '<td';
+                        $align=$extrafields->getAlignFlag($key);
+                        if ($align) print ' align="'.$align.'"';
+                        print '>';
+                        $tmpkey='options_'.$key;
+                        print $extrafields->showOutputField($key, $obj->$tmpkey, '', 1);
+                        print '</td>';
+                        if (! $i) $totalarray['nbfield']++;
+                    }
+                }
+            }
+            // Fields from hook
+            $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj);
+            $reshook=$hookmanager->executeHooks('printFieldListValue',$parameters);    // Note that $action and $object may have been modified by hook
+            print $hookmanager->resPrint;
+            // Date creation
+            if (! empty($arrayfields['f.datec']['checked']))
+            {
+                print '<td align="center" class="nowrap">';
+                print dol_print_date($db->jdate($obj->date_creation), 'dayhour');
+                print '</td>';
+                if (! $i) $totalarray['nbfield']++;
+            }
+            // Date modification
+            if (! empty($arrayfields['f.tms']['checked']))
+            {
+                print '<td align="center" class="nowrap">';
+                print dol_print_date($db->jdate($obj->date_update), 'dayhour');
+                print '</td>';
+                if (! $i) $totalarray['nbfield']++;
+            }
             // Status
-            print '<td align="right" class="nowrap">';
-            print $facturestatic->LibStatut($objp->paye,$objp->fk_statut,5,$paiement,$objp->type);
-            print "</td>";
-
-			// Checkbox
+            if (! empty($arrayfields['f.fk_statut']['checked']))
+            {
+                print '<td align="right" class="nowrap">';
+                print $facturestatic->LibStatut($obj->paye,$obj->fk_statut,5,$paiement,$obj->type);
+                print "</td>";
+                if (! $i) $totalarray['nbfield']++;
+            }
+            
+    		// Action column
             print '<td class="nowrap" align="center">';
             $selected=0;
-			if (in_array($objp->facid, $arrayofselected)) $selected=1;
-			print '<input id="cb'.$objp->facid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$objp->facid.'"'.($selected?' checked="checked"':'').'>';
-			print '</td>' ;
-
+    		if (in_array($obj->facid, $arrayofselected)) $selected=1;
+    		print '<input id="cb'.$obj->facid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->facid.'"'.($selected?' checked="checked"':'').'>';
+    		print '</td>' ;
+    		if (! $i) $totalarray['nbfield']++;
+				
             print "</tr>\n";
-            $total_ht+=$objp->total_ht;
-            $total_tva+=$objp->total_tva;
-            $total_ttc+=$objp->total_ttc;
-            $totalrecu+=$paiement;
+
             $i++;
         }
 
-        if (($offset + $num) <= $limit)
-        {
-            // Print total
-            print '<tr class="liste_total">';
-            print '<td class="liste_total" colspan="6" align="left">'.$langs->trans('Total').'</td>';
-            print '<td class="liste_total" align="right">'.price($total_ht,0,$langs).'</td>';
-            print '<td class="liste_total" align="right">'.price($total_tva,0,$langs).'</td>';
-            print '<td class="liste_total" align="right">'.price($total_ttc,0,$langs).'</td>';
-            print '<td class="liste_total" align="right">'.price($totalrecu,0,$langs).'</td>';
-            print '<td class="liste_total"></td>';
-            print '<td class="liste_total"></td>';
-            print '</tr>';
-        }
+    	// Show total line
+    	if (isset($totalarray['totalhtfield']))
+    	{
+    		print '<tr class="liste_total">';
+    		$i=0;
+    		while ($i < $totalarray['nbfield'])
+    		{
+    		   $i++;
+    		   if ($i == 1)
+    	       {
+            		if ($num < $limit) print '<td align="left">'.$langs->trans("Total").'</td>';
+            		else print '<td align="left">'.$langs->trans("Totalforthispage").'</td>';
+    	       }
+    		   elseif ($totalarray['totalhtfield'] == $i)  print '<td align="right">'.price($totalarray['totalht']).'</td>';
+    		   elseif ($totalarray['totalvatfield'] == $i) print '<td align="right">'.price($totalarray['totalvat']).'</td>';
+    		   elseif ($totalarray['totalttcfield'] == $i) print '<td align="right">'.price($totalarray['totalttc']).'</td>';
+    		   elseif ($totalarray['totalamfield'] == $i)  print '<td align="right">'.price($totalarray['totalam']).'</td>';
+    		   else print '<td></td>';
+    		}
+    		print '</tr>';
+    		
+    	}
     }
 
-    print "</table>\n";
-    print "</form>\n";
     $db->free($resql);
+	
+	$parameters=array('arrayfields'=>$arrayfields, 'sql'=>$sql);
+	$reshook=$hookmanager->executeHooks('printFieldListFooter',$parameters);    // Note that $action and $object may have been modified by hook
+	print $hookmanager->resPrint;
+    
+	print "</table>\n";
+    
+    print "</form>\n";
     
     if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files)
     {
diff --git a/htdocs/expedition/list.php b/htdocs/expedition/list.php
index 25fe9855ee8..50eda73b95a 100644
--- a/htdocs/expedition/list.php
+++ b/htdocs/expedition/list.php
@@ -26,6 +26,8 @@
 require '../main.inc.php';
 require_once DOL_DOCUMENT_ROOT.'/expedition/class/expedition.class.php';
 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
 
 $langs->load("sendings");
 $langs->load("deliveries");
@@ -69,7 +71,7 @@ $hookmanager->initHooks(array('shipmentlist'));
 $extrafields = new ExtraFields($db);
 
 // fetch optionals attributes and labels
-$extralabels = $extrafields->fetch_name_optionals_label('shipment');
+$extralabels = $extrafields->fetch_name_optionals_label('expedition');
 $search_array_options=$extrafields->getOptionalsFromPost($extralabels,'','search_');
 
 // List of fields to search into when doing a "search in all"
@@ -169,27 +171,29 @@ $formcompany=new FormCompany($db);
 $helpurl='EN:Module_Shipments|FR:Module_Exp&eacute;ditions|ES:M&oacute;dulo_Expediciones';
 llxHeader('',$langs->trans('ListOfSendings'),$helpurl);
 
-$sql = "SELECT e.rowid, e.ref, e.date_expedition as date_expedition, e.date_delivery as date_livraison, l.date_delivery as date_reception, e.fk_statut";
-$sql.= ", s.nom as socname, s.rowid as socid";
+$sql = "SELECT e.rowid, e.ref, e.date_expedition as date_expedition, e.date_delivery as date_livraison, l.date_delivery as date_reception, e.fk_statut,";
+$sql.= ' s.rowid as socid, s.nom as name, s.town, s.zip, s.fk_pays, s.client, s.code_client, ';
+$sql.= " typent.code as typent_code,";
+$sql.= " state.code_departement as state_code, state.nom as state_name,";
+$sql.= ' e.date_creation as date_creation, e.tms as date_update';
 // Add fields from extrafields
 foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : '');
 // Add fields from hooks
 $parameters=array();
 $reshook=$hookmanager->executeHooks('printFieldListSelect',$parameters);    // Note that $action and $object may have been modified by hook
 $sql.=$hookmanager->resPrint;
-$sql.= " FROM (".MAIN_DB_PREFIX."expedition as e";
+$sql.= " FROM ".MAIN_DB_PREFIX."expedition as e";
 if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."expedition_extrafields as ef on (e.rowid = ef.fk_object)";
-if (!$user->rights->societe->client->voir && !$socid)	// Internal user with no permission to see all
-{
-	$sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
-}
-$sql.= ")";
 $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = e.fk_soc";
 $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = s.fk_pays)";
 $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_typent as typent on (typent.id = s.fk_typent)";
 $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = s.fk_departement)";
 $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."element_element as ee ON e.rowid = ee.fk_source AND ee.sourcetype = 'shipping' AND ee.targettype = 'delivery'";
 $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."livraison as l ON l.rowid = ee.fk_target";
+if (!$user->rights->societe->client->voir && !$socid)	// Internal user with no permission to see all
+{
+	$sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
+}
 $sql.= " WHERE e.entity IN (".getEntity('expedition', 1).")";
 if (!$user->rights->societe->client->voir && !$socid)	// Internal user with no permission to see all
 {
@@ -203,6 +207,11 @@ if ($socid)
 if ($viewstatut <> '' && $viewstatut >= 0) {
 	$sql.= " AND e.fk_statut = ".$viewstatut;
 }
+if ($search_town)  $sql.= natural_search('s.town', $search_town);
+if ($search_zip)   $sql.= natural_search("s.zip",$search_zip);
+if ($search_state) $sql.= natural_search("state.nom",$search_state);
+if ($search_country) $sql .= " AND s.fk_pays IN (".$search_country.')';
+if ($search_type_thirdparty) $sql .= " AND s.fk_typent IN (".$search_type_thirdparty.')';
 if ($search_ref_exp) $sql .= natural_search('e.ref', $search_ref_exp);
 if ($search_ref_liv) $sql .= natural_search('l.ref', $search_ref_liv);
 if ($search_company) $sql .= natural_search('s.nom', $search_company);
@@ -321,7 +330,7 @@ if ($resql)
 	$parameters=array('arrayfields'=>$arrayfields);
     $reshook=$hookmanager->executeHooks('printFieldListTitle',$parameters);    // Note that $action and $object may have been modified by hook
     print $hookmanager->resPrint;
-	if (! empty($arrayfields['e.datec']['checked']))  print_liste_field_titre($arrayfields['e.datec']['label'],$_SERVER["PHP_SELF"],"e.datec","",$param,'align="center" class="nowrap"',$sortfield,$sortorder);
+	if (! empty($arrayfields['e.datec']['checked']))  print_liste_field_titre($arrayfields['e.datec']['label'],$_SERVER["PHP_SELF"],"e.date_creation","",$param,'align="center" class="nowrap"',$sortfield,$sortorder);
 	if (! empty($arrayfields['e.tms']['checked']))    print_liste_field_titre($arrayfields['e.tms']['label'],$_SERVER["PHP_SELF"],"e.tms","",$param,'align="center" class="nowrap"',$sortfield,$sortorder);
 	if (! empty($arrayfields['e.fk_statut']['checked'])) print_liste_field_titre($arrayfields['e.fk_statut']['label'],$_SERVER["PHP_SELF"],"e.fk_statut","",$param,'align="right"',$sortfield,$sortorder);
 	if (! empty($arrayfields['l.fk_statut']['checked'])) print_liste_field_titre($arrayfields['l.fk_statut']['label'], $_SERVER["PHP_SELF"],"l.fk_statut","",$param,'align="right"',$sortfield,$sortorder);
@@ -376,7 +385,7 @@ if ($resql)
 	}
 	if (! empty($arrayfields['l.ref']['checked']))            
 	{
-    	// Delivery order
+    	// Delivery ref
 		print '<td class="liste_titre">';
 		print '<input class="flat" size="10" type="text" name="search_ref_liv" value="'.$search_ref_liv.'"';
 		print '</td>';
@@ -433,66 +442,171 @@ if ($resql)
 	    print '</td>';
 	}
 	// Action column
-	print '<td class="liste_titre" align="right">';
+	print '<td class="liste_titre" align="middle">';
 	$searchpitco=$form->showFilterAndCheckAddButtons(0);
 	print $searchpitco;
     print '</td>';
 	print "</tr>\n";
 
-	$var=True;
-
+	$i=0;
+	$var=true;
+	$totalarray=array();
 	while ($i < min($num,$limit))
 	{
-		$objp = $db->fetch_object($resql);
+		$obj = $db->fetch_object($resql);
 
 		$var=!$var;
 
 		print "<tr ".$bc[$var].">";
 
+    	$shipment->id=$obj->rowid;
+    	$shipment->ref=$obj->ref;
+    	
 		// Ref
-		print "<td>";
-		$shipment->id=$objp->rowid;
-		$shipment->ref=$objp->ref;
-		print $shipment->getNomUrl(1);
-		print "</td>\n";
-
+		if (! empty($arrayfields['e.ref']['checked']))
+		{
+    		print "<td>";
+    		print $shipment->getNomUrl(1);
+    		print "</td>\n";
+    		if (! $i) $totalarray['nbfield']++;
+		}
+		
+		$companystatic->id=$obj->socid;
+		$companystatic->ref=$obj->name;
+		$companystatic->name=$obj->name;
+		
 		// Third party
-		print '<td>';
-		$companystatic->id=$objp->socid;
-		$companystatic->ref=$objp->socname;
-		$companystatic->name=$objp->socname;
-		print $companystatic->getNomUrl(1);
-		print '</td>';
-
+		if (! empty($arrayfields['s.nom']['checked']))
+		{
+    		print '<td>';
+    		print $companystatic->getNomUrl(1);
+    		print '</td>';
+    		if (! $i) $totalarray['nbfield']++;
+		}
+		// Town
+		if (! empty($arrayfields['s.town']['checked']))
+		{
+		    print '<td class="nocellnopadd">';
+		    print $obj->town;
+		    print '</td>';
+		    if (! $i) $totalarray['nbfield']++;
+		}
+		// Zip
+		if (! empty($arrayfields['s.zip']['checked']))
+		{
+		    print '<td class="nocellnopadd">';
+		    print $obj->zip;
+		    print '</td>';
+		    if (! $i) $totalarray['nbfield']++;
+		}
+		// State
+		if (! empty($arrayfields['state.nom']['checked']))
+		{
+		    print "<td>".$obj->state_name."</td>\n";
+		    if (! $i) $totalarray['nbfield']++;
+		}
+		// Country
+		if (! empty($arrayfields['country.code_iso']['checked']))
+		{
+		    print '<td align="center">';
+		    $tmparray=getCountry($obj->fk_pays,'all');
+		    print $tmparray['label'];
+		    print '</td>';
+		    if (! $i) $totalarray['nbfield']++;
+		}
+		// Type ent
+		if (! empty($arrayfields['typent.code']['checked']))
+		{
+		    print '<td align="center">';
+		    if (count($typenArray)==0) $typenArray = $formcompany->typent_array(1);
+		    print $typenArray[$obj->typent_code];
+		    print '</td>';
+		    if (! $i) $totalarray['nbfield']++;
+		}
+		
 		// Date delivery planed
-		print "<td align=\"center\">";
-		print dol_print_date($db->jdate($objp->date_livraison),"day");
-		/*$now = time();
-		if ( ($now - $db->jdate($objp->date_expedition)) > $conf->warnings->lim && $objp->statutid == 1 )
+		if (! empty($arrayfields['e.date_delivery']['checked']))
 		{
-		}*/
-		print "</td>\n";
-
-        if ($conf->livraison_bon->enabled)
+    		print '<td align="center">';
+    		print dol_print_date($db->jdate($obj->date_livraison),"day");
+    		/*$now = time();
+    		if ( ($now - $db->jdate($obj->date_expedition)) > $conf->warnings->lim && $obj->statutid == 1 )
+    		{
+    		}*/
+    		print "</td>\n";
+		}
+		
+		if (! empty($arrayfields['l.ref']['checked']) || ! empty($arrayfields['l.date_delivery']['checked']))
         {
 		    $shipment->fetchObjectLinked($shipment->id,$shipment->element);
             $receiving='';
             if (count($shipment->linkedObjects['delivery']) > 0) $receiving=reset($shipment->linkedObjects['delivery']);
 
-        	// Ref
-            print '<td>';
-            print !empty($receiving) ? $receiving->getNomUrl($db) : '';
-            print '</td>';
-			// Date received
-        	print '<td align="center">';
-			print dol_print_date($db->jdate($objp->date_reception),"day");
-			print '</td>'."\n";
+    		if (! empty($arrayfields['l.ref']['checked']))
+            {
+                // Ref
+                print '<td>';
+                print !empty($receiving) ? $receiving->getNomUrl($db) : '';
+                print '</td>';
+            }
+            
+    		if (! empty($arrayfields['l.date_delivery']['checked']))
+            {
+                // Date received
+            	print '<td align="center">';
+    			print dol_print_date($db->jdate($obj->date_reception),"day");
+    			print '</td>'."\n";
+            }
 		}
 
-		print '<td align="right">'.$expedition->LibStatut($objp->fk_statut,5).'</td>';
-
+		// Extra fields
+		if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label))
+		{
+		    foreach($extrafields->attribute_label as $key => $val)
+		    {
+		        if (! empty($arrayfields["ef.".$key]['checked']))
+		        {
+		            print '<td class="tdofextrafield"';
+		            $align=$extrafields->getAlignFlag($key);
+		            if ($align) print ' align="'.$align.'"';
+		            print '>';
+		            $tmpkey='options_'.$key;
+		            print $extrafields->showOutputField($key, $obj->$tmpkey, '', 1);
+		            print '</td>';
+		            if (! $i) $totalarray['nbfield']++;
+		        }
+		    }
+		}
+		// Fields from hook
+		$parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj);
+		$reshook=$hookmanager->executeHooks('printFieldListValue',$parameters);    // Note that $action and $object may have been modified by hook
+		print $hookmanager->resPrint;
+		// Date creation
+		if (! empty($arrayfields['e.datec']['checked']))
+		{
+		    print '<td align="center" class="nowrap">';
+		    print dol_print_date($db->jdate($obj->date_creation), 'dayhour');
+		    print '</td>';
+		    if (! $i) $totalarray['nbfield']++;
+		}
+		// Date modification
+		if (! empty($arrayfields['e.tms']['checked']))
+		{
+		    print '<td align="center" class="nowrap">';
+		    print dol_print_date($db->jdate($obj->date_update), 'dayhour');
+		    print '</td>';
+		    if (! $i) $totalarray['nbfield']++;
+		}
+		// Status
+		if (! empty($arrayfields['e.fk_statut']['checked']))
+		{
+		    print '<td align="right" class="nowrap">'.$shipment->LibStatut($obj->fk_statut,5).'</td>';
+		    if (! $i) $totalarray['nbfield']++;
+		}
+		// Action column
 		print '<td></td>';
-
+		if (! $i) $totalarray['nbfield']++;
+		
 		print "</tr>\n";
 
 		$i++;
diff --git a/htdocs/langs/en_US/deliveries.lang b/htdocs/langs/en_US/deliveries.lang
index 9bf50756ddb..d4dfcbd81b8 100644
--- a/htdocs/langs/en_US/deliveries.lang
+++ b/htdocs/langs/en_US/deliveries.lang
@@ -31,3 +31,4 @@ Recipient=Recipient
 ErrorStockIsNotEnough=There's not enough stock
 Shippable=Shippable
 NonShippable=Not Shippable
+ShowReceiving=Show delivery receipt
\ No newline at end of file
diff --git a/htdocs/langs/en_US/orders.lang b/htdocs/langs/en_US/orders.lang
index d7105badd32..a402dd54944 100644
--- a/htdocs/langs/en_US/orders.lang
+++ b/htdocs/langs/en_US/orders.lang
@@ -8,6 +8,7 @@ Orders=Orders
 OrderLine=Order line
 OrderFollow=Follow up
 OrderDate=Order date
+OrderDateShort=Order date
 OrderToProcess=Order to process
 NewOrder=New order
 ToOrder=Make order
-- 
GitLab