Le vendredi 19 août 2005 à 19:02 -0400, Christophe a écrit :
> J'attends de vos nouvelles pour savoir dans quel sens je poursuis.

J'ai malgré tout poursuivi, en espérant vivement que ma proposition soit
acceptée.

Je vous propose le patch joint, qui met en place l'utilisation de cette
tva négative, et qui corrige quelque bugs que je crois avoir trouvé ici
et là.

J'espère avoir traité tous les cas, factures client et fournisseur,
factures récurrentes, commandes, propal...

Par contre, avec la limite à 40Ko des mails sur la liste, je crains fort
qu'il ne doive passer par la validation du modérateur, comme le
précédent. Au cas où, je me permet de mettre Laurent en copie de ce
mail.

Pour la tva négative, personnellement, ça ne me gêne pas qu'elle
s'affiche de la sorte, mais si cela doit poser un problème, c'est
évidemment seulement la valeur d'affichage du select_tva() qui serait à
modifier, en laissant le value="" en négatif.

De même, je n'ai pas trop vu l'intérêt de la table facture_tva_sum, qui
ne semble utilisée que pour la fonction getSumTva(), elle même utilisée
uniquement dans le modèle de facture pdf_bernique.modules.php.
Il y avait pourtant des moyens beaucoup plus simples de récupérer les
différentes lignes de tva, comme je l'ai fait dans mes factures et
propals, sans passer par la gestion d'une table supplémentaire, et d'une
fonction spécifique.
A moins que cette table doive trouver son utilité dans la suite des
développement.
Mais du coup, je n'ai pas su si je devais y enregistrer mon -8.5% et
8.5% en une même ligne ou pas.
D'où le commentaire dans price.lib.php :
// s'il faut rassembler les tva facturables ou non, du même taux
// dans un même ligne du tableau, remplacer la ligne suivante par :
//                      $result[5][abs($prod_txtva)] += $line_tva;
                        $result[5][$prod_txtva] += $line_tva;

Autre petit commentaire à destination de Laurent, je n'ai pas bien
compris pourquoi avoir passé le champ "recuperableonly" en integer au
lieu du enum que j'avais mis, dans la table c_tva. Mais bon, c'est un
détail et c'est juste pour info.
A ce sujet, j'ai bien aimé l'idée du oui/non sur ce champ, dans le
dictionnaire. Mais pourquoi ne pas avoir mis un alias genre :
recuperableonly as yesno
de façon à pouvoir utiliser cette traduction pour d'autres
dictionnaires, comme ça semble être le principe pour d'autres champs ?

Merci de votre attention.

-- 
Christophe
diff -ru --exclude-from=excl_dolibarr --unidirectional-new-file dolibarrcvs/htdocs/comm/addpropal.php dolibarr/htdocs/comm/addpropal.php
--- dolibarrcvs/htdocs/comm/addpropal.php	2005-08-13 23:18:21.000000000 -0400
+++ dolibarr/htdocs/comm/addpropal.php	2005-08-18 19:21:20.000000000 -0400
@@ -216,7 +216,7 @@
       for ($i = 1 ; $i <= PROPALE_NEW_FORM_NB_PRODUCT ; $i++)
         {
           print '<tr><td>';
-          $html->select_produits("idprod".$id);
+          $html->select_produits('',"idprod".$i);
           print '</td>';
           print '<td><input type="text" size="2" name="qty'.$i.'" value="1"></td>';
           print '<td><input type="text" size="3" name="remise'.$i.'" value="'.$soc->remise_client.'"> %</td></tr>';
diff -ru --exclude-from=excl_dolibarr --unidirectional-new-file dolibarrcvs/htdocs/commande/fiche.php dolibarr/htdocs/commande/fiche.php
--- dolibarrcvs/htdocs/commande/fiche.php	2005-08-13 23:18:22.000000000 -0400
+++ dolibarr/htdocs/commande/fiche.php	2005-08-19 02:12:13.000000000 -0400
@@ -314,7 +314,7 @@
 	      for ($i = 1 ; $i <= $NBLINES ; $i++)
 		{
 		  print '<tr><td>';
-          print $html->select_produits('','idprod');
+          print $html->select_produits('','idprod'.$i);
 		  print '</td>';
 		  print '<td><input type="text" size="3" name="qty'.$i.'" value="1"></td>';
 		  print '<td><input type="text" size="3" name="remise_percent'.$i.'" value="0">%</td></tr>';
diff -ru --exclude-from=excl_dolibarr --unidirectional-new-file dolibarrcvs/htdocs/compta/facture.php dolibarr/htdocs/compta/facture.php
--- dolibarrcvs/htdocs/compta/facture.php	2005-08-13 23:18:22.000000000 -0400
+++ dolibarr/htdocs/compta/facture.php	2005-08-20 02:28:33.000000000 -0400
@@ -742,6 +742,10 @@
                         $i++;
                     }
                 }
+                else
+                {
+                    dolibarr_print_error($db);
+                }
                 // Lignes de propal non produits prédéfinis
                 $sql = "SELECT pt.rowid, pt.description as product, pt.tva_tx, pt.price, pt.qty, pt.remise_percent";
                 $sql .= " FROM ".MAIN_DB_PREFIX."propaldet as pt ";
@@ -784,7 +788,7 @@
                 print '<tr class="liste_titre"><td>'.$langs->trans("Ref").'</td><td>'.$langs->trans("Product").'</td>';
                 print '<td align="right">'.$langs->trans("Price").'</td><td align="center">'.$langs->trans("Discount").'</td><td align="center">'.$langs->trans("Qty").'</td></tr>';
 
-                $sql = "SELECT pt.rowid, p.label as product, p.ref, pt.subprice, pt.qty, p.rowid as prodid, pt.remise_percent";
+                $sql = "SELECT pt.rowid, p.label as product, p.ref, pt.subprice, pt.qty, p.rowid as prodid, pt.remise_percent, pt.description";
                 $sql .= " FROM ".MAIN_DB_PREFIX."commandedet as pt, ".MAIN_DB_PREFIX."product as p";
                 $sql .= " WHERE pt.fk_product = p.rowid AND pt.fk_commande = ".$commande->id;
                 $sql .= " ORDER BY pt.rowid ASC";
@@ -799,8 +803,12 @@
                     {
                         $objp = $db->fetch_object();
                         $var=!$var;
-                        print "<tr $bc[$var]><td>[$objp->ref]</td>\n";
-                        print '<td>'.$objp->product.'</td>';
+                        print '<tr '.$bc[$var].'><td><a href="'.DOL_URL_ROOT.'/product/fiche.php?id='.$objp->prodid.'">'.img_object($langs->trans(""),"product")." ".$objp->ref."</a>";
+                        print $objp->product?' - '.$objp->product:'';
+                        print "</td>\n";
+                        print '<td>';
+                        print $objp->description;
+                        print '</td>';
                         print '<td align="right">'.price($objp->subprice).'</td>';
                         print '<td align="center">'.$objp->remise_percent.'%</td>';
                         print '<td align="center">'.$objp->qty.'</td></tr>';
@@ -811,6 +819,35 @@
                 {
                     dolibarr_print_error($db);
                 }
+                // Lignes de commande non produits prédéfinis
+                $sql  = "SELECT pt.rowid, pt.description as product, pt.subprice, pt.qty, pt.remise_percent";
+                $sql .= " FROM ".MAIN_DB_PREFIX."commandedet as pt";
+                $sql .= " WHERE  pt.fk_commande = ".$commande->id;
+                $sql .= " AND pt.fk_product = 0";
+                $sql .= " ORDER BY pt.rowid ASC";
+
+                $result=$db->query($sql);
+                if ($result)
+                {
+                    $num = $db->num_rows($result);
+                    $i = 0;
+                    while ($i < $num)
+                    {
+                        $objp = $db->fetch_object($result);
+                        $var=!$var;
+                        print "<tr $bc[$var]><td>&nbsp;</td>\n";
+                        print '<td>'.$objp->product.'</td>';
+                        print '<td align="right">'.price($objp->subprice).'</td>';
+                        print '<td align="center">'.$objp->remise_percent.'%</td>';
+                        print '<td align="center">'.$objp->qty.'</td>';
+                        print '</tr>';
+                        $i++;
+                    }
+                }
+                else
+                {
+                    dolibarr_print_error($db);
+                }
 
                 print '</table>';
             }
diff -ru --exclude-from=excl_dolibarr --unidirectional-new-file dolibarrcvs/htdocs/facture.class.php dolibarr/htdocs/facture.class.php
--- dolibarrcvs/htdocs/facture.class.php	2005-08-16 12:52:06.000000000 -0400
+++ dolibarr/htdocs/facture.class.php	2005-08-20 00:54:32.000000000 -0400
@@ -141,8 +141,9 @@
         if (! $this->projetid) $this->projetid = "NULL";
 
         $totalht = ($amount - $remise);
-        $tva = tva($totalht);
-        $total = $totalht + $tva;
+// NE ME SEMBLE PLUS JUSTIFIE ICI
+//         $tva = tva($totalht);
+//         $total = $totalht + $tva;
 
         $sql = "INSERT INTO ".MAIN_DB_PREFIX."facture (facnumber, fk_soc, datec, amount, remise, remise_percent";
         $sql .= ", datef, note, fk_user_author,fk_projet";
diff -ru --exclude-from=excl_dolibarr --unidirectional-new-file dolibarrcvs/htdocs/fourn/commande/fiche.php dolibarr/htdocs/fourn/commande/fiche.php
--- dolibarrcvs/htdocs/fourn/commande/fiche.php	2005-08-11 22:25:50.000000000 -0400
+++ dolibarr/htdocs/fourn/commande/fiche.php	2005-08-20 01:56:05.000000000 -0400
@@ -456,7 +456,7 @@
 	  $resql = $db->query($sql);
 	  if ($resql)
 	    {
-	      $opt = "<option value=\"0\" SELECTED></option>";
+	      $opt = '<option value="0" selected="true"></option>';
 	      if ($resql)
 		{
 		  $num = $db->num_rows($resql);
diff -ru --exclude-from=excl_dolibarr --unidirectional-new-file dolibarrcvs/htdocs/fourn/facture/fiche.php dolibarr/htdocs/fourn/facture/fiche.php
--- dolibarrcvs/htdocs/fourn/facture/fiche.php	2005-08-14 00:16:02.000000000 -0400
+++ dolibarr/htdocs/fourn/facture/fiche.php	2005-08-20 01:45:30.000000000 -0400
@@ -115,10 +115,11 @@
 			      $_POST["reday"],
 			      $_POST["reyear"]);
 
-        $tva = 0;
-        $tva = ($_POST["tva_taux"] * $_POST["amount"]) / 100 ;
+        $tva = (abs($_POST["tva_taux"]) * $_POST["amount"]) / 100 ;
         $remise = 0;
-        $total = $tva + $_POST["amount"] ;
+        $total = $_POST["amount"] ;
+        if ( (float)$_POST["tva_taux"] >= 0 )
+            $total += $tva;
 
         $db->begin();
 
@@ -153,7 +154,11 @@
                 }
                 else if (strlen($_POST[$label]) > 0 && empty($_POST[$amount]))
                 {
-                    $ht = $_POST[$amountttc] / (1 + ($_POST[$tauxtva] / 100));
+                    $ht = $_POST[$amountttc];
+                    if ( (float)$_POST[$tauxtva] >= 0 )
+                    {
+                        $ht /= (1 + ($_POST[$tauxtva] / 100));
+                    }
                     $atleastoneline=1;
                     $ret=$facfou->addline($_POST[$label], $ht, $_POST[$tauxtva], $_POST[$qty], 1);
                     if ($ret < 0) $nberror++;
@@ -203,7 +208,9 @@
     $facfou->addline($_POST["label"], $_POST["amount"], $_POST["tauxtva"], $_POST["qty"]);
   else
   {
-    $ht = $_POST['amountttc'] / (1 + ($_POST['tauxtva'] / 100));
+    $ht = $_POST['amountttc'];
+    if ( (float)$_POST['tauxtva'] >= 0 )
+        $ht /= (1 + ($_POST['tauxtva'] / 100));
     $facfou->addline($_POST["label"], $ht, $_POST["tauxtva"], $_POST["qty"]);
   }
   $_GET["action"] = "edit";
@@ -420,7 +427,7 @@
             {
                 print "<tr $bc[1]>".'<td>'.$fac->lignes[$i][0]."</td>";
                 print '<td align="center">'.price($fac->lignes[$i][1])."</td>";
-                print '<td align="center">'.price($fac->lignes[$i][1] * (1+($fac->lignes[$i][2]/100)))."</td>";
+                print '<td align="center">'.price($fac->lignes[$i][1] * (1+(($fac->lignes[$i][2] >=0 ? $fac->lignes[$i][2] : 0 )/100)))."</td>";
                 print '<td align="center">'.$fac->lignes[$i][3]."</td>";
                 print '<td align="center">'.price($fac->lignes[$i][4])."</td>";
                 print '<td align="center">'.$fac->lignes[$i][2]."</td>";
diff -ru --exclude-from=excl_dolibarr --unidirectional-new-file dolibarrcvs/htdocs/fourn/fiche.php dolibarr/htdocs/fourn/fiche.php
--- dolibarrcvs/htdocs/fourn/fiche.php	2005-08-15 20:14:00.000000000 -0400
+++ dolibarr/htdocs/fourn/fiche.php	2005-08-17 19:51:44.000000000 -0400
@@ -32,6 +32,7 @@
 require("./pre.inc.php");
 
 $langs->load("suppliers");
+$langs->load("products");
 $langs->load("bills");
 $langs->load("orders");
 $langs->load("companies");
diff -ru --exclude-from=excl_dolibarr --unidirectional-new-file dolibarrcvs/htdocs/fourn/fournisseur.facture.class.php dolibarr/htdocs/fourn/fournisseur.facture.class.php
--- dolibarrcvs/htdocs/fourn/fournisseur.facture.class.php	2005-08-11 22:25:50.000000000 -0400
+++ dolibarr/htdocs/fourn/fournisseur.facture.class.php	2005-08-20 01:37:29.000000000 -0400
@@ -99,8 +99,9 @@
         
         if (! $remise) $remise = 0 ;
         $totalht = ($amount - $remise);
-        $tva = tva($totalht);
-        $total = $totalht + $tva;
+// NE ME SEMBLE PLUS JUSTIFIE ICI
+//        $tva = tva($totalht);
+//        $total = $totalht + $tva;
     
         $sql = "INSERT INTO ".MAIN_DB_PREFIX."facture_fourn (facnumber, libelle, fk_soc, datec, datef, note, fk_user_author, date_lim_reglement) ";
         $sql .= " VALUES ('".$number."','".addslashes($this->libelle)."',";
@@ -342,8 +343,12 @@
     if (is_numeric($puht) && is_numeric($qty))
     {
         $totalht  = ($puht * $qty);
-        $tva      = ($totalht * $tauxtva /  100);
-        $totalttc = $totalht + $tva;
+        $tva      = ($totalht * abs($tauxtva) /  100);
+        $totalttc = $totalht;
+        if ( (float)$tauxtva >= 0 )
+        {
+            $totalttc += $tva;
+        }
     
         $sql = "UPDATE ".MAIN_DB_PREFIX."facture_fourn_det ";
         $sql .= "SET description ='".addslashes($label)."'";
@@ -416,13 +421,13 @@
                 $total_ttc = $row[2];
     
                 if ($total_ht == '')
-                $total_ht = 0;
+                    $total_ht = 0;
     
                 if ($total_tva == '')
-                $total_tva = 0;
+                    $total_tva = 0;
     
                 if ($total_ttc == '')
-                $total_ttc = 0;
+                    $total_ttc = 0;
     
             }
     
diff -ru --exclude-from=excl_dolibarr --unidirectional-new-file dolibarrcvs/htdocs/html.form.class.php dolibarr/htdocs/html.form.class.php
--- dolibarrcvs/htdocs/html.form.class.php	2005-08-19 23:58:17.000000000 -0400
+++ dolibarr/htdocs/html.form.class.php	2005-08-20 00:46:33.000000000 -0400
@@ -104,7 +104,7 @@
     
                     if ($selected > 0 && $selected == $obj->rowid)
                     {
-                        print '<option value="'.$obj->rowid.'" selected>';
+                        print '<option value="'.$obj->rowid.'" selected="true">';
                     }
                     else
                     {
@@ -164,7 +164,7 @@
 		  
 		  if ($selected > 0 && $selected == $obj->code)
 		    {
-		      print '<option value="'.$obj->code.'" selected>'.$obj->libelle.'</option>';
+		      print '<option value="'.$obj->code.'" selected="true">'.$obj->libelle.'</option>';
 		    }
 		  else
 		    {
@@ -211,7 +211,7 @@
                 if ($selected > 0 && $selected == $obj->rowid)
 		  {
                     $foundselected=true;
-                    print '<option value="'.$obj->rowid.'" selected>';
+                    print '<option value="'.$obj->rowid.'" selected="true">';
 		  }
                 else
 		  {
@@ -255,7 +255,7 @@
 	  {
 	    if ($selected == $langs_available[$i])
 	      {
-		print '<option value="'.$langs_available[$i].'" selected>'.$langs_available[$i].'</option>';
+		print '<option value="'.$langs_available[$i].'" selected="true">'.$langs_available[$i].'</option>';
 	      }
 	    else
 	      {
@@ -290,7 +290,7 @@
 	  {
 	    if ($selected == $type_available[$i])
 	      {
-		print '<option value="'.$type_available[$i].'" selected>'.$langs->trans("BankType".$type_available[$i]).'</option>';
+		print '<option value="'.$type_available[$i].'" selected="true">'.$langs->trans("BankType".$type_available[$i]).'</option>';
 	      }
 	    else
 	      {
@@ -330,7 +330,7 @@
                     $obj = $this->db->fetch_object($resql);
                     if ($selected > 0 && $selected == $obj->idp)
                     {
-                        print '<option value="'.$obj->idp.'" selected>'.$obj->nom.'</option>';
+                        print '<option value="'.$obj->idp.'" selected="true">'.$obj->nom.'</option>';
                     }
                     else
                     {
@@ -374,7 +374,7 @@
 
 		if ($selected && $selected == $obj->idp)
 		  {
-		    print '<option value="'.$obj->idp.'" selected>'.$obj->name.' '.$obj->firstname.'</option>';
+		    print '<option value="'.$obj->idp.'" selected="true">'.$obj->name.' '.$obj->firstname.'</option>';
 		  }
 		else
 		  {
@@ -420,7 +420,7 @@
 					$obj = $this->db->fetch_object();
 					if (!empty($selected) && $selected == $obj->rowid)
 					{
-						print '<option value="'.$obj->rowid.'" selected>'.$obj->title.'</option>';
+						print '<option value="'.$obj->rowid.'" selected="true">'.$obj->title.'</option>';
 					}
 					else
 					{
@@ -459,7 +459,7 @@
     if ($result)
     {
     	print '<select class="flat" name="'.$htmlname.'">';
-        print "<option value=\"0\" selected>&nbsp;</option>";
+        print "<option value=\"0\" selected=\"true\">&nbsp;</option>";
 
         $num = $this->db->num_rows($result);
         $i = 0;
@@ -509,7 +509,7 @@
                 $obj = $this->db->fetch_object($result);
                 if ($selected == $obj->code)
                 {
-                    print '<option value="'.$obj->id.'" selected>';
+                    print '<option value="'.$obj->id.'" selected="true">';
                 }
                 else
                 {
@@ -555,7 +555,7 @@
                 $obj = $this->db->fetch_object($result);
                 if ($selected == $obj->rowid)
                 {
-                    print '<option value="'.$obj->rowid.'" selected>';
+                    print '<option value="'.$obj->rowid.'" selected="true">';
                 }
                 else
                 {
@@ -599,7 +599,7 @@
                 $obj = $this->db->fetch_object();
                 if ($selected == $obj->code)
 		  {
-                    print '<option value="'.$obj->code.'" selected>';
+                    print '<option value="'.$obj->code.'" selected="true">';
 		  }
                 else
 		  {
@@ -667,7 +667,7 @@
     
                     if ($selected > 0 && $selected == $obj->code)
                     {
-                        print '<option value="'.$obj->code.'" selected>';
+                        print '<option value="'.$obj->code.'" selected="true">';
                     }
                     else
                     {
@@ -853,7 +853,7 @@
                     if ($selected && $selected == $obj->code_iso)
                     {
                         $foundselected=true;
-                        print '<option value="'.$obj->code_iso.'" selected>';
+                        print '<option value="'.$obj->code_iso.'" selected="true">';
                     }
                     else
                     {
@@ -903,18 +903,14 @@
             for ($i = 0; $i < $num; $i++)
             {
                 $obj = $this->db->fetch_object();
-                $txtva[ $i ] = $obj->taux;
-                $libtva[ $i ] = $obj->taux.'%'.($obj->recuperableonly ? ' *':'');
+                $txtva[ $i ] = $obj->taux * ($obj->recuperableonly ? -1: 1);
             }
         }
         else
         {
             $txtva[0] = '19.6';
-            $libtva[0] = '';
             $txtva[1] = '5.5';
-            $libtva[1] = '';
             $txtva[2] = '0';
-            $libtva[2] = '';
         }
 
         if ($defaulttx == '')
@@ -932,12 +928,9 @@
             print '<option value="'.$txtva[$i].'"';
             if ($txtva[$i] == $defaulttx)
             {
-                print ' selected>'.$libtva[$i].'</option>';
-            }
-            else
-            {
-                print '>'.$libtva[$i].'</option>';
+                print ' selected="true"';
             }
+            print '>'.$txtva[$i].'%</option>';
         }
         print '</select>';
     }
@@ -1002,41 +995,43 @@
     	$shour = 0;
     	$smin = 0;
 
-    	print '<option value="0" selected>';
+    	print '<option value="0" selected="true"></option>';
       }
     
     for ($day = 1 ; $day <= 31; $day++) 
-      {
-	if ($day == $sday)
-	  {
-	    print "<option value=\"$day\" selected>$day";
-	  }
-	else 
-	  {
-	    print "<option value=\"$day\">$day";
-	  }
-      }
+    {
+        if ($day == $sday)
+        {
+            print "<option value=\"$day\" selected=\"true\">$day";
+        }
+        else 
+        {
+            print "<option value=\"$day\">$day";
+        }
+        print "</option>";
+    }
     
     print "</select>";
     
     print '<select class="flat" name="'.$prefix.'month">';    
     if ($empty || $set_time == -1)
       {
-	print '<option value="0" selected>';
+	print '<option value="0" selected="true"></option>';
       }
 
     // Mois
     for ($month = 1 ; $month <= 12 ; $month++)
-      {
-	if ($month == $smonth)
-	  {
-	    print "<option value=\"$month\" selected>" . $strmonth[$month];
-	  }
-	else
-	  {
-	    print "<option value=\"$month\">" . $strmonth[$month];
-	  }
-      }
+    {
+        if ($month == $smonth)
+        {
+            print "<option value=\"$month\" selected=\"true\">" . $strmonth[$month];
+        }
+        else
+        {
+            print "<option value=\"$month\">" . $strmonth[$month];
+        }
+        print "</option>";
+    }
     print "</select>";
 
 	// Année
@@ -1049,37 +1044,39 @@
 	print '<select class="flat" name="'.$prefix.'year">';
 	
 	for ($year = $syear - 3; $year < $syear + 5 ; $year++)
-	  {
-	    if ($year == $syear)
-	      {
-		print "<option value=\"$year\" selected>$year";
-	      }
-	    else
-	      {
-		print "<option value=\"$year\">$year";
-	      }
-	  }
-	print "</select>\n";
+    {
+        if ($year == $syear)
+        {
+            print "<option value=\"$year\" selected=\"true\">$year";
+        }
+        else
+        {
+            print "<option value=\"$year\">$year";
+        }
+        print "</option>";
+    }
+    print "</select>\n";
       }
 
     if ($h)
       {
 	print '<select class="flat" name="'.$prefix.'hour">';
     
-	for ($hour = 0; $hour < 24 ; $hour++)
-	  {
-	    if (strlen($hour) < 2)
-	      {
-		$hour = "0" . $hour;
-	      }
-	    if ($hour == $shour)
-	      {
-		print "<option value=\"$hour\" selected>$hour";
-	      }
-	    else
-	      {
-		print "<option value=\"$hour\">$hour";
-	      }
+    for ($hour = 0; $hour < 24 ; $hour++)
+    {
+        if (strlen($hour) < 2)
+        {
+            $hour = "0" . $hour;
+        }
+        if ($hour == $shour)
+        {
+            print "<option value=\"$hour\" selected=\"true\">$hour";
+        }
+        else
+        {
+            print "<option value=\"$hour\">$hour";
+        }
+        print "</option>";
 	  }
 	print "</select>H\n";
 
@@ -1087,22 +1084,23 @@
 	  {
 	    print '<select class="flat" name="'.$prefix.'min">';
 	    
-	    for ($min = 0; $min < 60 ; $min++)
-	      {
-		if (strlen($min) < 2)
-		  {
-		    $min = "0" . $min;
-		  }
-		if ($min == $smin)
-		  {
-		    print "<option value=\"$min\" selected>$min";
-		  }
-		else
-		  {
-		    print "<option value=\"$min\">$min";
-		  }
-	      }
-	    print "</select>M\n";
+        for ($min = 0; $min < 60 ; $min++)
+        {
+            if (strlen($min) < 2)
+            {
+                $min = "0" . $min;
+            }
+            if ($min == $smin)
+            {
+                print "<option value=\"$min\" selected=\"true\">$min";
+            }
+            else
+            {
+                print "<option value=\"$min\">$min";
+            }
+            print "</option>";
+         }
+         print "</select>M\n";
 	  }
 	
       }
@@ -1132,7 +1130,7 @@
 		print "<option value=\"$row[0]\" ";
 		if ($id == $row[0])
 		  {
-		    print "selected";
+		    print 'selected="true"';
 		  }
 		print ">$row[1]</option>\n";
 		$i++;
@@ -1187,7 +1185,7 @@
 	// Si il faut présélectionner une valeur
 	if ($id && $id == $key)
 	  {
-	    print "selected";
+	    print 'selected="true"';
 	  }
 
 	if ($key_libelle)
@@ -1236,13 +1234,13 @@
     print '<select class="flat" name="'.$name.'">'."\n";
     if (("$value" == 'yes') || ($value == 1))
     {
-        print '<option value="'.$yes.'" selected>'.$langs->trans("yes").'</option>'."\n";
+        print '<option value="'.$yes.'" selected="true">'.$langs->trans("yes").'</option>'."\n";
         print '<option value="'.$no.'">'.$langs->trans("no").'</option>'."\n";
     }
     else
     {
         print '<option value="'.$yes.'">'.$langs->trans("yes").'</option>'."\n";
-        print '<option value="'.$no.'" selected>'.$langs->trans("no").'</option>'."\n";
+        print '<option value="'.$no.'" selected="true">'.$langs->trans("no").'</option>'."\n";
     }
     print '</select>'."\n";
   }
diff -ru --exclude-from=excl_dolibarr --unidirectional-new-file dolibarrcvs/htdocs/includes/modules/facture/pdf_bernique.modules.php dolibarr/htdocs/includes/modules/facture/pdf_bernique.modules.php
--- dolibarrcvs/htdocs/includes/modules/facture/pdf_bernique.modules.php	2005-07-16 07:11:39.000000000 -0400
+++ dolibarr/htdocs/includes/modules/facture/pdf_bernique.modules.php	2005-08-20 01:08:39.000000000 -0400
@@ -247,7 +247,7 @@
     foreach ($tvas as $key => $value)
       {
 	$pdf->SetXY (10, $tab4_top + ( $i * $tab2_hl));
-	$pdf->MultiCell(25, $tab2_hl, "TVA à ". $key."%", 0, 'L', 0);
+	$pdf->MultiCell(25, $tab2_hl, "TVA à ". abs($key)."%".( (float)$key < 0 ? " (".$langs->trans("NonPercuRecuperable").")" : '') , 0, 'L', 0);
 	$pdf->SetXY (35, $tab4_top + ( $i * $tab2_hl));
 	$pdf->MultiCell(20, $tab2_hl, price($tvas[$key]), 0, 'R', 0);
 	$i++;
diff -ru --exclude-from=excl_dolibarr --unidirectional-new-file dolibarrcvs/htdocs/langs/fr_FR/bills.lang dolibarr/htdocs/langs/fr_FR/bills.lang
--- dolibarrcvs/htdocs/langs/fr_FR/bills.lang	2005-08-15 20:14:04.000000000 -0400
+++ dolibarr/htdocs/langs/fr_FR/bills.lang	2005-08-18 13:39:17.000000000 -0400
@@ -92,4 +92,6 @@
 ClassifyBill=Classer la facture
 NoSupplierBillsUnpayed=Aucune facture fournisseur impayée
 SupplierBillsToPay=Factures fournisseurs à payer
-CustomerBillsUnpayed=Factures clients impayées
\ Pas de fin de ligne à la fin du fichier.
+CustomerBillsUnpayed=Factures clients impayées
+DispenseMontantLettres=Les factures rédigées par procédés mécanographiques sont dispensées de l'arrêté en lettres
+NonPercuRecuperable=non perçu récupérable
diff -ru --exclude-from=excl_dolibarr --unidirectional-new-file dolibarrcvs/htdocs/lib/functions.inc.php dolibarr/htdocs/lib/functions.inc.php
--- dolibarrcvs/htdocs/lib/functions.inc.php	2005-08-16 12:52:28.000000000 -0400
+++ dolibarr/htdocs/lib/functions.inc.php	2005-08-20 00:51:47.000000000 -0400
@@ -1502,7 +1502,7 @@
 */
 function tva($euros, $taux=19.6)
 {
-  $taux = $taux / 100 ;
+  $taux = abs($taux) / 100 ;
 
   return sprintf("%01.2f",($euros * $taux));
 }
diff -ru --exclude-from=excl_dolibarr --unidirectional-new-file dolibarrcvs/htdocs/lib/price.lib.php dolibarr/htdocs/lib/price.lib.php
--- dolibarrcvs/htdocs/lib/price.lib.php	2004-10-19 18:47:16.000000000 -0400
+++ dolibarr/htdocs/lib/price.lib.php	2005-08-20 01:06:25.000000000 -0400
@@ -23,7 +23,7 @@
 /*!	\file htdocs/lib/price.lib.php
   \brief librairie contenant les fonctions pour calculer un prix.
   \author Rodolphe Quiedeville.
-		\version $Revision: 1.9 $
+  \version $Revision: 1.9 $
   
   Ensemble des fonctions permettant de calculer un prix.
 */
@@ -38,67 +38,77 @@
 
 function calcul_price($products, $remise_percent)
 {
-  $total_ht = 0;
-  $amount_ht = 0;
-  $tva = array();
-  $total_tva = 0;
-  $total_remise = 0;
-
-  $num = sizeof($products);
-  $i = 0;
-
-  while ($i < $num)	  
-    {
-      $prod_price = $products[$i][0];
-      $prod_qty   = $products[$i][1];
-      $prod_txtva = $products[$i][2];
-
-      $lprice = $prod_qty * $prod_price;
-
-      $amount_ht = $amount_ht + $lprice;
-
-      if ($remise_percent > 0)
+	$total_ht = 0;
+	$amount_ht = 0;
+	$total_tva = 0;
+	$total_ttc = 0;
+	$total_remise = 0;
+	$result[5] = array();
+	
+	if ( sizeof( $products ) )
 	{
-	  $lremise = ($lprice * $remise_percent / 100);
-	  $lprice = $lprice - $lremise;
-	  $total_remise = $total_remise + $lremise;
+		foreach ($products as $product)
+		{
+			$prod_price = $product[0];
+			$prod_qty   = $product[1];
+			$prod_txtva = $product[2];
+		
+			// montant total HT de la ligne
+			$line_price_ht = $prod_qty * $prod_price;
+		
+			// incrémentation montant HT hors remise de l'ensemble
+			$amount_ht += $line_price_ht;
+		
+			// si une remise est consentie sur l'ensemble
+			if ($remise_percent > 0)
+			{
+				// calcul de la remise sur la ligne
+				$line_remise = ($line_price_ht * $remise_percent / 100);
+				// soustraction de cette remise au montant HT de la ligne
+				$line_price_ht -= $line_remise;
+				// incrémentation du montant total de remise sur l'ensemble
+				$total_remise += $line_remise;
+			}
+			// incrémentation du montant HT remisé de l'ensemble
+			$total_ht += $line_price_ht;
+		
+			// calcul de la TVA sur la ligne
+			$line_tva = ($line_price_ht * (abs($prod_txtva) / 100));
+		
+			// incrémentation du montant TTC de la valeur HT, on traite la TVA ensuite
+			$total_ttc  += $line_price_ht; 
+			// traitement de la tva non perçue récupérable
+			if ( $prod_txtva >= 0 )
+			{
+				// ce n'est pas une TVA non perçue récupérable,
+				// donc on incrémente le total TTC de l'ensemble, de la valeur de TVA de la ligne
+				$total_ttc  += $line_tva; 
+			}
+			// dans tous les cas, on incrémente le total de TVA
+			$total_tva += $line_tva;
+			// on incrémente le tableau de différentiation des taux de TVA
+// s'il faut rassembler les tva facturables ou non, du même taux
+// dans un même ligne du tableau, remplacer la ligne suivante par :
+//			$result[5][abs($prod_txtva)] += $line_tva;
+			$result[5][$prod_txtva] += $line_tva;
+		
+			$i++;
+		}
 	}
-      
-      $total_ht = $total_ht + $lprice;
-
-      $ligne_tva = ($lprice * ($prod_txtva / 100));
-
-      $tva[$prod_txtva] = $tva[$prod_txtva] + $ligne_tva;
-      $i++;
-    }
-
-  /*
-   * Sommes et arrondis
-   */
-  $j=0;
-  $result[5] = array();
-
-  foreach ($tva as $key => $value)
-    {
-      $tva[$key] = round($tva[$key], 2);
-      $total_tva = $total_tva + $tva[$key];
-      $result[5][$key] = $tva[$key];
-      $j++;
-    }
-  
-  $total_ht  = round($total_ht, 2);
-  $total_tva = round($total_tva, 2);
-  
-  $total_ttc = $total_ht + $total_tva;
-  
-  /*
-   *
-   */
-  $result[0] = $total_ht;
-  $result[1] = $total_tva;
-  $result[2] = $total_ttc;
-  $result[3] = $total_remise;
-  $result[4] = $amount_ht;
-
-  return $result;
+	/*
+	* arrondis
+	*/
+	$total_ht  = round($total_ht, 2);
+	$total_tva = round($total_tva, 2);
+	
+	/*
+	*
+	*/
+	$result[0] = $total_ht;
+	$result[1] = $total_tva;
+	$result[2] = $total_ttc;
+	$result[3] = $total_remise;
+	$result[4] = $amount_ht;
+	
+	return $result;
 }
diff -ru --exclude-from=excl_dolibarr --unidirectional-new-file dolibarrcvs/htdocs/product/fiche.php dolibarr/htdocs/product/fiche.php
--- dolibarrcvs/htdocs/product/fiche.php	2005-08-19 23:58:25.000000000 -0400
+++ dolibarr/htdocs/product/fiche.php	2005-08-20 00:25:44.000000000 -0400
@@ -102,7 +102,8 @@
     {
       $product->ref                = $_POST["ref"];
       $product->libelle            = $_POST["libelle"];
-      $product->price              = $_POST["price"];
+      if ( isset( $_POST["price"] ) )
+      	$product->price              = $_POST["price"];
       $product->tva_tx             = $_POST["tva_tx"];
       $product->description        = $_POST["desc"];
       $product->envente            = $_POST["statut"];
diff -ru --exclude-from=excl_dolibarr --unidirectional-new-file dolibarrcvs/mysql/migration/1.1.0-2.0.0.sql dolibarr/mysql/migration/1.1.0-2.0.0.sql
--- dolibarrcvs/mysql/migration/1.1.0-2.0.0.sql	2005-08-19 23:58:29.000000000 -0400
+++ dolibarr/mysql/migration/1.1.0-2.0.0.sql	2005-08-20 00:29:32.000000000 -0400
@@ -1723,3 +1723,32 @@
 
 )type=innodb;
 
+create table llx_c_tva
+(
+  rowid             integer AUTO_INCREMENT PRIMARY KEY,
+  fk_pays           integer NOT NULL,
+  taux              double NOT NULL,
+  recuperableonly   integer DEFAULT 0,
+  note              varchar(128),
+  active            tinyint DEFAULT 1 NOT NULL
+
+)type=innodb;
+
+insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) 
+values (1,1,   '0','0','Taux TVA non applicable (France, TOM)',1);
+insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) 
+values (2,1, '5.5','0','Taux à 5.5 (France hors DOMTOM)',1);
+insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) 
+values (3,1, '8.5','0','Taux à 8.5 (DOM sauf Guyane et Saint-Martin)',0);
+insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) 
+values (4,1, '8.5','1','Taux à 8.5 (DOM sauf Guyane et Saint-Martin), 
+récupérable uniquement, non facturé',0);
+insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) 
+values (5,1,'19.6','0','Taux à 19.6 (France hors DOMTOM)',1);
+insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) 
+values (6,2,   '0','0','Taux TVA non applicable',1);
+insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) 
+values (7,2,   '6','0','Taux à 6',1);
+insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) 
+values (8,2,  '21','0','Taux à 21',1);
+
_______________________________________________
Dolibarr-dev mailing list
Dolibarr-dev@nongnu.org
http://lists.nongnu.org/mailman/listinfo/dolibarr-dev

Répondre à