diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index edd39ab4c8a..5b383ac5fd9 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -524,7 +524,8 @@ if ($_POST['action'] == "addligne" && $user->rights->propale->creer) $prod->fetch($_POST['idprod']); $tva_tx = get_default_tva($mysoc,$propal->client,$prod->tva_tx); - + $tva_npr = get_default_npr($mysoc,$propal->client,$prod->tva_tx); + // On defini prix unitaire if ($conf->global->PRODUIT_MULTIPRICES == 1) { @@ -560,10 +561,15 @@ if ($_POST['action'] == "addligne" && $user->rights->propale->creer) else { $pu_ht=$_POST['np_price']; - $tva_tx=$_POST['np_tva_tx']; + $tva_tx=eregi_replace('\*','',$_POST['np_tva_tx']); + $tva_npr=eregi('\*',$_POST['np_tva_tx'])?1:0; $desc=$_POST['dp_desc']; } + $info_bit=0; + if ($tva_npr) $info_bit |= 0x01; + + // Insert line $result=$propal->addline( $_POST['propalid'], $desc, @@ -573,7 +579,8 @@ if ($_POST['action'] == "addligne" && $user->rights->propale->creer) $_POST['idprod'], $_POST['remise_percent'], $price_base_type, - $pu_ttc + $pu_ttc, + $info_bit ); if ($result > 0) @@ -1212,7 +1219,7 @@ if ($_GET['propalid'] > 0) } // VAT Rate - print ''.vatrate($objp->tva_tx).'%'; + print ''.vatrate($objp->tva_tx,'%',$objp->info_bits).''; // U.P HT print ''.price($objp->subprice)."\n"; @@ -1346,14 +1353,7 @@ if ($_GET['propalid'] > 0) print ''.vatrate($objp->marge_tx).'%'; } print ''; - if($societe->tva_assuj == "0") - { - print '0'; - } - else - { - print $html->select_tva("tva_tx",$objp->tva_tx,$mysoc,$societe); - } + print $html->select_tva('tva_tx',$objp->tva_tx,$mysoc,$societe,'',$objp->info_bits); print ''; print ''; print ''; diff --git a/htdocs/commonobject.class.php b/htdocs/commonobject.class.php index 3d9413756d9..b62f0506e4d 100644 --- a/htdocs/commonobject.class.php +++ b/htdocs/commonobject.class.php @@ -26,14 +26,14 @@ /** \class CommonObject - \brief Classe mere pour héritage des classes metiers + \brief Classe mere pour h�ritage des classes metiers */ class CommonObject { /** - * \brief Ajoute un contact associé au l'entité définie dans $this->element + * \brief Ajoute un contact associ� au l'entit� d�finie dans $this->element * \param fk_socpeople Id du contact a ajouter * \param type_contact Type de contact (code ou id) * \param source external=Contact externe (llx_socpeople), internal=Contact interne (llx_user) @@ -45,7 +45,7 @@ class CommonObject dolibarr_syslog("CommonObject::add_contact $fk_socpeople, $type_contact, $source"); - // Vérification parametres + // V�rification parametres if ($fk_socpeople <= 0) { $this->error=$langs->trans("ErrorWrongValueForParameter","1"); @@ -114,7 +114,7 @@ class CommonObject /** * \brief Mise a jour du statut d'un contact - * \param rowid La reference du lien contact-entité + * \param rowid La reference du lien contact-entit� * \param statut Le nouveau statut * \param type_contact_id Description du type de contact * \return int <0 si erreur, =0 si ok @@ -158,8 +158,8 @@ class CommonObject } /** - * \brief Récupère les lignes de contact de l'objet - * \param statut Statut des lignes detail à récupérer + * \brief R�cup�re les lignes de contact de l'objet + * \param statut Statut des lignes detail � r�cup�rer * \param source Source du contact external (llx_socpeople) ou internal (llx_user) * \return array Tableau des rowid des contacts */ @@ -214,7 +214,7 @@ class CommonObject } /** - * \brief Le détail d'un contact + * \brief Le d�tail d'un contact * \param rowid L'identifiant du contact * \return object L'objet construit par DoliDb.fetch_object */ @@ -224,7 +224,7 @@ class CommonObject $sql.= " tc.code, tc.libelle,"; $sql.= " s.fk_soc"; $sql.= " FROM (".MAIN_DB_PREFIX."element_contact as ec, ".MAIN_DB_PREFIX."c_type_contact as tc)"; - $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople as s ON ec.fk_socpeople=s.rowid"; // Si contact de type external, alors il est lié à une societe + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople as s ON ec.fk_socpeople=s.rowid"; // Si contact de type external, alors il est li� � une societe $sql.= " WHERE ec.rowid =".$rowid; $sql.= " AND ec.fk_c_type_contact=tc.rowid"; $sql.= " AND tc.element = '".$this->element."'"; @@ -285,7 +285,7 @@ class CommonObject } /** - * \brief Retourne id des contacts d'une source et d'un type actif donné + * \brief Retourne id des contacts d'une source et d'un type actif donn� * Exemple: contact client de facturation ('external', 'BILLING') * Exemple: contact client de livraison ('external', 'SHIPPING') * Exemple: contact interne suivi paiement ('internal', 'SALESREPFOLL') @@ -391,10 +391,10 @@ class CommonObject } /** - * \brief Retourne la liste déroulante des sociétés + * \brief Retourne la liste d�roulante des soci�t�s * \param object Fetch du document * \param var_id Nom de la variable de l'id du document - * \param selected Societe présélectionnée + * \param selected Societe pr�s�lectionn�e * \param htmlname Nom champ formulaire */ function selectCompaniesForNewContact($object, $var_id, $selected = '', $htmlname = 'newcompany') @@ -543,7 +543,7 @@ class CommonObject /** - * \brief On récupère les id de liste_contact + * \brief On r�cup�re les id de liste_contact * \param source Source du contact external (llx_socpeople) ou internal (llx_user) * \return array */ @@ -629,7 +629,7 @@ class CommonObject /** - * \brief Stocke un numéro de rang pour toutes les lignes de + * \brief Stocke un num�ro de rang pour toutes les lignes de * detail d'une facture qui n'en ont pas. */ function line_order() @@ -856,7 +856,7 @@ class CommonObject $obj = $this->db->fetch_object($resql); $this->total_ht += $obj->total_ht; - $this->total_tva += ($obj->total_ttc - $obj->total_ht); + $this->total_tva += $obj->total_tva; $this->total_ttc += $obj->total_ttc; $i++; diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index f4f46b28628..3a77fedcffc 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -828,7 +828,7 @@ if (($_POST['action'] == 'addligne' || $_POST['action'] == 'addligne_predef') && $info_bit=0; if ($tva_npr) $info_bit |= 0x01; - // Insere ligne + // Insert line $result = $fac->addline( $_POST['facid'], $desc, @@ -2407,7 +2407,7 @@ else } print "\n"; } - print ''.vatrate($objp->tva_taux).'%'.($objp->info_bits & 1?' *':'').''; + print ''.vatrate($objp->tva_taux,'%',$objp->info_bits).''; print ''.price($objp->subprice)."\n"; print ''; if (($objp->info_bits & 2) != 2) diff --git a/htdocs/facture.class.php b/htdocs/facture.class.php index 97eaa4d2e9b..9b99eca5e58 100644 --- a/htdocs/facture.class.php +++ b/htdocs/facture.class.php @@ -1290,7 +1290,7 @@ class Facture extends CommonObject { $this->db->begin(); - // Nettoyage paramètres + // Clean parameters $remise_percent=price2num($remise_percent); $qty=price2num($qty); if (! $qty) $qty=1; @@ -1336,7 +1336,7 @@ class Facture extends CommonObject $product_type=$product->type; } - // Insertion ligne + // Insert line $ligne=new FactureLigne($this->db); $ligne->fk_facture=$facid; diff --git a/htdocs/lib/functions.inc.php b/htdocs/lib/functions.inc.php index f44abbcf531..8b58633f85b 100644 --- a/htdocs/lib/functions.inc.php +++ b/htdocs/lib/functions.inc.php @@ -1823,18 +1823,28 @@ function print_fleche_navigation($page,$file,$options='',$nextpage,$betweenarrow /** * \brief Fonction qui retourne un taux de tva formaté pour visualisation * \remarks Fonction utilisée dans les pdf et les pages html -* \param rate Taux a formater (19.6 19,6 19.6% 19,6%...) -* \return string Chaine avec montant formaté (19,6 ou 19,6%) +* \param rate Rate value to format (19.6 19,6 19.6% 19,6%,...) +* \param foundpercent Add a percent % sign in output +* \param info_bits Miscellanous information on vat +* \return string Chaine avec montant formaté (19,6 ou 19,6% ou 8.5% *) */ -function vatrate($rate) +function vatrate($rate,$foundpercent=false,$info_bits=0) { - $foundpercent=false; + // Test for compatibility if (eregi('%',$rate)) { $rate=eregi_replace('%','',$rate); $foundpercent=true; } - return price($rate,0,'',0,0).($foundpercent?'%':''); + if (eregi('\*',$rate)) + { + $rate=eregi_replace('\*','',$rate); + $info_bits |= 1; + } + + $ret=price($rate,0,'',0,0).($foundpercent?'%':''); + if ($info_bits & 1) $ret.=' *'; + return $ret; } diff --git a/htdocs/lib/price.lib.php b/htdocs/lib/price.lib.php index 99532d3d606..c4f8a64e4fd 100644 --- a/htdocs/lib/price.lib.php +++ b/htdocs/lib/price.lib.php @@ -28,8 +28,8 @@ /** \brief Permet de calculer les parts total HT, TVA et TTC d'une ligne de facture, propale, commande ou autre depuis: - quantité, prix unitaire, remise_percent_ligne, txtva, remise_percent_global - \param qty Quantité + quantity, unit price, remise_percent_ligne, txtva, remise_percent_global + \param qty Quantity \param pu Prix unitaire (HT ou TTC selon price_base_type) \param remise_percent_ligne Remise ligne \param txtva Taux tva @@ -52,15 +52,17 @@ function calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $remise_pe $tot_avec_remise_ligne = $tot_sans_remise * ( 1 - ($remise_percent_ligne / 100)); $tot_avec_remise = $tot_avec_remise_ligne * ( 1 - ($remise_percent_global / 100)); $result[0] = price2num($tot_avec_remise, 'MT'); - $result[2] = price2num($tot_avec_remise * ( 1 + ($txtva / 100)), 'MT'); - $result[1] = $result[2] - $result[0]; + $result[2] = price2num($tot_avec_remise * ( 1 + ( (($info_bits & 1)?0:$txtva) / 100)), 'MT'); // Selon TVA NPR ou non + $result2bis= price2num($tot_avec_remise * ( 1 + ( $txtva / 100)), 'MT'); // Si TVA consideree normale (non NPR) + $result[1] = $result2bis - $result[0]; $result[3] = price2num($pu, 'MU'); - $result[5] = price2num($pu * ( 1 + ($txtva / 100)), 'MU'); - $result[4] = $result[5] - $result[3]; + $result[5] = price2num($pu * ( 1 + ((($info_bits & 1)?0:$txtva) / 100)), 'MU'); // Selon TVA NPR ou non + $result5bis= price2num($pu * ( 1 + ($txtva / 100)), 'MU'); // Si TVA consideree normale (non NPR) + $result[4] = $result5bis - $result[3]; } else { - // On cacule à l'envers en partant du prix TTC + // On cacule a l'envers en partant du prix TTC // Utilise pour les produits a prix TTC reglemente (livres, ...) $tot_sans_remise = $pu * $qty; @@ -68,11 +70,13 @@ function calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $remise_pe $tot_avec_remise = $tot_avec_remise_ligne * ( 1 - ($remise_percent_global / 100)); $result[2] = price2num($tot_avec_remise, 'MT'); - $result[0] = price2num($tot_avec_remise / ( 1 + ($txtva / 100)), 'MT'); - $result[1] = $result[2] - $result[0]; + $result[0] = price2num($tot_avec_remise / ( 1 + ((($info_bits & 1)?0:$txtva) / 100)), 'MT'); // Selon TVA NPR ou non + $result0bis= price2num($tot_avec_remise / ( 1 + ($txtva / 100)), 'MT'); // Si TVA consideree normale (non NPR) + $result[1] = $result[2] - $result0bis; $result[5] = price2num($pu, 'MU'); - $result[3] = price2num($pu / ( 1 + ($txtva / 100)), 'MU'); - $result[4] = $result[5] - $result[3]; + $result[3] = price2num($pu / ( 1 + ((($info_bits & 1)?0:$txtva) / 100)), 'MU'); // Selon TVA NPR ou non + $result3bis= price2num($pu / ( 1 + ($txtva / 100)), 'MU'); // Si TVA consideree normale (non NPR) + $result[4] = $result[5] - $result3bis; } return $result; diff --git a/htdocs/propal.class.php b/htdocs/propal.class.php index 284e8dc8651..fed5636fdf7 100644 --- a/htdocs/propal.class.php +++ b/htdocs/propal.class.php @@ -253,49 +253,50 @@ class Propal extends CommonObject * \param remise_percent Pourcentage de remise de la ligne * \param price_base_type HT or TTC * \param pu_ttc Prix unitaire TTC + * \param info_bits Bits de type de lignes * \return int >0 si ok, <0 si ko * \see add_product - * \remarks Les parametres sont deja cens� etre juste et avec valeurs finales a l'appel + * \remarks Les parametres sont deja cense etre juste et avec valeurs finales a l'appel * de cette methode. Aussi, pour le taux tva, il doit deja avoir ete d�fini * par l'appelant par la methode get_default_tva(societe_vendeuse,societe_acheteuse,taux_produit) * et le desc doit deja avoir la bonne valeur (a l'appelant de gerer le multilangue) */ - function addline($propalid, $desc, $pu_ht, $qty, $txtva, $fk_product=0, $remise_percent=0, $price_base_type='HT', $pu_ttc=0) + function addline($propalid, $desc, $pu_ht, $qty, $txtva, $fk_product=0, $remise_percent=0, $price_base_type='HT', $pu_ttc=0, $info_bits=0) { global $conf; - dolibarr_syslog("Propal::Addline propalid=$propalid, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_except=$remise_percent, price_base_type=$price_base_type, pu_ttc=$pu_ttc"); + dolibarr_syslog("Propal::Addline propalid=$propalid, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_except=$remise_percent, price_base_type=$price_base_type, pu_ttc=$pu_ttc, info_bits=$info_bits"); include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php'); if ($this->statut == 0) - { - $this->db->begin(); - - // Nettoyage param�tres - $remise_percent=price2num($remise_percent); - $qty=price2num($qty); - if ($conf->global->PROPALE_USE_OPTION_LINE && !$qty) { - $qty=0; - } - else if (! $qty) - { - $qty=1; - } - $pu_ht=price2num($pu_ht); - $pu_ttc=price2num($pu_ttc); - $txtva=price2num($txtva); - - if ($price_base_type=='HT') - { - $pu=$pu_ht; - } - else - { - $pu=$pu_ttc; - } - - // Calcul du total TTC et de la TVA pour la ligne a partir de + $this->db->begin(); + + // Clean parameters + $remise_percent=price2num($remise_percent); + $qty=price2num($qty); + if ($conf->global->PROPALE_USE_OPTION_LINE && !$qty) + { + $qty=0; + } + else if (! $qty) + { + $qty=1; + } + $pu_ht=price2num($pu_ht); + $pu_ttc=price2num($pu_ttc); + $txtva=price2num($txtva); + + if ($price_base_type=='HT') + { + $pu=$pu_ht; + } + else + { + $pu=$pu_ttc; + } + + // Calcul du total TTC et de la TVA pour la ligne a partir de // 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. @@ -314,7 +315,7 @@ class Propal extends CommonObject $price = $pu - $remise; } - // Insertion ligne + // Insert line $ligne=new PropaleLigne($this->db); $ligne->fk_propal=$propalid; @@ -343,16 +344,15 @@ class Propal extends CommonObject { // Mise a jour informations denormalisees au niveau de la propale meme $result=$this->update_price(); - - if ($result > 0) - { + if ($result > 0) + { $this->db->commit(); return 1; } else - { - $this->error=$this->db->error(); - dolibarr_syslog("Error sql=$sql, error=".$this->error); + { + $this->error=$this->db->error(); + dolibarr_syslog("Error sql=$sql, error=".$this->error); $this->db->rollback(); return -1; } @@ -361,22 +361,23 @@ class Propal extends CommonObject { $this->error=$ligne->error; $this->db->rollback(); - return -2; - } - } - } + return -2; + } + } + } /** - * \brief Mise � jour d'une ligne de produit + * \brief Mise a jour d'une ligne de produit * \param rowid Id de la ligne * \param pu Prix unitaire (HT ou TTC selon price_base_type) - * \param qty Quantit� - * \param remise_percent Remise effectu�e sur le produit + * \param qty Quantity + * \param remise_percent Remise effectuee sur le produit * \param txtva Taux de TVA * \param desc Description * \param price_base_type HT ou TTC - * \return int 0 en cas de succ�s + * \param info_bits Miscellanous informations + * \return int 0 en cas de succes */ function updateline($rowid, $pu, $qty, $remise_percent=0, $txtva, $desc='', $price_base_type='HT', $info_bits=0) { @@ -431,6 +432,7 @@ class Propal extends CommonObject $sql.= " , total_ht=".price2num($total_ht); $sql.= " , total_tva=".price2num($total_tva); $sql.= " , total_ttc=".price2num($total_ttc); + $sql.= " , info_bits=".$info_bits; if ($conf->global->PROPALE_USE_OPTION_LINE && !$qty) { $sql.= " , special_code=3"; @@ -446,7 +448,7 @@ class Propal extends CommonObject { $this->update_price(); $this->db->commit(); - return 0; + return $result; } else {