From 7dac107cd7e30e4d812982efa1042a407d75b86a Mon Sep 17 00:00:00 2001
From: Juanjo Menent <jmenent@2byte.es>
Date: Tue, 22 Jun 2010 10:42:37 +0000
Subject: [PATCH] Local Taxes: Works in Contracts

---
 htdocs/contrat/class/contrat.class.php        | 76 ++++++++++++++-----
 htdocs/contrat/fiche.php                      | 12 ++-
 .../install/mysql/migration/2.8.0-2.9.0.sql   |  5 ++
 .../install/mysql/tables/llx_contratdet.sql   |  5 ++
 4 files changed, 76 insertions(+), 22 deletions(-)

diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php
index d8b7bae429f..38bbb14596d 100644
--- a/htdocs/contrat/class/contrat.class.php
+++ b/htdocs/contrat/class/contrat.class.php
@@ -348,9 +348,11 @@ class Contrat extends CommonObject
 
 		// Selectionne les lignes contrats liees a un produit
 		$sql = "SELECT p.label, p.description as product_desc, p.ref,";
-		$sql.= " d.rowid, d.fk_contrat, d.statut, d.description, d.price_ht, d.tva_tx, d.qty, d.remise_percent, d.subprice,";
+		$sql.= " d.rowid, d.fk_contrat, d.statut, d.description, d.price_ht, d.tva_tx, d.localtax1_tx, d.localtax2_tx, d.qty, d.remise_percent, d.subprice,";
 		$sql.= " d.total_ht,";
 		$sql.= " d.total_tva,";
+		$sql.= " d.total_localtax1,";
+		$sql.= " d.total_localtax2,";
 		$sql.= " d.total_ttc,";
 		$sql.= " d.info_bits, d.fk_product,";
 		$sql.= " d.date_ouverture_prevue, d.date_ouverture,";
@@ -380,8 +382,8 @@ class Contrat extends CommonObject
 				$ligne->desc           = $objp->description;  // Description ligne
 				$ligne->qty            = $objp->qty;
 				$ligne->tva_tx         = $objp->tva_tx;
-				$ligne->localtax1_tx   = 0; 
-				$ligne->localtax2_tx   = 0;
+				$ligne->localtax1_tx   = $objp->localtax1_tx; 
+				$ligne->localtax2_tx   = $objp->localtax2_tx;
 				$ligne->subprice       = $objp->subprice;
 				$ligne->statut 		   = $objp->statut;
 				$ligne->remise_percent = $objp->remise_percent;
@@ -389,8 +391,8 @@ class Contrat extends CommonObject
 				$ligne->price          = $objp->price;	// For backward compatibility
 				$ligne->total_ht       = $objp->total_ht;
 				$ligne->total_tva      = $objp->total_tva;
-				$ligne->total_localtax1= 0;
-				$ligne->total_localtax2= 0;
+				$ligne->total_localtax1= $objp->total_localtax1;
+				$ligne->total_localtax2= $objp->total_localtax2;
 				$ligne->total_ttc      = $objp->total_ttc;
 				$ligne->fk_product     = $objp->fk_product;
 				$ligne->info_bits      = $objp->info_bits;
@@ -435,9 +437,11 @@ class Contrat extends CommonObject
 		}
 
 		// Selectionne les lignes contrat liees a aucun produit
-		$sql = "SELECT d.rowid, d.fk_contrat, d.statut, d.qty, d.description, d.price_ht, d.tva_tx, d.rowid, d.remise_percent, d.subprice,";
+		$sql = "SELECT d.rowid, d.fk_contrat, d.statut, d.qty, d.description, d.price_ht, d.tva_tx, d.localtax1_tx, d.localtax2_tx, d.rowid, d.remise_percent, d.subprice,";
 		$sql.= " d.total_ht,";
 		$sql.= " d.total_tva,";
+		$sql.= " d.total_localtax1,";
+		$sql.= " d.total_localtax2,";
 		$sql.= " d.total_ttc,";
 		$sql.= " d.info_bits, d.fk_product,";
 		$sql.= " d.date_ouverture_prevue, d.date_ouverture,";
@@ -468,16 +472,16 @@ class Contrat extends CommonObject
 				$ligne->statut 		   = $objp->statut;
 				$ligne->ref            = $objp->ref;
 				$ligne->tva_tx         = $objp->tva_tx;
-				$ligne->localtax1_tx   =0;
-				$ligne->localtax2_tx   =0;
+				$ligne->localtax1_tx   = $objp->localtax1_tx;
+				$ligne->localtax2_tx   = $objp->localtax2_tx;
 				$ligne->subprice       = $objp->subprice;
 				$ligne->remise_percent = $objp->remise_percent;
 				$ligne->price_ht       = $objp->price_ht;
 				$ligne->price          = $objp->price;	// For backward compatibility
 				$ligne->total_ht       = $objp->total_ht;
 				$ligne->total_tva      = $objp->total_tva;
-				$ligne->total_localtax1= 0;
-				$ligne->total_localtax2= 0;
+				$ligne->total_localtax1= $objp->total_localtax1;
+				$ligne->total_localtax2= $objp->total_localtax2;
 				$ligne->total_ttc      = $objp->total_ttc;
 				$ligne->fk_product     = 0;
 				$ligne->info_bits      = $objp->info_bits;
@@ -743,6 +747,8 @@ class Contrat extends CommonObject
 	 *      \param      pu_ht              	Prix unitaire HT
 	 *      \param      qty             	Quantit�
 	 *      \param      txtva           	Taux tva
+	 *      \param      txlocaltax1         Local tax 1 rate
+	 *      \param      txlocaltax2         Local tax 2 rate
 	 *      \param      fk_product      	Id produit
 	 *      \param      remise_percent  	Pourcentage de remise de la ligne
 	 *      \param      date_start      	Date de debut pr�vue
@@ -752,11 +758,11 @@ class Contrat extends CommonObject
 	 * 		\param    	info_bits			Bits de type de lignes
 	 *      \return     int             	<0 si erreur, >0 si ok
 	 */
-	function addline($desc, $pu_ht, $qty, $txtva, $fk_product=0, $remise_percent=0, $date_start, $date_end, $price_base_type='HT', $pu_ttc=0, $info_bits=0)
+	function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $date_start, $date_end, $price_base_type='HT', $pu_ttc=0, $info_bits=0)
 	{
 		global $user, $langs, $conf;
 
-		dol_syslog("Contrat::addline $desc, $pu_ht, $qty, $txtva, $fk_product, $remise_percent, $date_start, $date_end, $price_base_type, $pu_ttc, $info_bits");
+		dol_syslog("Contrat::addline $desc, $pu_ht, $qty, $txtva, $txlocaltax1, $txlocaltax2, $fk_product, $remise_percent, $date_start, $date_end, $price_base_type, $pu_ttc, $info_bits");
 
 		if ($this->statut >= 0)
 		{
@@ -773,6 +779,8 @@ class Contrat extends CommonObject
 			$pu_ht=price2num($pu_ht);
 			$pu_ttc=price2num($pu_ttc);
 			$txtva=price2num($txtva);
+			$txlocaltax1=price2num($txlocaltax1);
+			$txlocaltax2=price2num($txlocaltax2);
 
 			if ($price_base_type=='HT')
 			{
@@ -787,11 +795,12 @@ class Contrat extends CommonObject
 			// qty, pu, remise_percent et txtva
 			// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker
 			// la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
-			$tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, 0, 0, $price_base_type, $info_bits);
+			$tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits);
 			$total_ht  = $tabprice[0];
 			$total_tva = $tabprice[1];
 			$total_ttc = $tabprice[2];
-
+			$total_localtax1= $tabprice[9];
+			$total_localtax2= $tabprice[10];
 			// \TODO A virer
 			// Anciens indicateurs: $price, $remise (a ne plus utiliser)
 			$remise = 0;
@@ -805,8 +814,8 @@ class Contrat extends CommonObject
 			// Insertion dans la base
 			$sql = "INSERT INTO ".MAIN_DB_PREFIX."contratdet";
 			$sql.= " (fk_contrat, label, description, fk_product, qty, tva_tx,";
-			$sql.= " remise_percent, subprice,";
-			$sql.= " total_ht, total_tva, total_ttc,";
+			$sql.= " localtax1_tx, localtax2_tx, remise_percent, subprice,";
+			$sql.= " total_ht, total_tva, total_localtax1, total_localtax2, total_ttc,";
 			$sql.= " info_bits,";
 			$sql.= " price_ht, remise";								// \TODO A virer
 			if ($date_start > 0) { $sql.= ",date_ouverture_prevue"; }
@@ -815,8 +824,10 @@ class Contrat extends CommonObject
 			$sql.= ($fk_product>0 ? $fk_product : "null").",";
 			$sql.= " '".$qty."',";
 			$sql.= " '".$txtva."',";
+			$sql.= " '".$txlocaltax1."',";
+			$sql.= " '".$txlocaltax2."',";
 			$sql.= " ".price2num($remise_percent).",".price2num($pu_ht).",";
-			$sql.= " ".price2num($total_ht).",".price2num($total_tva).",".price2num($total_ttc).",";
+			$sql.= " ".price2num($total_ht).",".price2num($total_tva).",".price2num($total_localtax1).",".price2num($total_localtax2).",".price2num($total_ttc).",";
 			$sql.= " '".$info_bits."',";
 			$sql.= " ".price2num($price).",".price2num( $remise);	// \TODO A virer
 			if ($date_start > 0) { $sql.= ",".$this->db->idate($date_start); }
@@ -866,12 +877,14 @@ class Contrat extends CommonObject
 	 *      \param     date_start       Date de debut prevue
 	 *      \param     date_end         Date de fin prevue
 	 *      \param     tvatx            Taux TVA
+	 *      \param     localtax1tx      Local tax 1 rate
+	 *      \param     localtax2tx      Local tax 2 rate
 	 *      \param     date_debut_reel  Date de debut reelle
 	 *      \param     date_fin_reel    Date de fin reelle
 	 *      \return    int              < 0 si erreur, > 0 si ok
 	 */
 	function updateline($rowid, $desc, $pu, $qty, $remise_percent=0,
-	$date_start='', $date_end='', $tvatx,
+	$date_start='', $date_end='', $tvatx, $localtax1tx=0, $localtax2tx=0, 
 	$date_debut_reel='', $date_fin_reel='')
 	{
 		global $user, $conf, $langs;
@@ -882,6 +895,8 @@ class Contrat extends CommonObject
 		$desc=trim($desc);
 		$price = price2num($pu);
 		$tvatx = price2num($tvatx);
+		$localtax1tx = price2num($localtax1tx);
+		$localtax2tx = price2num($localtax2tx);
 		$subprice = $price;
 		$remise = 0;
 		if (strlen($remise_percent) > 0)
@@ -894,7 +909,7 @@ class Contrat extends CommonObject
 			$remise_percent=0;
 		}
 
-		dol_syslog("Contrat::UpdateLine $rowid, $desc, $pu, $qty, $remise_percent, $date_start, $date_end, $date_debut_reel, $date_fin_reel, $tvatx");
+		dol_syslog("Contrat::UpdateLine $rowid, $desc, $pu, $qty, $remise_percent, $date_start, $date_end, $date_debut_reel, $date_fin_reel, $tvatx, $localtax1tx, $localtax2tx");
 
 		$this->db->begin();
 
@@ -905,7 +920,8 @@ class Contrat extends CommonObject
 		$sql .= ",remise_percent='".price2num($remise_percent)."'";
 		$sql .= ",qty='$qty'";
 		$sql .= ",tva_tx='".        price2num($tvatx)."'";
-
+		$sql .= ",localtax1_tx='".        price2num($localtax1tx)."'";
+		$sql .= ",localtax2_tx='".        price2num($localtax2tx)."'";
 		if ($date_start > 0) { $sql.= ",date_ouverture_prevue=".$this->db->idate($date_start); }
 		else { $sql.=",date_ouverture_prevue=null"; }
 		if ($date_end > 0) { $sql.= ",date_fin_validite=".$this->db->idate($date_end); }
@@ -1591,6 +1607,8 @@ class ContratLigne
 		$sql.= " t.date_fin_validite as date_fin_validite,";
 		$sql.= " t.date_cloture as date_cloture,";
 		$sql.= " t.tva_tx,";
+		$sql.= " t.localtax1_tx,";
+		$sql.= " t.localtax2_tx,";
 		$sql.= " t.qty,";
 		$sql.= " t.remise_percent,";
 		$sql.= " t.remise,";
@@ -1599,6 +1617,8 @@ class ContratLigne
 		$sql.= " t.price_ht,";
 		$sql.= " t.total_ht,";
 		$sql.= " t.total_tva,";
+		$sql.= " t.total_localtax1,";
+		$sql.= " t.total_localtax2,";
 		$sql.= " t.total_ttc,";
 		$sql.= " t.info_bits,";
 		$sql.= " t.fk_user_author,";
@@ -1632,6 +1652,8 @@ class ContratLigne
 				$this->date_fin_validite = $this->db->jdate($obj->date_fin_validite);
 				$this->date_cloture = $this->db->jdate($obj->date_cloture);
 				$this->tva_tx = $obj->tva_tx;
+				$this->localtax1_tx = $obj->localtax1_tx;
+				$this->localtax2_tx = $obj->localtax2_tx;
 				$this->qty = $obj->qty;
 				$this->remise_percent = $obj->remise_percent;
 				$this->remise = $obj->remise;
@@ -1640,6 +1662,8 @@ class ContratLigne
 				$this->price_ht = $obj->price_ht;
 				$this->total_ht = $obj->total_ht;
 				$this->total_tva = $obj->total_tva;
+				$this->total_localtax1 = $obj->total_localtax1;
+				$this->total_localtax2 = $obj->total_localtax2;
 				$this->total_ttc = $obj->total_ttc;
 				$this->info_bits = $obj->info_bits;
 				$this->fk_user_author = $obj->fk_user_author;
@@ -1670,7 +1694,7 @@ class ContratLigne
 	function update($user, $notrigger=0)
 	{
 		global $conf, $langs;
-
+		
 		// Clean parameters
 		$this->fk_contrat=trim($this->fk_contrat);
 		$this->fk_product=trim($this->fk_product);
@@ -1678,6 +1702,8 @@ class ContratLigne
 		$this->label=trim($this->label);
 		$this->description=trim($this->description);
 		$this->tva_tx=trim($this->tva_tx);
+		$this->localtax1_tx=trim($this->localtax1_tx);
+		$this->localtax2_tx=trim($this->localtax2_tx);
 		$this->qty=trim($this->qty);
 		$this->remise_percent=trim($this->remise_percent);
 		$this->remise=trim($this->remise);
@@ -1686,6 +1712,8 @@ class ContratLigne
 		$this->price_ht=price2num($this->price_ht);
 		$this->total_ht=trim($this->total_ht);
 		$this->total_tva=trim($this->total_tva);
+		$this->total_localtax1=trim($this->total_localtax1);
+		$this->total_localtax2=trim($this->total_localtax2);
 		$this->total_ttc=trim($this->total_ttc);
 		$this->info_bits=trim($this->info_bits);
 		$this->fk_user_author=trim($this->fk_user_author);
@@ -1709,6 +1737,8 @@ class ContratLigne
 		$sql.= " date_fin_validite=".($this->date_fin_validite!=''?$this->db->idate($this->date_fin_validite):"null").",";
 		$sql.= " date_cloture=".($this->date_cloture!=''?$this->db->idate($this->date_cloture):"null").",";
 		$sql.= " tva_tx='".$this->tva_tx."',";
+		$sql.= " localtax1_tx='".$this->localtax1_tx."',";
+		$sql.= " localtax2_tx='".$this->localtax2_tx."',";
 		$sql.= " qty='".$this->qty."',";
 		$sql.= " remise_percent='".$this->remise_percent."',";
 		$sql.= " remise=".($this->remise?"'".$this->remise."'":"null").",";
@@ -1717,6 +1747,8 @@ class ContratLigne
 		$sql.= " price_ht='".$this->price_ht."',";
 		$sql.= " total_ht='".$this->total_ht."',";
 		$sql.= " total_tva='".$this->total_tva."',";
+		$sql.= " total_localtax1='".$this->total_localtax1."',";
+		$sql.= " total_localtax2='".$this->total_localtax2."',";
 		$sql.= " total_ttc='".$this->total_ttc."',";
 		$sql.= " info_bits='".$this->info_bits."',";
 		$sql.= " fk_user_author=".($this->fk_user_author >= 0?$this->fk_user_author:"NULL").",";
@@ -1767,6 +1799,8 @@ class ContratLigne
 		$sql = "UPDATE ".MAIN_DB_PREFIX."contratdet SET";
 		$sql.= " total_ht=".price2num($this->total_ht,'MT')."";
 		$sql.= ",total_tva=".price2num($this->total_tva,'MT')."";
+		$sql.= ",total_localtax1=".price2num($this->total_localtax1,'MT')."";
+		$sql.= ",total_localtax2=".price2num($this->total_localtax2,'MT')."";
 		$sql.= ",total_ttc=".price2num($this->total_ttc,'MT')."";
 		$sql.= " WHERE rowid = ".$this->rowid;
 
diff --git a/htdocs/contrat/fiche.php b/htdocs/contrat/fiche.php
index 8e458fec911..ec055088942 100644
--- a/htdocs/contrat/fiche.php
+++ b/htdocs/contrat/fiche.php
@@ -3,6 +3,7 @@
  * Copyright (C) 2004-2009 Laurent Destailleur  <eldy@users.sourceforge.net>
  * Copyright (C) 2005-2009 Regis Houssin        <regis@dolibarr.fr>
  * Copyright (C) 2006      Andre Cianfarani     <acianfa@free.fr>
+ * Copyright (C) 2010      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
@@ -270,6 +271,9 @@ if ($_POST["action"] == 'addligne' && $user->rights->contrat->creer)
 	        $desc=$_POST['desc'];
         }
 
+        $localtax1_tx=get_localtax($tva_tx,1,$contrat->client);
+        $localtax2_tx=get_localtax($tva_tx,2,$contrat->client);
+        
 		$info_bits=0;
 		if ($tva_npr) $info_bits |= 0x01;
 
@@ -279,6 +283,8 @@ if ($_POST["action"] == 'addligne' && $user->rights->contrat->creer)
                 $pu_ht,
                 $_POST["pqty"],
                 $tva_tx,
+                $localtax1_tx,
+                $localtax2_tx,
                 $_POST["p_idprod"],
                 $_POST["premise"],
                 $date_start,
@@ -320,6 +326,9 @@ if ($_POST["action"] == 'updateligne' && $user->rights->contrat->creer && ! $_PO
 
 		if ($date_start_real_update == '') $date_start_real_update=$contratline->date_ouverture;
 		if ($date_end_real_update == '')   $date_end_real_update=$contratline->date_cloture;
+		
+		$localtax1_tx=get_localtax($_POST["eltva_tx"],1,$contrat->client);
+        $localtax2_tx=get_localtax($_POST["eltva_tx"],2,$contrat->client);
 
 		$contratline->description=$_POST["eldesc"];
 		$contratline->price_ht=$_POST["elprice"];
@@ -327,7 +336,8 @@ if ($_POST["action"] == 'updateligne' && $user->rights->contrat->creer && ! $_PO
         $contratline->qty=$_POST["elqty"];
         $contratline->remise_percent=$_POST["elremise_percent"];
 		$contratline->tva_tx=$_POST["eltva_tx"];
-
+		$contratline->localtax1_tx=$localtax1_tx;
+		$contratline->localtax2_tx=$localtax2_tx;
 		$contratline->date_ouverture_prevue=$date_start_update;
 		$contratline->date_ouverture=$date_start_real_update;
 		$contratline->date_fin_validite=$date_end_update;
diff --git a/htdocs/install/mysql/migration/2.8.0-2.9.0.sql b/htdocs/install/mysql/migration/2.8.0-2.9.0.sql
index 61850bbd2ca..03a95ba4aa9 100755
--- a/htdocs/install/mysql/migration/2.8.0-2.9.0.sql
+++ b/htdocs/install/mysql/migration/2.8.0-2.9.0.sql
@@ -93,6 +93,11 @@ alter table llx_product add column localtax2_tx double(6,3) DEFAULT 0 after loca
 alter table llx_product_price add column localtax1_tx double(6,3) DEFAULT 0 after tva_tx;
 alter table llx_product_price add column localtax2_tx double(6,3) DEFAULT 0 after localtax1_tx;
 
+alter table llx_contratdet add column localtax1_tx double(6,3) DEFAULT 0 after tva_tx;
+alter table llx_contratdet add column localtax2_tx double(6,3) DEFAULT 0 after localtax1_tx;
+alter table llx_contratdet add column total_localtax1 double(24,8) DEFAULT 0 after total_tva;
+alter table llx_contratdet add column total_localtax2 double(24,8) DEFAULT 0 after total_localtax1;
+
 alter table llx_product add column   hidden             tinyint      DEFAULT 0;
 
 alter table llx_product add column   length             float        DEFAULT NULL after weight_units;
diff --git a/htdocs/install/mysql/tables/llx_contratdet.sql b/htdocs/install/mysql/tables/llx_contratdet.sql
index f1041e1198f..7e94faaabf3 100644
--- a/htdocs/install/mysql/tables/llx_contratdet.sql
+++ b/htdocs/install/mysql/tables/llx_contratdet.sql
@@ -1,5 +1,6 @@
 -- ============================================================================
 -- Copyright (C) 2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
+-- Copyright (C) 2010 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
@@ -39,6 +40,8 @@ create table llx_contratdet
   date_cloture          datetime,
 
   tva_tx                double(6,3)   DEFAULT 0, 	         -- taux tva
+  localtax1_tx		double(6,3)   DEFAULT 0,           -- local tax 1 rate
+  localtax2_tx		double(6,3)   DEFAULT 0,           -- local tax 2 rate
   qty                   real          NOT NULL,            -- quantity
   remise_percent        real          DEFAULT 0,    		   -- pourcentage de remise
   subprice              double(24,8)  DEFAULT 0,           -- prix unitaire
@@ -46,6 +49,8 @@ create table llx_contratdet
   remise                real          DEFAULT 0,    		             -- montant de la remise (obsolete)
   total_ht              double(24,8)  DEFAULT 0,     		   -- Total HT de la ligne toute quantite et incluant remise ligne et globale
   total_tva             double(24,8)  DEFAULT 0,	   		   -- Total TVA de la ligne toute quantite et incluant remise ligne et globale
+  total_localtax1       double(24,8)  DEFAULT 0,	   		   -- Total Local tax 1 de la ligne
+  total_localtax2       double(24,8)  DEFAULT 0,	   		   -- Total Local tax 2 de la ligne
   total_ttc             double(24,8)  DEFAULT 0,	   		   -- Total TTC de la ligne toute quantite et incluant remise ligne et globale
   info_bits		          integer       DEFAULT 0, 		       -- TVA NPR ou non
 
-- 
GitLab