diff --git a/htdocs/fourn/commande/fiche.php b/htdocs/fourn/commande/fiche.php index 5167236a8ea9e6388ac454cf6d9821c3c2953614..48ee8dac50b3fb1c75a2e4ebda7797a94af6d595 100644 --- a/htdocs/fourn/commande/fiche.php +++ b/htdocs/fourn/commande/fiche.php @@ -99,8 +99,9 @@ if ($_POST['action'] == 'addligne' && $user->rights->fournisseur->commande->cree } $soc = new Societe($db, $commande->socid); - $soc->fetch($commande->socid); - + $result=$soc->fetch($commande->socid); + //print $result; + // Ecrase $pu par celui du produit // Ecrase $desc par celui du produit // Ecrase $txtva par celui du produit @@ -116,17 +117,18 @@ if ($_POST['action'] == 'addligne' && $user->rights->fournisseur->commande->cree $desc = $prod->description; $desc.= $prod->description && $_POST['np_desc'] ? "\n" : ""; - $desc.= $_POST['np_desc']; - - $tva_tx = get_default_tva($soc,$mysoc,$prod->tva_tx); - } - else - { - $pu=$_POST['pu']; - $tva_tx=$_POST['tva_tx']; - $desc=$_POST['dp_desc']; - } + $desc.= $_POST['np_desc']; + $tva_tx = get_default_tva($soc,$mysoc,$prod->tva_tx,$prodfournprice->product_id); + } + else + { + $pu=$_POST['pu']; + $tva_tx=$_POST['tva_tx']; + $desc=$_POST['dp_desc']; + } + //print "xx".$tva_tx; exit; + $result=$commande->addline( $desc, $pu, diff --git a/htdocs/fourn/fournisseur.commande.class.php b/htdocs/fourn/fournisseur.commande.class.php index 26d99cf83e778d45a51df42d26c6a10e537fb880..36a8bd476484dfd191372a39dc8697aa176922e1 100644 --- a/htdocs/fourn/fournisseur.commande.class.php +++ b/htdocs/fourn/fournisseur.commande.class.php @@ -662,7 +662,7 @@ class CommandeFournisseur extends Commande */ function addline($desc, $pu, $qty, $txtva, $fk_product=0, $fk_prod_fourn_price=0, $fourn_ref='', $remise_percent=0, $price_base_type='HT') { - global $langs; + global $langs,$mysoc; // Clean parameters $qty = price2num($qty); @@ -670,7 +670,7 @@ class CommandeFournisseur extends Commande $desc = trim($desc); $remise_percent = price2num($remise_percent); - dolibarr_syslog("Fournisseur.Commande.class::addline $desc, $pu, $qty, $txtva, $fk_product, $remise_percent"); + dolibarr_syslog("Fournisseur.Commande::addline $desc, $pu, $qty, $txtva, $fk_product, $remise_percent"); if ($qty < 1 && ! $fk_product) { @@ -691,7 +691,6 @@ class CommandeFournisseur extends Commande if ($result > 0) { $label = $prod->libelle; - $txtva = $prod->tva_tx; $pu = $prod->fourn_pu; $ref = $prod->ref_fourn; } @@ -699,14 +698,14 @@ class CommandeFournisseur extends Commande { $this->error="Aucun tarif trouv� pour cette quantit�. Quantit� saisie insuffisante ?"; $this->db->rollback(); - dolibarr_syslog("Fournisseur.commande.class::addline result=".$result." - ".$this->error); + dolibarr_syslog("Fournisseur.commande::addline result=".$result." - ".$this->error); return -1; } if ($result < -1) { $this->error=$prod->error; $this->db->rollback(); - dolibarr_syslog("Fournisseur.commande.class::addline result=".$result." - ".$this->error); + dolibarr_syslog("Fournisseur.commande::addline result=".$result." - ".$this->error); return -1; } } @@ -736,7 +735,7 @@ class CommandeFournisseur extends Commande if ($fk_product) { $sql.= $fk_product.","; } else { $sql.= "null,"; } $sql.= price2num($price,'MU').", '$qty', $txtva, $remise_percent,'".price2num($subprice,'MU')."','".price2num($remise)."','".$ref."') ;"; - dolibarr_syslog('Fournisseur.commande.class::addline sql='.$sql); + dolibarr_syslog('Fournisseur.commande::addline sql='.$sql); $resql=$this->db->query($sql); //print $sql; if ($resql) @@ -756,10 +755,7 @@ class CommandeFournisseur extends Commande /** - * Dispatch un element de la commande dans un stock - * - * - * + * \brief Dispatch un element de la commande dans un stock */ function DispatchProducts($user, $products, $qtys, $entrepots) { diff --git a/htdocs/lib/functions.inc.php b/htdocs/lib/functions.inc.php index 393c5a535570cbae93bce49a02c9843e114d86c9..d4f9ef16964aa3ce30a374dd3205648fb662212f 100644 --- a/htdocs/lib/functions.inc.php +++ b/htdocs/lib/functions.inc.php @@ -1928,6 +1928,23 @@ function price2num($amount,$rounding='') } +/** +* \brief Return vat rate of a product in a particular selling country +*/ +function get_product_vat_for_country($idprod, $countrycode) +{ + global $db; + + $product=new Product($db); + $product->fetch($idprod); + + // \TODO Read rate according to countrycode + // For the moment only one rate supported + + return $product->tva_tx; +} + + /** \brief Fonction qui renvoie la tva d'une ligne (en fonction du vendeur, acheteur et taux du produit) \remarks Si vendeur non assujeti a TVA, TVA par d�faut=0. Fin de r�gle. @@ -1938,12 +1955,13 @@ function price2num($amount,$rounding='') Sinon TVA propos�e par d�faut=0. Fin de r�gle. \param societe_vendeuse Objet soci�t� vendeuse \param societe_acheteuse Objet soci�t� acheteuse - \param taux_produit Taux par defaut du produit vendu + \param taux_produit Taux par defaut du produit vendu (old way to get product vat rate) + \param idprod Id product (new way to get product vat rate) \return float Taux de tva a appliquer, -1 si ne peut etre d�termin� */ -function get_default_tva($societe_vendeuse, $societe_acheteuse, $taux_produit) +function get_default_tva($societe_vendeuse, $societe_acheteuse, $taux_produit, $idprod=0) { - dolibarr_syslog("get_default_tva vendeur_assujeti=".$societe_vendeuse->tva_assuj." pays_vendeur=".$societe_vendeuse->pays_id.", pays_acheteur=".$societe_acheteuse->pays_id.", taux_produit=".$taux_produit); + dolibarr_syslog("get_default_tva vendeur_assujeti=".$societe_vendeuse->tva_assuj." pays_vendeur=".$societe_vendeuse->pays_code.", seller in cee=".$societe_vendeuse->isInEEC().", pays_acheteur=".$societe_acheteuse->pays_code.", buyer in cee=".$societe_acheteuse->isInEEC().", taux_produit(deprecated)=".$taux_produit.", idprod=".$idprod); if (!is_object($societe_vendeuse)) return -1; if (!is_object($societe_acheteuse)) return -1; @@ -1957,8 +1975,9 @@ function get_default_tva($societe_vendeuse, $societe_acheteuse, $taux_produit) // Le test ci-dessus ne devrait pas etre necessaire. Me signaler l'exemple du cas juridique concercn� si le test suivant n'est pas suffisant. if ($societe_vendeuse->pays_id == $societe_acheteuse->pays_id) { + if ($idprod) return get_product_vat_for_country($idprod,$societe_vendeuse->pays_code); if (strlen($taux_produit) == 0) return -1; // Si taux produit = '', on ne peut d�terminer taux tva - return $taux_produit; + return $taux_produit; } // Si (vendeur et acheteur dans Communaut� europ�enne) et (bien vendu = moyen de transports neuf comme auto, bateau, avion) alors TVA par d�faut=0 (La TVA doit �tre pay� par l'acheteur au centre d'impots de son pays et non au vendeur). Fin de r�gle. @@ -1967,6 +1986,7 @@ function get_default_tva($societe_vendeuse, $societe_acheteuse, $taux_produit) // Si (vendeur et acheteur dans Communaut� europ�enne) et (acheteur = particulier ou entreprise sans num TVA intra) alors TVA par d�faut=TVA du produit vendu. Fin de r�gle. if (($societe_vendeuse->isInEEC() && $societe_acheteuse->isInEEC()) && ! $societe_acheteuse->tva_intra) { + if ($idprod) return get_product_vat_for_country($idprod,$societe_vendeuse->pays_code); if (strlen($taux_produit) == 0) return -1; // Si taux produit = '', on ne peut d�terminer taux tva return $taux_produit; } diff --git a/htdocs/societe.class.php b/htdocs/societe.class.php index 3c41b899f2196d3aa5689c6a5759ed692b530381..736988ec18e05f2cc572d4c3b735609b98019707 100644 --- a/htdocs/societe.class.php +++ b/htdocs/societe.class.php @@ -126,7 +126,7 @@ class Societe extends CommonObject } /** - * \brief Cr�e la societe en base + * \brief Cree la societe en base * \param user Objet utilisateur qui demande la cr�ation * \return int 0 si ok, < 0 si erreur */ @@ -160,12 +160,12 @@ class Societe extends CommonObject $ret = $this->update($this->id,$user,0,1,1); - // si un commercial cr�e un client il lui est affect� automatiquement + // si un commercial cree un client il lui est affecte automatiquement if (!$user->rights->societe->client->voir) { $this->add_commercial($user, $user->id); } - // Ajout du commercial affect� + // Ajout du commercial affecte else if ($this->commercial_id != '' && $this->commercial_id != -1) { $this->add_commercial($user, $this->commercial_id); @@ -1795,7 +1795,7 @@ class Societe extends CommonObject } } - /* + /** * \brief Charge les informations d'ordre info dans l'objet societe * \param id id de la societe a charger */ @@ -1840,19 +1840,50 @@ class Societe extends CommonObject } } - /* + /** * \brief Renvoi si pays appartient � CEE * \param boolean true = pays dans CEE, false= pays hors CEE */ function isInEEC() { - // \todo liste code pays � compl�ter - $country_code_in_EEC=array('BE','FR','LU','GB','IT'); - //print "dd".$this->pays_code; - return in_array($this->pays_code,$country_code_in_EEC); + // List of all country codes that are in europe for european vat rules + $country_code_in_EEC=array( + 'AT', // Austria + 'BE', // Belgium + 'BG', // Bulgaria + 'CY', // Cyprus + 'CZ', // Czech republic + 'DK', // Danemark + 'EE', // Estonia + 'FI', // Finland + 'FR', // France + 'DE', // Germany + 'GB', // Royaume-uni + 'GR', // Greece + 'NL', // Holland + 'HU', // Hungary + 'IE', // Ireland + 'IT', // Italy + 'LV', // Latvia + 'LT', // Lithuania + 'LU', // Luxembourg + 'MT', // Malta + 'NO', // Norway + 'PL', // Poland + 'PT', // Portugal + 'RO', // Romania + 'SK', // Slovakia + 'SI', // Slovenia + 'ES', // Spain + 'SE', // Sweden + 'CH', // Switzerland + ); + //print "dd".$this->pays_code; + return in_array($this->pays_code,$country_code_in_EEC); } - /* - * \brief Charge la liste des categories fournisseurs + + /** + * \brief Charge la liste des categories fournisseurs * \return 0 in success, <> 0 in error */ function LoadSupplierCateg() @@ -1876,6 +1907,7 @@ class Societe extends CommonObject return -1; } } + /* * \brief Charge la liste des categories fournisseurs * \return 0 in success, <> 0 in error