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> </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> </option>"; + print "<option value=\"0\" selected=\"true\"> </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