diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php
index 9fe1b154ece..c0eeea480b6 100644
--- a/htdocs/core/class/html.form.class.php
+++ b/htdocs/core/class/html.form.class.php
@@ -50,6 +50,7 @@ class Form
var $cache_demand_reason=array();
var $cache_type_fees=array();
var $cache_currencies=array();
+ var $cache_vatrates=array();
var $tva_taux_value;
var $tva_taux_libelle;
@@ -2827,7 +2828,52 @@ class Form
{
print $this->load_tva($htmlname, $selectedrate, $societe_vendeuse, $societe_acheteuse, $idprod, $info_bits, $type);
}
-
+
+ /**
+ * Load into the cache vat rates of a country
+ *
+ * @param string Country code
+ * @return int Nb of loaded lines, 0 if already loaded, <0 if KO
+ */
+ function load_cache_vatrates($country_code)
+ {
+ if (count($this->cache_vatrates)) return 0; // Cache deja charge
+
+ $sql = "SELECT DISTINCT t.taux, t.recuperableonly";
+ $sql.= " FROM ".MAIN_DB_PREFIX."c_tva as t, ".MAIN_DB_PREFIX."c_pays as p";
+ $sql.= " WHERE t.fk_pays = p.rowid";
+ $sql.= " AND t.active = 1";
+ $sql.= " AND p.code IN (".$country_code.")";
+ $sql.= " ORDER BY t.taux ASC, t.recuperableonly ASC";
+
+ $resql=$this->db->query($sql);
+ if ($resql)
+ {
+ $num = $this->db->num_rows($resql);
+ if ($num)
+ {
+ for ($i = 0; $i < $num; $i++)
+ {
+ $obj = $this->db->fetch_object($resql);
+ $this->cache_vatrates[$i]['txtva'] = $obj->taux;
+ $this->cache_vatrates[$i]['libtva'] = $obj->taux.'%';
+ $this->cache_vatrates[$i]['nprtva'] = $obj->recuperableonly;
+ }
+
+ return $num;
+ }
+ else
+ {
+ $this->error = ''.$langs->trans("ErrorNoVATRateDefinedForSellerCountry",$code_pays).'';
+ return -1;
+ }
+ }
+ else
+ {
+ $this->error = ''.$this->db->error().'';
+ return -2;
+ }
+ }
/**
* Output an HTML select vat rate
@@ -2915,76 +2961,51 @@ class Form
}
}
}
+
// Now we get list
- $sql = "SELECT DISTINCT t.taux, t.recuperableonly";
- $sql.= " FROM ".MAIN_DB_PREFIX."c_tva as t, ".MAIN_DB_PREFIX."c_pays as p";
- $sql.= " WHERE t.fk_pays = p.rowid";
- $sql.= " AND t.active = 1";
- $sql.= " AND p.code in (".$code_pays.")";
- $sql.= " ORDER BY t.taux ASC, t.recuperableonly ASC";
-
- $resql=$this->db->query($sql);
- if ($resql)
+ $num = $this->load_cache_vatrates($code_pays);
+
+ if ($num > 0)
{
- $num = $this->db->num_rows($resql);
- if ($num)
- {
- for ($i = 0; $i < $num; $i++)
- {
- $obj = $this->db->fetch_object($resql);
- $txtva[$i] = $obj->taux;
- $libtva[$i] = $obj->taux.'%';
- $nprtva[$i] = $obj->recuperableonly;
- }
- }
- else
- {
- $return.= ''.$langs->trans("ErrorNoVATRateDefinedForSellerCountry",$code_pays).'';
- }
+ // Definition du taux a pre-selectionner (si defaulttx non force et donc vaut -1 ou '')
+ if ($defaulttx < 0 || dol_strlen($defaulttx) == 0)
+ {
+ $defaulttx=get_default_tva($societe_vendeuse,$societe_acheteuse,$idprod);
+ $defaultnpr=get_default_npr($societe_vendeuse,$societe_acheteuse,$idprod);
+ }
+
+ // Si taux par defaut n'a pu etre determine, on prend dernier de la liste.
+ // Comme ils sont tries par ordre croissant, dernier = plus eleve = taux courant
+ if ($defaulttx < 0 || dol_strlen($defaulttx) == 0)
+ {
+ $defaulttx = $this->cache_vatrates[$num-1]['txtva'];
+ }
+
+ $return.= '';
}
else
{
- $return.= ''.$this->db->error().'';
- }
-
- // Definition du taux a pre-selectionner (si defaulttx non force et donc vaut -1 ou '')
- if ($defaulttx < 0 || dol_strlen($defaulttx) == 0)
- {
- $defaulttx=get_default_tva($societe_vendeuse,$societe_acheteuse,$idprod);
- $defaultnpr=get_default_npr($societe_vendeuse,$societe_acheteuse,$idprod);
- }
-
- // Si taux par defaut n'a pu etre determine, on prend dernier de la liste.
- // Comme ils sont tries par ordre croissant, dernier = plus eleve = taux courant
- if ($defaulttx < 0 || dol_strlen($defaulttx) == 0)
- {
- $defaulttx = $txtva[count($txtva)-1];
- }
-
- $nbdetaux = count($txtva);
- if ($nbdetaux > 0)
- {
- $return.= '';
+ $return.= $this->error;
}
return $return;