diff --git a/ChangeLog b/ChangeLog index 66e4a8cfd89..db9fc3b9f8e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,7 @@ English Dolibarr ChangeLog ***** ChangeLog for 3.4 compared to 3.3 ***** For users: +- New: Support revenue stamp onto invoices. - New: Add a tab "consumption" on thirdparties to list products bought/sells. - New: Some performance enhancements. - New: Can attach files onto trip and expenses modules. diff --git a/htdocs/admin/company.php b/htdocs/admin/company.php index 55ad5902e13..55a8a8b8b60 100644 --- a/htdocs/admin/company.php +++ b/htdocs/admin/company.php @@ -547,7 +547,7 @@ if ($action == 'edit' || $action == 'updateedit') /* * Local Taxes */ - if ($mysoc->hasLocalTax(1)) + if ($mysoc->useLocalTax(1)) { // Local Tax 1 print '
'; @@ -579,7 +579,7 @@ if ($action == 'edit' || $action == 'updateedit') print "\n"; print ""; } - if ($mysoc->hasLocalTax(2)) + if ($mysoc->useLocalTax(2)) { // Local Tax 2 print '
'; @@ -927,7 +927,7 @@ else /* * Local Taxes */ - if ($mysoc->hasLocalTax(1)) + if ($mysoc->useLocalTax(1)) { // Local Tax 1 print '
'; @@ -960,7 +960,7 @@ else print ""; } - if ($mysoc->hasLocalTax(2)) + if ($mysoc->useLocalTax(2)) { // Local Tax 2 print '
'; diff --git a/htdocs/commande/fiche.php b/htdocs/commande/fiche.php index 52b7761adbe..bb9c9117f24 100644 --- a/htdocs/commande/fiche.php +++ b/htdocs/commande/fiche.php @@ -1487,7 +1487,7 @@ if ($action == 'send' && ! GETPOST('addfile') && ! GETPOST('removedfile') && ! G else { print ''; - print $form->select_company('','socid','s.client = 1',1); + print $form->select_company('','socid','s.client = 1 OR s.client = 3',1); print ''; } print ''."\n"; diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index 96fca70af4c..f792d7c6e20 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -302,6 +302,14 @@ else if ($action == 'setpaymentterm' && $user->rights->facture->creer) $result=$object->update($user); if ($result < 0) dol_print_error($db,$object->error); } +else if ($action == 'setrevenuestamp' && $user->rights->facture->creer) +{ + $object->fetch($id); + $object->revenuestamp=GETPOST('revenuestamp'); + $result=$object->update($user); + $object->update_price(1); + if ($result < 0) dol_print_error($db,$object->error); +} else if ($action == 'setremisepercent' && $user->rights->facture->creer) { $object->fetch($id); @@ -369,22 +377,22 @@ else if ($action == 'confirm_valid' && $confirm == 'yes' && $user->rights->factu $object->fetch_thirdparty(); // Check parameters - + // Check for mandatory prof id for ($i = 1; $i < 5; $i++) { - + $idprof_mandatory ='SOCIETE_IDPROF'.($i).'_INVOICE_MANDATORY'; $idprof='idprof'.$i; if (! $object->thirdparty->$idprof && ! empty($conf->global->$idprof_mandatory)) { if (! $error) $langs->load("errors"); $error++; - + setEventMessage($langs->trans('ErrorProdIdIsMandatory',$langs->transcountry('ProfId'.$i, $object->thirdparty->country_code)),'errors'); } - } - + } + //Check for warehouse if ($object->type != 3 && ! empty($conf->global->STOCK_CALCULATE_ON_BILL) && $object->hasProductsOrServices(1)) { @@ -395,7 +403,7 @@ else if ($action == 'confirm_valid' && $confirm == 'yes' && $user->rights->factu $action=''; } } - + if (! $error) { $result = $object->validate($user,'',$idwarehouse); @@ -617,7 +625,7 @@ else if ($action == 'add' && $user->rights->facture->creer) $db->begin(); $error=0; - + // Get extra fields foreach($_POST as $key => $value) { @@ -1630,7 +1638,7 @@ else if ($action == 'builddoc') // En get ou en post if (GETPOST('model')) $object->setDocModel($user, GETPOST('model')); if (GETPOST('fk_bank')) $object->fk_bank=GETPOST('fk_bank'); - + // Define output language $outputlangs = $langs; $newlang=''; @@ -1916,7 +1924,7 @@ if ($action == 'create') else { print ''; - print $form->select_company('','socid','s.client = 1',1); + print $form->select_company('','socid','s.client = 1 OR s.client = 3',1); print ''; } print ''."\n"; @@ -2272,10 +2280,10 @@ else if ($id > 0 || ! empty($ref)) */ $result=$object->fetch($id,$ref); - + // fetch optionals attributes and labels $extralabels=$extrafields->fetch_name_optionals_label('facture'); - + if ($result > 0) { if ($user->societe_id>0 && $user->societe_id!=$object->socid) accessforbidden('',0); @@ -2284,11 +2292,12 @@ else if ($id > 0 || ! empty($ref)) $soc = new Societe($db); $soc->fetch($object->socid); + $selleruserevenustamp=$mysoc->useRevenueStamp(); $totalpaye = $object->getSommePaiement(); $totalcreditnotes = $object->getSumCreditNotesUsed(); $totaldeposits = $object->getSumDepositsUsed(); - //print "totalpaye=".$totalpaye." totalcreditnotes=".$totalcreditnotes." totaldeposts=".$totaldeposits; + //print "totalpaye=".$totalpaye." totalcreditnotes=".$totalcreditnotes." totaldeposts=".$totaldeposits." selleruserrevenuestamp=".$selleruserevenustamp; // We can also use bcadd to avoid pb with floating points // For example print 239.2 - 229.3 - 9.9; does not return 0. @@ -2752,10 +2761,9 @@ else if ($id > 0 || ! empty($ref)) $nbrows=8; $nbcols=2; if (! empty($conf->projet->enabled)) $nbrows++; if (! empty($conf->banque->enabled)) $nbcols++; - - //Local taxes if($mysoc->localtax1_assuj=="1") $nbrows++; if($mysoc->localtax2_assuj=="1") $nbrows++; + if ($selleruserevenustamp) $nbrows++; print ''; @@ -3031,17 +3039,44 @@ else if ($id > 0 || ! empty($ref)) print ''; // Amount Local Taxes - if ($mysoc->localtax1_assuj=="1") //Localtax1 RE + if ($mysoc->localtax1_assuj=="1" && $mysoc->useLocalTax(1)) //Localtax1 (example RE) { print ''.$langs->transcountry("AmountLT1",$mysoc->country_code).''; print ''.price($object->total_localtax1,1,'',1,-1,-1,$conf->currency).''; } - if ($mysoc->localtax2_assuj=="1") //Localtax2 IRPF + if ($mysoc->localtax2_assuj=="1" && $mysoc->useLocalTax(2)) //Localtax2 (example IRPF) { print ''.$langs->transcountry("AmountLT2",$mysoc->country_code).''; print ''.price($object->total_localtax2,1,'',1,-1,-1,$conf->currency).''; } + // Revenue stamp + if ($selleruserevenustamp) // Test company use revenue stamp + { + print ''; + print ''; + if ($action != 'editrevenuestamp' && ! empty($object->brouillon) && $user->rights->facture->creer) print ''; + print '
'; + print $langs->trans('RevenueStamp'); + print 'id.'">'.img_edit($langs->trans('SetRevenuStamp'),1).'
'; + print ''; + if ($action == 'editrevenuestamp') + { + print '
'; + print ''; + print ''; + print ''; + print ' '; + print '
'; + } + else + { + print price($object->revenuestamp,1,'',1,-1,-1,$conf->currency); + } + print ''; + } + + // Total with tax print ''.$langs->trans('AmountTTC').''.price($object->total_ttc,1,'',1,-1,-1,$conf->currency).''; // Statut @@ -3078,14 +3113,14 @@ else if ($id > 0 || ! empty($ref)) print ''; print ''; } - + // Other attributes $res=$object->fetch_optionals($object->id,$extralabels); $parameters=array('colspan' => ' colspan="2"'); $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$object,$action); // Note that $action and $object may have been modified by hook if (empty($reshook) && ! empty($extrafields->attribute_label)) { - + if ($action == 'edit_extras') { print '
'; @@ -3093,8 +3128,8 @@ else if ($id > 0 || ! empty($ref)) print ''; print ''; } - - + + foreach($extrafields->attribute_label as $key=>$label) { $value=(isset($_POST["options_".$key])?$_POST["options_".$key]:$object->array_options["options_".$key]); @@ -3118,16 +3153,16 @@ else if ($id > 0 || ! empty($ref)) print ''."\n"; } } - + if(count($extrafields->attribute_label) > 0) { - + if ($action == 'edit_extras' && $user->rights->facture->creer) { print ''; print ''; print '
'; print ''; - + } else { if ($object->statut == 0 && $user->rights->facture->creer) diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index f3427ee5d4b..38995fdebb9 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -75,6 +75,7 @@ class Facture extends CommonInvoice var $total_ht=0; var $total_tva=0; var $total_ttc=0; + var $revenuestamp; var $note; // deprecated var $note_private; var $note_public; @@ -795,7 +796,8 @@ class Facture extends CommonInvoice if (empty($rowid) && empty($ref) && empty($ref_ext) && empty($ref_int)) return -1; - $sql = 'SELECT f.rowid,f.facnumber,f.ref_client,f.ref_ext,f.ref_int,f.type,f.fk_soc,f.amount,f.tva, f.localtax1, f.localtax2, f.total,f.total_ttc,f.remise_percent,f.remise_absolue,f.remise'; + $sql = 'SELECT f.rowid,f.facnumber,f.ref_client,f.ref_ext,f.ref_int,f.type,f.fk_soc,f.amount,f.tva, f.localtax1, f.localtax2, f.total, f.total_ttc, f.revenuestamp'; + $sql.= ', f.remise_percent, f.remise_absolue, f.remise'; $sql.= ', f.datef as df'; $sql.= ', f.date_lim_reglement as dlr'; $sql.= ', f.datec as datec'; @@ -841,6 +843,7 @@ class Facture extends CommonInvoice $this->total_localtax1 = $obj->localtax1; $this->total_localtax2 = $obj->localtax2; $this->total_ttc = $obj->total_ttc; + $this->revenuestamp = $obj->revenuestamp; $this->paye = $obj->paye; $this->close_code = $obj->close_code; $this->close_note = $obj->close_note; @@ -1050,6 +1053,7 @@ class Facture extends CommonInvoice $sql.= " localtax2=".(isset($this->total_localtax2)?$this->total_localtax2:"null").","; $sql.= " total=".(isset($this->total_ht)?$this->total_ht:"null").","; $sql.= " total_ttc=".(isset($this->total_ttc)?$this->total_ttc:"null").","; + $sql.= " revenuestamp=".((isset($this->revenuestamp) && $this->revenuestamp != '')?$this->revenuestamp:"null").","; $sql.= " fk_statut=".(isset($this->statut)?$this->statut:"null").","; $sql.= " fk_user_author=".(isset($this->user_author)?$this->user_author:"null").","; $sql.= " fk_user_valid=".(isset($this->fk_user_valid)?$this->fk_user_valid:"null").","; diff --git a/htdocs/contrat/fiche.php b/htdocs/contrat/fiche.php index 902dde79f17..de9ce68e6b3 100644 --- a/htdocs/contrat/fiche.php +++ b/htdocs/contrat/fiche.php @@ -827,7 +827,7 @@ if ($action == 'create') else { print ''; - print $form->select_company('','socid','s.client = 1',1); + print $form->select_company('','socid','s.client = 1 OR s.client = 3',1); print ''; } print ''."\n"; diff --git a/htdocs/core/class/commondocgenerator.class.php b/htdocs/core/class/commondocgenerator.class.php index faccaa31545..9561aa288fb 100755 --- a/htdocs/core/class/commondocgenerator.class.php +++ b/htdocs/core/class/commondocgenerator.class.php @@ -185,11 +185,11 @@ abstract class CommonDocGenerator } $array_thirdparty=array_merge($array_thirdparty,array('company_options_'.$key => $object->array_options['options_'.$key])); } - } + } return $array_thirdparty; } - + /** * Define array with couple substitution key => substitution value * @@ -201,7 +201,7 @@ abstract class CommonDocGenerator function get_substitutionarray_propal($object,$outputlangs,$array_key='object') { global $conf; - + $array_propal=array( $array_key.'_id'=>$object->id, $array_key.'_ref'=>$object->ref, @@ -224,14 +224,14 @@ abstract class CommonDocGenerator $array_key.'_note_private'=>$object->note, $array_key.'_note'=>$object->note_public, ); - + // Add vat by rates foreach ($object->lines as $line) { if (empty($array_propal[$array_key.'_total_vat_'.$line->tva_tx])) $array_propal[$array_key.'_total_vat_'.$line->tva_tx]=0; $array_propal[$array_key.'_total_vat_'.$line->tva_tx]+=$line->total_tva; } - + // Retrieve extrafields if(is_array($object->array_options) && count($object->array_options)) { @@ -240,12 +240,12 @@ abstract class CommonDocGenerator $extrafields = new ExtraFields($this->db); $extralabels = $extrafields->fetch_name_optionals_label('propal',true); $object->fetch_optionals($object->id,$extralabels); - + $array_propal = $this->fill_substitutionarray_with_extrafields($object,$array_propal,$extrafields,$array_key,$outputlangs); } return $array_propal; } - + /** * Define array with couple substitution key => substitution value @@ -257,7 +257,7 @@ abstract class CommonDocGenerator function get_substitutionarray_propal_lines($line,$outputlangs) { global $conf; - + return array( 'line_fulldesc'=>doc_getlinedesc($line,$outputlangs), 'line_product_ref'=>$line->product_ref, @@ -274,7 +274,7 @@ abstract class CommonDocGenerator 'line_date_end'=>$line->date_end ); } - + /** * Fill array with couple extrafield key => extrafield value * @@ -309,14 +309,14 @@ abstract class CommonDocGenerator { $object->array_options['options_'.$key] = ($object->array_options['options_'.$key]!="0000-00-00 00:00:00"?dol_print_date($object->array_options['options_'.$key],'dayhour'):''); } - $array_to_fill=array_merge($array_to_fill,array($array_key.'_options_'.$key => $object->array_options['options_'.$key])); + $array_to_fill=array_merge($array_to_fill,array($array_key.'_options_'.$key => $object->array_options['options_'.$key])); } - + return $array_to_fill; - + } - - + + /** * Rect pdf * diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 975765d12b4..79a471a0251 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -1556,6 +1556,9 @@ abstract class CommonObject $i++; } + // Add revenue stamp to total + $this->total_ttc += isset($this->revenuestamp)?$this->revenuestamp:0; + $this->db->free($resql); // Now update global field total_ht, total_ttc and tva diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 941865da45a..4807ec768fa 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -678,7 +678,7 @@ class Form if (!$user->rights->societe->client->voir && !$user->societe_id) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; $sql.= " WHERE s.entity IN (".getEntity('societe', 1).")"; if (! empty($user->societe_id)) $sql.= " AND s.rowid = ".$user->societe_id; - if ($filter) $sql.= " AND ".$filter; + if ($filter) $sql.= " AND (".$filter.")"; if (!$user->rights->societe->client->voir && !$user->societe_id) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; $sql.= " ORDER BY nom ASC"; diff --git a/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php b/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php index 957b5d85428..ee80dbbb141 100644 --- a/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php +++ b/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php @@ -121,16 +121,16 @@ class doc_generic_invoice_odt extends ModelePDFFactures 'object_payment_mode'=>($outputlangs->transnoentitiesnoconv('PaymentType'.$object->mode_reglement_code)!='PaymentType'.$object->mode_reglement_code?$outputlangs->transnoentitiesnoconv('PaymentType'.$object->mode_reglement_code):$object->mode_reglement), 'object_payment_term_code'=>$object->cond_reglement_code, 'object_payment_term'=>($outputlangs->transnoentitiesnoconv('PaymentCondition'.$object->cond_reglement_code)!='PaymentCondition'.$object->cond_reglement_code?$outputlangs->transnoentitiesnoconv('PaymentCondition'.$object->cond_reglement_code):$object->cond_reglement), - 'object_total_ht'=>price2num($object->total_ht,2), - 'object_total_vat'=>price2num($object->total_tva,2), - 'object_total_ttc'=>price2num($object->total_ttc,2), + 'object_total_ht'=>price2num($object->total_ht), + 'object_total_vat'=>price2num($object->total_tva), + 'object_total_ttc'=>price2num($object->total_ttc), 'object_total_discount_ht' => price2num($object->getTotalDiscount(), 0, $outputlangs), 'object_vatrate'=>(isset($object->tva)?vatrate($object->tva):''), 'object_note_private'=>$object->note, 'object_note'=>$object->note_public, // Payments 'object_already_payed'=>$alreadypayed, - 'object_remain_to_pay'=>price2num($object->total_ttc - $sumpayed,2) + 'object_remain_to_pay'=>price2num($object->total_ttc - $sumpayed) ); // Add vat by rates @@ -139,7 +139,7 @@ class doc_generic_invoice_odt extends ModelePDFFactures if (empty($resarray['object_total_vat_'.$line->tva_tx])) $resarray['object_total_vat_'.$line->tva_tx]=0; $resarray['object_total_vat_'.$line->tva_tx]+=$line->total_tva; } - + // Retrieve extrafields if(is_array($object->array_options) && count($object->array_options)) { @@ -148,7 +148,7 @@ class doc_generic_invoice_odt extends ModelePDFFactures $extrafields = new ExtraFields($this->db); $extralabels = $extrafields->fetch_name_optionals_label('facture',true); $object->fetch_optionals($object->id,$extralabels); - + $resarray = $this->fill_substitutionarray_with_extrafields($object,$resarray,$extrafields,$array_key='object',$outputlangs); } return $resarray; @@ -174,9 +174,9 @@ class doc_generic_invoice_odt extends ModelePDFFactures 'line_up'=>price($line->subprice, 0, $outputlangs), 'line_qty'=>$line->qty, 'line_discount_percent'=>($line->remise_percent?$line->remise_percent.'%':''), - 'line_price_ht'=>price2num($line->total_ht, 2), - 'line_price_ttc'=>price2num($line->total_ttc, 2), - 'line_price_vat'=>price2num($line->total_tva, 2), + 'line_price_ht'=>price2num($line->total_ht), + 'line_price_ttc'=>price2num($line->total_ttc), + 'line_price_vat'=>price2num($line->total_tva), 'line_date_start'=>dol_print_date($line->date_start, 'day', false, $outputlangs), 'line_date_end'=>dol_print_date($line->date_end, 'day', false, $outputlangs), ); @@ -358,14 +358,13 @@ class doc_generic_invoice_odt extends ModelePDFFactures { $socobject=$object->client; } - + // Fetch info for linked propal $linked_propal = $object->fetchObjectLinked('','','',''); - print '
';
                 //print_r($object->linkedObjects['propal']); exit;
 
                 $propal_object = $object->linkedObjects['propal'][0];
-                
+
                 // Make substitution
                 $substitutionarray=array(
                     '__FROM_NAME__' => $this->emetteur->nom,
@@ -415,7 +414,7 @@ class doc_generic_invoice_odt extends ModelePDFFactures
 				$array_soc=$this->get_substitutionarray_mysoc($mysoc,$outputlangs);
 				$array_thirdparty=$this->get_substitutionarray_thirdparty($socobject,$outputlangs);
 				$array_objet=$this->get_substitutionarray_object($object,$outputlangs);
-				$array_propal=$this->get_substitutionarray_propal($propal_object,$outputlangs,'propal');
+				$array_propal=is_object($propal_object)?$this->get_substitutionarray_propal($propal_object,$outputlangs,'propal'):array();
 
 				$tmparray = array_merge($array_user,$array_soc,$array_thirdparty,$array_objet,$array_propal);
 				complete_substitutions_array($tmparray, $outputlangs, $object);
diff --git a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php
index ef7698d0564..15ee4e29aba 100755
--- a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php
+++ b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php
@@ -1020,6 +1020,17 @@ class pdf_crabe extends ModelePDFFactures
 					//}
 				}
 
+				// Revenue stamp
+				if (price2num($object->revenuestamp) != 0)
+				{
+					$index++;
+					$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);
+					$pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("RevenueStamp"), $useborder, 'L', 1);
+
+					$pdf->SetXY($col2x, $tab2_top + $tab2_hl * $index);
+					$pdf->MultiCell($largcol2, $tab2_hl, price($sign * $object->revenuestamp), $useborder, 'R', 1);
+				}
+
 				// Total TTC
 				$index++;
 				$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);
diff --git a/htdocs/install/mysql/data/llx_c_revenuestamp.sql b/htdocs/install/mysql/data/llx_c_revenuestamp.sql
index 8d998111218..040a8370485 100644
--- a/htdocs/install/mysql/data/llx_c_revenuestamp.sql
+++ b/htdocs/install/mysql/data/llx_c_revenuestamp.sql
@@ -1,13 +1,4 @@
--- Copyright (C) 2001-2004 Rodolphe Quiedeville 
--- Copyright (C) 2003      Jean-Louis Bergamo   
 -- Copyright (C) 2004-2011 Laurent Destailleur  
--- Copyright (C) 2004      Benoit Mortier       
--- Copyright (C) 2004      Guillaume Delecourt  
--- Copyright (C) 2005-2009 Regis Houssin        
--- Copyright (C) 2007 	   Patrick Raguin       
--- Copyright (C) 2010-2011 Juanjo Menent        
--- Copyright (C) 2012      Sebastian Neuwert    
--- Copyright (C) 2012	   Ricardo Schluter		
 --
 -- 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
@@ -35,5 +26,5 @@
 
 delete from llx_c_revenuestamp;
 
--- TUNISIA --
-insert into llx_c_revenuestamp(rowid,fk_pays,taux,note,active) values (101, 10, '0.4', 'Timbre fiscal', 1);
+-- TUNISIA (id country=10) --
+insert into llx_c_revenuestamp(rowid,fk_pays,taux,note,active) values (101, 10, 0.4, 'Revenue stamp tunisia', 1);
diff --git a/htdocs/install/mysql/data/llx_c_tva.sql b/htdocs/install/mysql/data/llx_c_tva.sql
index b5f578f579b..b6d38949451 100644
--- a/htdocs/install/mysql/data/llx_c_tva.sql
+++ b/htdocs/install/mysql/data/llx_c_tva.sql
@@ -219,13 +219,13 @@ insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values ( 6
 insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values ( 64, 6,   '0','0','VAT Rate 0',  1);
 
 -- TUNISIA (id country=10)
-insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active,localtax1,localtax1_type,localtax2,localtax2_type) values (101,10,    '6','0','VAT 6%', 1, 1, '4', 0.4, '7');
-insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active,localtax1,localtax1_type,localtax2,localtax2_type) values (102,10,   '12','0','VAT 12%',1, 1, '4', 0.4, '7');
-insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active,localtax1,localtax1_type,localtax2,localtax2_type) values (103,10,   '18','0','VAT 18%',1, 1, '4', 0.4, '7');
-insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active,localtax1,localtax1_type,localtax2,localtax2_type) values (104,10,  '7.5','0','VAT 6% Majoré à 25% (7.5%)',1, 1, '4', 0.4, '7');
-insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active,localtax1,localtax1_type,localtax2,localtax2_type) values (105,10,   '15','0','VAT 12% Majoré à 25% (15%)',1, 1, '4', 0.4, '7');
-insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active,localtax1,localtax1_type,localtax2,localtax2_type) values (106,10, '22.5','0','VAT 18% Majoré à 25% (22.5%)',1, 1, '4', 0.4, '7');
-insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active,localtax1,localtax1_type,localtax2,localtax2_type) values (107,10,    '0','0','VAT Rate 0',  1, 1, '4', 0.4, '7');
+insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active,localtax1,localtax1_type,localtax2,localtax2_type) values (101,10,    '6','0','VAT 6%', 1, 1, '4', 0, null);
+insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active,localtax1,localtax1_type,localtax2,localtax2_type) values (102,10,   '12','0','VAT 12%',1, 1, '4', 0, null);
+insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active,localtax1,localtax1_type,localtax2,localtax2_type) values (103,10,   '18','0','VAT 18%',1, 1, '4', 0, null);
+insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active,localtax1,localtax1_type,localtax2,localtax2_type) values (104,10,  '7.5','0','VAT 6% Majoré à 25% (7.5%)',1, 1, '4', 0, null);
+insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active,localtax1,localtax1_type,localtax2,localtax2_type) values (105,10,   '15','0','VAT 12% Majoré à 25% (15%)',1, 1, '4', 0, null);
+insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active,localtax1,localtax1_type,localtax2,localtax2_type) values (106,10, '22.5','0','VAT 18% Majoré à 25% (22.5%)',1, 1, '4', 0, null);
+insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active,localtax1,localtax1_type,localtax2,localtax2_type) values (107,10,    '0','0','VAT Rate 0',  1, 1, '4', 0, null);
 
 -- UKRAINE (id country=226)
 INSERT INTO llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values (2261,226,  '20','0','VAT standart rate',1);
diff --git a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql
index e6b82dc565e..571ba7373a2 100755
--- a/htdocs/install/mysql/migration/3.3.0-3.4.0.sql
+++ b/htdocs/install/mysql/migration/3.3.0-3.4.0.sql
@@ -130,8 +130,6 @@ CREATE TABLE llx_c_revenuestamp
 
 insert into llx_c_revenuestamp(rowid,fk_pays,taux,note,active) values (101, 10, '0.4', 'Timbre fiscal', 1);
 
-ALTER TABLE llx_actioncomm ADD COLUMN code varchar(32) NULL after fk_action;
-
 ALTER TABLE llx_c_tva MODIFY COLUMN localtax1_type varchar(10)	NOT NULL DEFAULT '0';
 ALTER TABLE llx_c_tva MODIFY COLUMN localtax2_type varchar(10)	NOT NULL DEFAULT '0';
 ALTER TABLE llx_commande_fournisseurdet MODIFY COLUMN localtax1_type varchar(10)	NOT NULL DEFAULT '0';
@@ -148,6 +146,13 @@ ALTER TABLE llx_facturedet MODIFY COLUMN localtax1_type varchar(10)	NOT NULL DEF
 ALTER TABLE llx_facturedet MODIFY COLUMN localtax2_type varchar(10)	NOT NULL DEFAULT '0';
 ALTER TABLE llx_propaldet MODIFY COLUMN localtax1_type varchar(10)	NOT NULL DEFAULT '0';
 ALTER TABLE llx_propaldet MODIFY COLUMN localtax2_type varchar(10)	NOT NULL DEFAULT '0';
+-- No more use type 7, use revenuse stamp instead
+UPDATE llx_c_tva set localtax1=0, localtax1_type='0' where localtax1_type = '7';
+UPDATE llx_c_tva set localtax2=0, localtax2_type='0' where localtax2_type = '7';
+
+
+ALTER TABLE llx_actioncomm ADD COLUMN code varchar(32) NULL after fk_action;
+
 
 ALTER TABLE llx_holiday ADD COLUMN note text; 
 ALTER TABLE llx_holiday ADD COLUMN note_public text;
@@ -197,5 +202,9 @@ ALTER TABLE llx_societe MODIFY COLUMN zip varchar(25);
 ALTER TABLE llx_user ADD COLUMN   address           varchar(255);
 ALTER TABLE llx_user ADD COLUMN   zip               varchar(25);
 ALTER TABLE llx_user ADD COLUMN   town              varchar(50);
-ALTER TABLE llx_user ADD COLUMN   fk_state          integer        DEFAULT 0;            		--
+ALTER TABLE llx_user ADD COLUMN   fk_state          integer        DEFAULT 0;
 ALTER TABLE llx_user ADD COLUMN   fk_country        integer        DEFAULT 0;
+
+
+
+
diff --git a/htdocs/install/mysql/tables/llx_c_tva.sql b/htdocs/install/mysql/tables/llx_c_tva.sql
index 219b1fb9744..46aa3632faa 100644
--- a/htdocs/install/mysql/tables/llx_c_tva.sql
+++ b/htdocs/install/mysql/tables/llx_c_tva.sql
@@ -24,9 +24,9 @@ create table llx_c_tva
   fk_pays           integer NOT NULL,
   taux              double  NOT NULL,
   localtax1         double  NOT NULL DEFAULT 0,
-  localtax1_type	varchar(10)	NOT NULL DEFAULT '0',
+  localtax1_type	varchar(10)	 NOT NULL DEFAULT '0',
   localtax2         double  NOT NULL DEFAULT 0,
-  localtax2_type	varchar(10)	NOT NULL DEFAULT '0',
+  localtax2_type	varchar(10) NOT NULL DEFAULT '0',
   recuperableonly   integer NOT NULL DEFAULT 0,
   note              varchar(128),
   active            tinyint DEFAULT 1 NOT NULL,
diff --git a/htdocs/langs/en_US/bills.lang b/htdocs/langs/en_US/bills.lang
index 785f131b61b..1ce21c7a8f6 100644
--- a/htdocs/langs/en_US/bills.lang
+++ b/htdocs/langs/en_US/bills.lang
@@ -390,6 +390,7 @@ AllCompletelyPayedInvoiceWillBeClosed=All invoice with no remain to pay will be
 ToMakePayment=Pay
 ToMakePaymentBack=Pay back
 ListOfYourUnpaidInvoices=List of unpaid invoices
+RevenueStamp=Revenue stamp
 ##### Types de contacts #####
 TypeContact_facture_internal_SALESREPFOLL=Representative following-up customer invoice
 TypeContact_facture_external_BILLING=Customer invoice contact
diff --git a/htdocs/langs/fr_FR/bills.lang b/htdocs/langs/fr_FR/bills.lang
index 51424be1cbf..e5955167dd8 100644
--- a/htdocs/langs/fr_FR/bills.lang
+++ b/htdocs/langs/fr_FR/bills.lang
@@ -387,6 +387,7 @@ AllCompletelyPayedInvoiceWillBeClosed=Toutes les factures avec un reste à payer
 ToMakePayment=Payer
 ToMakePaymentBack=Rembourser
 ListOfYourUnpaidInvoices=Liste des factures impayées
+RevenueStamp=Timbre fiscal
 ##### Types de contacts #####
 TypeContact_facture_internal_SALESREPFOLL=Responsable suivi facture client
 TypeContact_facture_external_BILLING=Contact client facturation
diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php
index c87a6ef11f4..ecf387e13c2 100644
--- a/htdocs/societe/class/societe.class.php
+++ b/htdocs/societe/class/societe.class.php
@@ -82,7 +82,9 @@ class Societe extends CommonObject
     var $idprof1;	// IdProf1 (Ex: Siren in France)
     var $idprof2;	// IdProf2 (Ex: Siret in France)
     var $idprof3;	// IdProf3 (Ex: Ape in France)
-    var $idprof4;	// IdProf4 (Ex: RCS in France)
+    var $idprof4;	// IdProf4 (Ex: RCS in France)
+    var $idprof5;	// IdProf5
+    var $idprof6;	// IdProf6
 
     var $prefix_comm;
 
@@ -2599,40 +2601,53 @@ class Societe extends CommonObject
     }
 
     /**
-     *  Check if localtax define for company
-     *  Used to build previews or test instances.
-     *	id must be 0 if object instance is a specimen.
+     *  Check if thirdparty may using localtax or not
      *
-     *  @param	localTaxNum	$localTaxNum        1 or 2
-     *  @return boolean             			true / false
+     *	@param		int		$localTaxNum	To get info for only localtax1 or localtax2
+     *  @return		array					array(0=>boolean, 1=>boolean)
      */
-    function hasLocalTax($localTaxNum) {
-        global $user,$langs,$conf;
+    function useLocalTax($localTaxNum=0)
+    {
+    	$sql  = "SELECT t.localtax1, t.localtax2";
+    	$sql .= " FROM ".MAIN_DB_PREFIX."c_tva as t, ".MAIN_DB_PREFIX."c_pays as p";
+    	$sql .= " WHERE t.fk_pays = p.rowid AND p.code = '".$this->country_code."'";
+    	$sql .= " AND t.active = 1";
+    	if (empty($localTaxNum))   $sql .= " AND (t.localtax1_type <> '0' OR t.localtax2_type <> '0')";
+    	elseif ($localTaxNum == 1) $sql .= " AND t.localtax1_type <> '0'";
+    	elseif ($localTaxNum == 2) $sql .= " AND t.localtax2_type <> '0'";
 
-        // check parameter
-        if ($localTaxNum != 1 && $localTaxNum != 2)
-            return false;
+    	dol_syslog("useLocalTax sql=".$sql);
+    	$resql=$this->db->query($sql);
+    	if ($resql)
+    	{
+   			return ($this->db->num_rows($resql) > 0);
+    	}
+    	else return false;
+    }
 
-		// Search local taxes
-		$sql  = "SELECT t.localtax1, t.localtax2";
-		$sql .= " FROM ".MAIN_DB_PREFIX."c_tva as t, ".MAIN_DB_PREFIX."c_pays as p";
-		$sql .= " WHERE t.fk_pays = p.rowid AND p.code = '".$this->country_code."'";
-		$sql .= " AND t.active = 1";
-        if ($localTaxNum == 1)
-            $sql .= " AND t.localtax1 <> 0";
-        elseif ($localTaxNum == 2)
-            $sql .= " AND t.localtax2 <> 0";
+    /**
+     *  Check if thirdparty is from a country using revenue stamps
+     *
+     *  @return		boolean			Yes or no
+     */
+    function useRevenueStamp()
+    {
+		$sql  = "SELECT COUNT(*) as nb FROM ".MAIN_DB_PREFIX."c_revenuestamp as r, ".MAIN_DB_PREFIX."c_pays as p";
+		$sql .= " WHERE r.fk_pays = p.rowid AND p.code = '".$this->country_code."'";
+		$sql .= " AND r.active = 1";
 
-		dol_syslog("get_localtax sql=".$sql);
+		dol_syslog("useRevenueStamp sql=".$sql);
 		$resql=$this->db->query($sql);
 		if ($resql)
 		{
-   			return ($this->db->num_rows($resql) > 0);
-
+			$obj=$this->db->fetch_object($resql);
+   			return (($obj->nb > 0)?true:false);
 		}
 		else
-		    return false;
-
+		{
+			$this->error=$this->db->lasterror();
+			return false;
+		}
 	}
 
 	/**
@@ -2752,7 +2767,7 @@ class Societe extends CommonObject
 	/**
 	 *  Set commnunication level
 	 *
-	 *  @param  User	$user		Utilisateur qui definie la remise
+	 *  @param  User	$user		User making change
 	 *	@return	int					<0 if KO, >0 if OK
 	 */
 	function set_commnucation_level($user)
diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php
index feb1b6164e0..37ff6735df5 100644
--- a/htdocs/user/class/user.class.php
+++ b/htdocs/user/class/user.class.php
@@ -912,6 +912,11 @@ class User extends CommonObject
 		$this->office_phone	= $contact->phone_pro;
 		$this->office_fax	= $contact->fax;
 		$this->user_mobile	= $contact->phone_mobile;
+		$this->address      = $contact->address;
+		$this->zip          = $contact->zip;
+		$this->town         = $contact->town;
+		$this->state_id     = $contact->state_id;
+		$this->country_id   = $contact->country_id;
 
 		if (empty($login)) $login=strtolower(substr($contact->firstname, 0, 4)) . strtolower(substr($contact->lastname, 0, 4));
 		$this->login = $login;
@@ -974,11 +979,16 @@ class User extends CommonObject
 
 		// Positionne parametres
 		$this->admin = 0;
-		$this->lastname = $member->lastname;
-		$this->firstname = $member->firstname;
-		$this->email = $member->email;
-		$this->fk_member = $member->id;
-		$this->pass = $member->pass;
+		$this->lastname     = $member->lastname;
+		$this->firstname    = $member->firstname;
+		$this->email        = $member->email;
+		$this->fk_member    = $member->id;
+		$this->pass         = $member->pass;
+		$this->address      = $member->address;
+		$this->zip          = $member->zip;
+		$this->town         = $member->town;
+		$this->state_id     = $member->state_id;
+		$this->country_id   = $member->country_id;
 
 		if (empty($login)) $login=strtolower(substr($member->firstname, 0, 4)) . strtolower(substr($member->lastname, 0, 4));
 		$this->login = $login;
@@ -1120,6 +1130,11 @@ class User extends CommonObject
 		$sql.= ", firstname = '".$this->db->escape($this->firstname)."'";
 		$sql.= ", login = '".$this->db->escape($this->login)."'";
 		$sql.= ", admin = ".$this->admin;
+		$sql.= ", address = '".$this->db->escape($this->address)."'";
+		$sql.= ", zip = '".$this->db->escape($this->zip)."'";
+		$sql.= ", town = '".$this->db->escape($this->town)."'";
+		$sql.= ", fk_state = '".$this->db->escape($this->state_id)."'";
+		$sql.= ", fk_country = '".$this->db->escape($this->country_id)."'";
 		$sql.= ", office_phone = '".$this->db->escape($this->office_phone)."'";
 		$sql.= ", office_fax = '".$this->db->escape($this->office_fax)."'";
 		$sql.= ", user_mobile = '".$this->db->escape($this->user_mobile)."'";