diff --git a/htdocs/compta/localtax/quadri_detail.php b/htdocs/compta/localtax/quadri_detail.php
index 7396c6251658863a18eb5f4be4715c51e6a21b1c..a4eaccba35bb6bb68674b6812933489c6c048962 100644
--- a/htdocs/compta/localtax/quadri_detail.php
+++ b/htdocs/compta/localtax/quadri_detail.php
@@ -3,7 +3,7 @@
  * Copyright (C) 2004      Eric Seigne          <eric.seigne@ryxeo.com>
  * Copyright (C) 2004-2013 Laurent Destailleur  <eldy@users.sourceforge.net>
  * Copyright (C) 2006-2007 Yannick Warnier      <ywarnier@beeznest.org>
- * Copyright (C) 2014	   Rosana Romero 		<rromero@2byte.es>
+ * Copyright (C) 2014-2016 Juanjo Menent		<jmenent@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
@@ -116,16 +116,11 @@ $product_static=new Product($db);
 $payment_static=new Paiement($db);
 $paymentfourn_static=new PaiementFourn($db);
 
-//print_fiche_titre($langs->trans("VAT"),"");
-
-//$fsearch.='<br>';
 $fsearch.='  <input type="hidden" name="year" value="'.$year.'">';
 $fsearch.='  <input type="hidden" name="modetax" value="'.$modetax.'">';
-//$fsearch.='  '.$langs->trans("SalesTurnoverMinimum").': ';
-//$fsearch.='  <input type="text" name="min" value="'.$min.'">';
 
 $calc=$conf->global->MAIN_INFO_LOCALTAX_CALC.$local;
-// Affiche en-tete du rapport
+
 if ($conf->global->$calc==0 || $conf->global->$calc==1)	// Calculate on invoice for goods and services
 {
     $nom=$langs->trans($local==1?"LT1ReportByQuartersInDueDebtMode":"LT2ReportByQuartersInDueDebtMode");
@@ -138,14 +133,11 @@ if ($conf->global->$calc==0 || $conf->global->$calc==1)	// Calculate on invoice
 	$nextyear=$year_start; $nextquarter=$q;
 	if ($nextquarter < 4) $nextquarter++;
 	else { $nextquarter=1; $nextyear++; }
-	//$periodlink=($prevyear?"<a href='".$_SERVER["PHP_SELF"]."?year=".$prevyear."&q=".$prevquarter."&modetax=".$modetax."'>".img_previous()."</a> <a href='".$_SERVER["PHP_SELF"]."?year=".$nextyear."&q=".$nextquarter."&modetax=".$modetax."'>".img_next()."</a>":"");
-    //if ($conf->global->MAIN_MODULE_COMPTABILITE || $conf->global->MAIN_MODULE_ACCOUNTING) $description.='<br>'.img_warning().' '.$langs->trans('OptionVatInfoModuleComptabilite');
-    //if (! empty($conf->global->MAIN_MODULE_COMPTABILITE)) $description.='<br>'.$langs->trans("WarningDepositsNotIncluded");
-    if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) $description.='<br>'.$langs->trans("DepositsAreNotIncluded");
+
+	if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) $description.='<br>'.$langs->trans("DepositsAreNotIncluded");
 	else  $description.='<br>'.$langs->trans("DepositsAreIncluded");
     $description.=$fsearch;
     $builddate=time();
-    //$exportlink=$langs->trans("NotYetAvailable");
 
 	$elementcust=$langs->trans("CustomersInvoices");
 	$productcust=$langs->trans("ProductOrService");
@@ -170,14 +162,10 @@ if ($conf->global->$calc==2) 	// Invoice for goods, payment for services
 	$nextyear=$year_start; $nextquarter=$q;
 	if ($nextquarter < 4) $nextquarter++;
 	else { $nextquarter=1; $nextyear++; }
-	//$periodlink=($prevyear?"<a href='".$_SERVER["PHP_SELF"]."?year=".$prevyear."&q=".$prevquarter."&modetax=".$modetax."'>".img_previous()."</a> <a href='".$_SERVER["PHP_SELF"]."?year=".$nextyear."&q=".$nextquarter."&modetax=".$modetax."'>".img_next()."</a>":"");
-    if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) $description.=' '.$langs->trans("DepositsAreNotIncluded");
+	if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) $description.=' '.$langs->trans("DepositsAreNotIncluded");
 	else  $description.=' '.$langs->trans("DepositsAreIncluded");
-    //if ($conf->global->MAIN_MODULE_COMPTABILITE || $conf->global->MAIN_MODULE_ACCOUNTING) $description.='<br>'.img_warning().' '.$langs->trans('OptionVatInfoModuleComptabilite');
-    //if (! empty($conf->global->MAIN_MODULE_COMPTABILITE)) $description.='<br>'.$langs->trans("WarningDepositsNotIncluded");
     $description.=$fsearch;
 	$builddate=time();
-    //$exportlink=$langs->trans("NotYetAvailable");
 
 	$elementcust=$langs->trans("CustomersInvoices");
 	$productcust=$langs->trans("ProductOrService");
@@ -203,15 +191,12 @@ if($local==1){
 
 // VAT Received and paid
 
-
-
 $y = $year_current;
 $total = 0;
 $i=0;
 
 // Load arrays of datas
 $x_coll= local_by_date($db, 0, 0, $date_start, $date_end, $modetax, 'sell', $local);
-//$x_coll = vat_by_date($db, 0, 0, $date_start, $date_end, $modetax, 'sell');
 $x_paye = local_by_date($db, 0, 0, $date_start, $date_end, $modetax, 'buy', $local);
 
 
@@ -230,10 +215,10 @@ if (! is_array($x_coll) || ! is_array($x_paye))
 else
 {
 	$x_both = array();
+
 	//now, from these two arrays, get another array with one rate per line
 	foreach(array_keys($x_coll) as $my_coll_rate)
 	{
-		//foreach($x_coll[$my_coll_rate][localtax1_list]){
 		$x_both[$my_coll_rate]['coll']['totalht'] = $x_coll[$my_coll_rate]['totalht'];
 		$x_both[$my_coll_rate]['coll']['vat']     = $x_coll[$my_coll_rate]['vat'];
 		$x_both[$my_coll_rate]['paye']['totalht'] = 0;
@@ -303,9 +288,6 @@ else
 	}
 	//now we have an array (x_both) indexed by rates for coll and paye
 
-
-	//print table headers for this quadri - incomes first
-
 	$x_coll_sum = 0;
 	$x_coll_ht = 0;
 	$x_paye_sum = 0;
@@ -314,8 +296,6 @@ else
 	$span=3;
 	if ($modetax == 0) $span+=2;
 
-	//print '<tr><td colspan="'.($span+1).'">'..')</td></tr>';
-
 	if($conf->global->$calc ==0 || $conf->global->$calc == 2){
 		// Customers invoices
 		print '<tr class="liste_titre">';
@@ -345,8 +325,6 @@ else
 
 				if($rate!=0){
 					print "<tr>";
-					//print '<td class="tax_rate">'.$langs->trans("Rate").': '.vatrate($rate).'%</td><td colspan="'.$span.'"></td>';
-					/**/
 					print '<td class="tax_rate">'.$langs->trans("Rate").': '.vatrate($rate).'%</td><td colspan="'.$span.'"></td>';
 					print '</tr>'."\n";
 				}
@@ -400,9 +378,7 @@ else
 						print price($fields['totalht']);
 						if (price2num($fields['ftotal_ttc']))
 						{
-							//print $fields['dtotal_ttc']."/".$fields['ftotal_ttc']." - ";
 							$ratiolineinvoice=($fields['dtotal_ttc']/$fields['ftotal_ttc']);
-							//print ' ('.round($ratiolineinvoice*100,2).'%)';
 						}
 						print '</td>';
 					}
@@ -413,7 +389,6 @@ else
 					{
 						if (isset($fields['payment_amount']) && $fields['ftotal_ttc']) $ratiopaymentinvoice=($fields['payment_amount']/$fields['ftotal_ttc']);
 						print '<td class="nowrap" align="right">';
-						//print $fields['totalht']."-".$fields['payment_amount']."-".$fields['ftotal_ttc'];
 						if ($fields['payment_amount'] && $fields['ftotal_ttc'])
 						{
 							$payment_static->id=$fields['payment_id'];
@@ -424,7 +399,7 @@ else
 							print $langs->trans("NotUsedForGoods");
 						}
 						else {
-							print $fields['payment_amount'];
+							print price($fields['payment_amount']);
 							if (isset($fields['payment_amount'])) print ' ('.round($ratiopaymentinvoice*100,2).'%)';
 						}
 						print '</td>';
@@ -491,7 +466,6 @@ else
 	if($conf->global->$calc ==0 || $conf->global->$calc == 1){
 		echo '<table class="noborder" width="100%">';
 		//print table headers for this quadri - expenses now
-		//imprime les en-tete de tables pour ce quadri - maintenant les d�penses
 		print '<tr class="liste_titre">';
 		print '<td align="left">'.$elementsup.'</td>';
 		print '<td align="left">'.$productsup.'</td>';
@@ -585,7 +559,7 @@ else
 						}
 						else
 						{
-							print $fields['payment_amount'];
+							print price($fields['payment_amount']);
 							if (isset($fields['payment_amount'])) print ' ('.round($ratiopaymentinvoice*100,2).'%)';
 						}
 						print '</td>';
diff --git a/htdocs/core/lib/tax.lib.php b/htdocs/core/lib/tax.lib.php
index 0a3c49428577328490d5d6c671de462f84b6c1ad..6054a32c692e95453c3681dd1b1c21af077a2db9 100644
--- a/htdocs/core/lib/tax.lib.php
+++ b/htdocs/core/lib/tax.lib.php
@@ -178,6 +178,341 @@ function vat_by_thirdparty($db, $y, $date_start, $date_end, $modetax, $direction
     }
 }
 
+/**
+ *  Gets LocalTaxes to collect for the given year (and given quarter or month)
+ *  The function gets the LocalTaxes in split results, as the LocalTaxes declaration asks
+ *  to report the amounts for different LocalTaxes rates as different lines.
+ *
+ *  @param	DoliDB	$db          	Database handler object
+ *  @param  int		$y           	Year
+ *  @param  int		$q           	Quarter
+ *  @param  string	$date_start  	Start date
+ *  @param  string	$date_end    	End date
+ *  @param  int		$modetax     	0 or 1 (option on debit)
+ *  @param  int		$direction   	'sell' (customer invoice) or 'buy' (supplier invoices)
+ *  @param  int     $local          1 for LocalTax1, 2 for LocalTax2
+ *  @param  int		$m           	Month
+ *  @return array       			List of quarters with LocalTaxes
+ */
+function local_by_date($db, $y, $q, $date_start, $date_end, $modetax, $direction, $local, $m=0)
+{
+    global $conf;
+
+    $list=array();
+
+    if ($direction == 'sell')
+    {
+        $invoicetable='facture';
+        $invoicedettable='facturedet';
+        $fk_facture='fk_facture';
+        $fk_facture2='fk_facture';
+        $fk_payment='fk_paiement';
+        $total_tva='total_tva';
+        $total_localtax1='total_localtax1';
+        $total_localtax2='total_localtax2';
+        $paymenttable='paiement';
+        $paymentfacturetable='paiement_facture';
+        $invoicefieldref='facnumber';
+        $localtax_tx=$local==1?'localtax1_tx':'localtax2_tx';
+    }
+    if ($direction == 'buy')
+    {
+        $invoicetable='facture_fourn';
+        $invoicedettable='facture_fourn_det';
+        $fk_facture='fk_facture_fourn';
+        $fk_facture2='fk_facturefourn';
+        $fk_payment='fk_paiementfourn';
+        $total_tva='tva';
+        $total_localtax1='total_localtax1';
+        $total_localtax2='total_localtax2';
+        $paymenttable='paiementfourn';
+        $paymentfacturetable='paiementfourn_facturefourn';
+        $invoicefieldref='ref';
+        $localtax_tx=$local==1?'localtax1_tx':'localtax2_tx';
+    }
+
+    // BIENS
+
+    // Define sql request
+    $sql='';
+    if ($modetax == 1)  // Option on delivery for goods (payment) and debit invoice for services
+    {
+
+        // Count on delivery date (use invoice date as delivery is unknown)
+        $sql = "SELECT d.rowid, d.product_type as dtype, d.".$fk_facture." as facid, d.tva_tx as rate, d.".$localtax_tx." as localtax_tx,";
+        $sql.= " d.total_ht as total_ht, d.total_ttc as total_ttc, d.".$total_tva." as total_vat, d.description as descr,";
+        $sql.= " d.".$total_localtax1." as total_localtax1, d.".$total_localtax2." as total_localtax2, ";
+        $sql.= " d.date_start as date_start, d.date_end as date_end,";
+        $sql.= " f.".$invoicefieldref." as facnum, f.type, f.total_ttc as ftotal_ttc,";
+        $sql.= " p.rowid as pid, p.ref as pref, p.fk_product_type as ptype,";
+        $sql.= " 0 as payment_id, 0 as payment_amount";
+        $sql.= " FROM ".MAIN_DB_PREFIX.$invoicetable." as f,";
+        $sql.= " ".MAIN_DB_PREFIX.$invoicedettable." as d" ;
+        $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product as p on d.fk_product = p.rowid";
+        $sql.= " WHERE f.entity = " . $conf->entity;
+        $sql.= " AND f.fk_statut in (1,2)"; // Validated or paid (partially or completely)
+        if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) $sql.= " AND f.type IN (0,1,2,5)";
+        else $sql.= " AND f.type IN (0,1,2,3,5)";
+        $sql.= " AND f.rowid = d.".$fk_facture;
+        if ($y && $m)
+        {
+            $sql.= " AND f.datef >= '".$db->idate(dol_get_first_day($y,$m,false))."'";
+            $sql.= " AND f.datef <= '".$db->idate(dol_get_last_day($y,$m,false))."'";
+        }
+        else if ($y)
+        {
+            $sql.= " AND f.datef >= '".$db->idate(dol_get_first_day($y,1,false))."'";
+            $sql.= " AND f.datef <= '".$db->idate(dol_get_last_day($y,12,false))."'";
+        }
+        if ($q) $sql.= " AND (date_format(f.datef,'%m') > ".(($q-1)*3)." AND date_format(f.datef,'%m') <= ".($q*3).")";
+        if ($date_start && $date_end) $sql.= " AND f.datef >= '".$db->idate($date_start)."' AND f.datef <= '".$db->idate($date_end)."'";
+        $sql.= " AND (d.product_type = 0";                              // Limit to products
+        $sql.= " AND d.date_start is null AND d.date_end IS NULL)";     // enhance detection of service
+        $sql.= " ORDER BY d.rowid, d.".$fk_facture;
+
+    }
+    else    // Option on delivery for goods (payments) and payments for services
+    {
+        // Count on delivery date (use invoice date as delivery is unknown)
+        $sql = "SELECT d.rowid, d.product_type as dtype, d.".$fk_facture." as facid, d.tva_tx as rate, d.".$localtax_tx." as localtax_tx, d.total_ht as total_ht, d.total_ttc as total_ttc, d.".$total_tva." as total_vat, d.description as descr,";
+        $sql .=" d.".$total_localtax1." as total_localtax1, d.".$total_localtax2." as total_localtax2, ";
+        $sql.= " d.date_start as date_start, d.date_end as date_end,";
+        $sql.= " f.".$invoicefieldref." as facnum, f.type, f.total_ttc as ftotal_ttc,";
+        $sql.= " p.rowid as pid, p.ref as pref, p.fk_product_type as ptype,";
+        $sql.= " 0 as payment_id, 0 as payment_amount";
+        $sql.= " FROM ".MAIN_DB_PREFIX.$invoicetable." as f,";
+        $sql.= " ".MAIN_DB_PREFIX.$invoicedettable." as d" ;
+        $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product as p on d.fk_product = p.rowid";
+        $sql.= " WHERE f.entity = " . $conf->entity;
+        $sql.= " AND f.fk_statut in (1,2)"; // Validated or paid (partially or completely)
+        if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) $sql.= " AND f.type IN (0,1,2,5)";
+        else $sql.= " AND f.type IN (0,1,2,3,5)";
+        $sql.= " AND f.rowid = d.".$fk_facture;
+        if ($y && $m)
+        {
+            $sql.= " AND f.datef >= '".$db->idate(dol_get_first_day($y,$m,false))."'";
+            $sql.= " AND f.datef <= '".$db->idate(dol_get_last_day($y,$m,false))."'";
+        }
+        else if ($y)
+        {
+            $sql.= " AND f.datef >= '".$db->idate(dol_get_first_day($y,1,false))."'";
+            $sql.= " AND f.datef <= '".$db->idate(dol_get_last_day($y,12,false))."'";
+        }
+        if ($q) $sql.= " AND (date_format(f.datef,'%m') > ".(($q-1)*3)." AND date_format(f.datef,'%m') <= ".($q*3).")";
+        if ($date_start && $date_end) $sql.= " AND f.datef >= '".$db->idate($date_start)."' AND f.datef <= '".$db->idate($date_end)."'";
+        $sql.= " AND (d.product_type = 0";                              // Limit to products
+        $sql.= " AND d.date_start is null AND d.date_end IS NULL)";     // enhance detection of service
+        $sql.= " ORDER BY d.rowid, d.".$fk_facture;
+
+    }
+
+    if (! $sql) return -1;
+
+    dol_syslog("Tax.lib.php::vat_by_date sql=".$sql);
+
+    $resql = $db->query($sql);
+    if ($resql)
+    {
+        $lt=-1;
+        $oldrowid='';
+        while($assoc = $db->fetch_array($resql))
+        {
+            if (! isset($list[$assoc['localtax_tx']]['totalht']))  $list[$assoc['localtax_tx']]['totalht']=0;
+            if (! isset($list[$assoc['localtax_tx']]['vat']))      $list[$assoc['localtax_tx']]['vat']=0;
+            if (! isset($list[$assoc['localtax_tx']]['localtax1']))      $list[$assoc['localtax_tx']]['localtax1']=0;
+            if (! isset($list[$assoc['localtax_tx']]['localtax2']))      $list[$assoc['localtax_tx']]['localtax2']=0;
+
+            if ($assoc['rowid'] != $oldrowid)       // Si rupture sur d.rowid
+            {
+                $oldrowid=$assoc['rowid'];
+                $list[$assoc['localtax_tx']]['totalht']  += $assoc['total_ht'];
+                $list[$assoc['localtax_tx']]['vat']      += $assoc['total_vat'];
+                $list[$assoc['localtax_tx']]['localtax1']      += $assoc['total_localtax1'];
+                $list[$assoc['localtax_tx']]['localtax2']      += $assoc['total_localtax2'];
+            }
+
+            $list[$assoc['localtax_tx']]['localtax1_tx'] = $assoc['localtax1_tx'];
+            $list[$assoc['localtax_tx']]['localtax2_tx'] = $assoc['localtax2_tx'];
+
+            $list[$assoc['localtax_tx']]['dtotal_ttc'][] = $assoc['total_ttc'];
+            $list[$assoc['localtax_tx']]['dtype'][] = $assoc['dtype'];
+            $list[$assoc['localtax_tx']]['ddate_start'][] = $db->jdate($assoc['date_start']);
+            $list[$assoc['localtax_tx']]['ddate_end'][] = $db->jdate($assoc['date_end']);
+
+            $list[$assoc['localtax_tx']]['facid'][] = $assoc['facid'];
+            $list[$assoc['localtax_tx']]['facnum'][] = $assoc['facnum'];
+            $list[$assoc['localtax_tx']]['type'][] = $assoc['type'];
+            $list[$assoc['localtax_tx']]['ftotal_ttc'][] = $assoc['ftotal_ttc'];
+            $list[$assoc['localtax_tx']]['descr'][] = $assoc['descr'];
+
+            $list[$assoc['localtax_tx']]['totalht_list'][] = $assoc['total_ht'];
+            $list[$assoc['localtax_tx']]['vat_list'][] = $assoc['total_vat'];
+            $list[$assoc['localtax_tx']]['localtax1_list'][] = $assoc['total_localtax1'];
+            $list[$assoc['localtax_tx']]['localtax2_list'][]  = $assoc['total_localtax2'];
+
+            $list[$assoc['localtax_tx']]['pid'][] = $assoc['pid'];
+            $list[$assoc['localtax_tx']]['pref'][] = $assoc['pref'];
+            $list[$assoc['localtax_tx']]['ptype'][] = $assoc['ptype'];
+
+            $list[$assoc['localtax_tx']]['payment_id'][] = $assoc['payment_id'];
+            $list[$assoc['localtax_tx']]['payment_amount'][] = $assoc['payment_amount'];
+
+            $lt = $assoc['localtax_tx'];
+        }
+    }
+    else
+    {
+        dol_print_error($db);
+        return -3;
+    }
+
+    // CAS DES SERVICES
+
+    // Define sql request
+    $sql='';
+    if ($modetax == 1)  // Option vat on delivery for goods (payment) and debit invoice for services
+    {
+
+        // Count on invoice date
+        $sql = "SELECT d.rowid, d.product_type as dtype, d.".$fk_facture." as facid, d.tva_tx as rate, d.".$localtax_tx." as localtax_tx, d.total_ht as total_ht, d.total_ttc as total_ttc, d.".$total_tva." as total_vat, d.description as descr,";
+        $sql .=" d.".$total_localtax1." as total_localtax1, d.".$total_localtax2." as total_localtax2, ";
+        $sql.= " d.date_start as date_start, d.date_end as date_end,";
+        $sql.= " f.".$invoicefieldref." as facnum, f.type, f.total_ttc as ftotal_ttc,";
+        $sql.= " p.rowid as pid, p.ref as pref, p.fk_product_type as ptype,";
+        $sql.= " 0 as payment_id, 0 as payment_amount";
+        $sql.= " FROM ".MAIN_DB_PREFIX.$invoicetable." as f,";
+        $sql.= " ".MAIN_DB_PREFIX.$invoicedettable." as d" ;
+        $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product as p on d.fk_product = p.rowid";
+        $sql.= " WHERE f.entity = " . $conf->entity;
+        $sql.= " AND f.fk_statut in (1,2)"; // Validated or paid (partially or completely)
+        if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) $sql.= " AND f.type IN (0,1,2,5)";
+        else $sql.= " AND f.type IN (0,1,2,3,5)";
+        $sql.= " AND f.rowid = d.".$fk_facture;
+        if ($y && $m)
+        {
+            $sql.= " AND f.datef >= '".$db->idate(dol_get_first_day($y,$m,false))."'";
+            $sql.= " AND f.datef <= '".$db->idate(dol_get_last_day($y,$m,false))."'";
+        }
+        else if ($y)
+        {
+            $sql.= " AND f.datef >= '".$db->idate(dol_get_first_day($y,1,false))."'";
+            $sql.= " AND f.datef <= '".$db->idate(dol_get_last_day($y,12,false))."'";
+        }
+        if ($q) $sql.= " AND (date_format(f.datef,'%m') > ".(($q-1)*3)." AND date_format(f.datef,'%m') <= ".($q*3).")";
+        if ($date_start && $date_end) $sql.= " AND f.datef >= '".$db->idate($date_start)."' AND f.datef <= '".$db->idate($date_end)."'";
+        $sql.= " AND (d.product_type = 1";                              // Limit to services
+        $sql.= " OR d.date_start is NOT null OR d.date_end IS NOT NULL)";       // enhance detection of service
+        $sql.= " ORDER BY d.rowid, d.".$fk_facture;
+
+    }
+    else    // Option vat on delivery for goods (payments) and payments for services
+    {
+
+        // Count on payments date
+        $sql = "SELECT d.rowid, d.product_type as dtype, d.".$fk_facture." as facid, d.tva_tx as rate, d.".$localtax_tx." as localtax_tx, d.total_ht as total_ht, d.total_ttc as total_ttc, d.".$total_tva." as total_vat, d.description as descr,";
+        $sql .=" d.".$total_localtax1." as total_localtax1, d.".$total_localtax2." as total_localtax2, ";
+        $sql.= " d.date_start as date_start, d.date_end as date_end,";
+        $sql.= " f.".$invoicefieldref." as facnum, f.type, f.total_ttc as ftotal_ttc,";
+        $sql.= " p.rowid as pid, p.ref as pref, p.fk_product_type as ptype,";
+        $sql.= " pf.".$fk_payment." as payment_id, pf.amount as payment_amount";
+        $sql.= " FROM ".MAIN_DB_PREFIX.$invoicetable." as f,";
+        $sql.= " ".MAIN_DB_PREFIX.$paymentfacturetable." as pf,";
+        $sql.= " ".MAIN_DB_PREFIX.$paymenttable." as pa,";
+        $sql.= " ".MAIN_DB_PREFIX.$invoicedettable." as d";
+        $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product as p on d.fk_product = p.rowid";
+        $sql.= " WHERE f.entity = " . $conf->entity;
+        $sql.= " AND f.fk_statut in (1,2)"; // Paid (partially or completely)
+        if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) $sql.= " AND f.type IN (0,1,2,5)";
+        else $sql.= " AND f.type IN (0,1,2,3,5)";
+        $sql.= " AND f.rowid = d.".$fk_facture;;
+        $sql.= " AND pf.".$fk_facture2." = f.rowid";
+        $sql.= " AND pa.rowid = pf.".$fk_payment;
+        if ($y && $m)
+        {
+            $sql.= " AND pa.datep >= '".$db->idate(dol_get_first_day($y,$m,false))."'";
+            $sql.= " AND pa.datep <= '".$db->idate(dol_get_last_day($y,$m,false))."'";
+        }
+        else if ($y)
+        {
+            $sql.= " AND pa.datep >= '".$db->idate(dol_get_first_day($y,1,false))."'";
+            $sql.= " AND pa.datep <= '".$db->idate(dol_get_last_day($y,12,false))."'";
+        }
+        if ($q) $sql.= " AND (date_format(pa.datep,'%m') > ".(($q-1)*3)." AND date_format(pa.datep,'%m') <= ".($q*3).")";
+        if ($date_start && $date_end) $sql.= " AND pa.datep >= ".$db->idate($date_start)." AND pa.datep <= ".$db->idate($date_end);
+        $sql.= " AND (d.product_type = 1";                              // Limit to services
+        $sql.= " OR d.date_start is NOT null OR d.date_end IS NOT NULL)";       // enhance detection of service
+        $sql.= " ORDER BY d.rowid, d.".$fk_facture.", pf.rowid";
+
+    }
+
+    if (! $sql)
+    {
+        dol_syslog("Tax.lib.php::local_by_date no accountancy module enabled".$sql,LOG_ERR);
+        return -1;
+    }
+
+    dol_syslog("Tax.lib.php::local_by_date sql=".$sql);
+    $resql = $db->query($sql);
+    if ($resql)
+    {
+        $lt = -1;
+        $oldrowid='';
+        while($assoc = $db->fetch_array($resql))
+        {
+            if (! isset($list[$assoc['localtax_tx']]['totalht']))  $list[$assoc['localtax_tx']]['totalht']=0;
+            if (! isset($list[$assoc['localtax_tx']]['vat']))      $list[$assoc['localtax_tx']]['vat']=0;
+            if (! isset($list[$assoc['localtax_tx']]['localtax1']))      $list[$assoc['localtax_tx']]['localtax1']=0;
+            if (! isset($list[$assoc['localtax_tx']]['localtax2']))      $list[$assoc['localtax_tx']]['localtax2']=0;
+
+            if ($assoc['rowid'] != $oldrowid)
+            {
+                $oldrowid=$assoc['rowid'];
+                $list[$assoc['localtax_tx']]['totalht']  += $assoc['total_ht'];
+                $list[$assoc['localtax_tx']]['vat']      += $assoc['total_vat'];
+                $list[$assoc['localtax_tx']]['localtax1']	 += $assoc['total_localtax1'];
+                $list[$assoc['localtax_tx']]['localtax2']	 += $assoc['total_localtax2'];
+            }
+
+            $list[$assoc['localtax_tx']]['localtax1_tx'] = $assoc['localtax1_tx'];
+            $list[$assoc['localtax_tx']]['localtax2_tx'] = $assoc['localtax2_tx'];
+
+            $list[$assoc['localtax_tx']]['dtotal_ttc'][] = $assoc['total_ttc'];
+            $list[$assoc['localtax_tx']]['dtype'][] = $assoc['dtype'];
+            $list[$assoc['localtax_tx']]['ddate_start'][] = $db->jdate($assoc['date_start']);
+            $list[$assoc['localtax_tx']]['ddate_end'][] = $db->jdate($assoc['date_end']);
+
+            $list[$assoc['localtax_tx']]['facid'][] = $assoc['facid'];
+            $list[$assoc['localtax_tx']]['facnum'][] = $assoc['facnum'];
+            $list[$assoc['localtax_tx']]['type'][] = $assoc['type'];
+            $list[$assoc['localtax_tx']]['ftotal_ttc'][] = $assoc['ftotal_ttc'];
+            $list[$assoc['localtax_tx']]['descr'][] = $assoc['descr'];
+
+            $list[$assoc['localtax_tx']]['totalht_list'][] = $assoc['total_ht'];
+            $list[$assoc['localtax_tx']]['vat_list'][] = $assoc['total_vat'];
+            $list[$assoc['localtax_tx']]['localtax1_list'][] = $assoc['total_localtax1'];
+            $list[$assoc['localtax_tx']]['localtax2_list'][] = $assoc['total_localtax2'];
+
+            $list[$assoc['localtax_tx']]['pid'][] = $assoc['pid'];
+            $list[$assoc['localtax_tx']]['pref'][] = $assoc['pref'];
+            $list[$assoc['localtax_tx']]['ptype'][] = $assoc['ptype'];
+
+            $list[$assoc['localtax_tx']]['payment_id'][] = $assoc['payment_id'];
+            $list[$assoc['localtax_tx']]['payment_amount'][] = $assoc['payment_amount'];
+
+            $lt = $assoc['localtax_tx'];
+        }
+    }
+    else
+    {
+        dol_print_error($db);
+        return -3;
+    }
+
+    return $list;
+
+
+}
+
 
 /**
  *  Gets VAT to collect for the given year (and given quarter or month)