Ejemplo n.º 1
0
/**
 *		Calculate totals (net, vat, ...) of a line.
 *		Value for localtaxX_type are	'0' : local tax not applied
 *										'1' : local tax apply on products and services without vat (localtax is calculated on amount without tax)
 *										'2' : local tax apply on products and services including vat (localtax is calculated on amount + tax)
 *										'3' : local tax apply on products without vat (localtax is calculated on amount without tax)
 *										'4' : local tax apply on products including vat (localtax is calculated on amount + tax)
 *										'5' : local tax apply on services without vat (localtax is calculated on amount without tax)
 *										'6' : local tax apply on services including vat (localtax is calculated on amount + tax)
 *
 *		@param	int		$qty						Quantity
 * 		@param 	float	$pu                         Unit price (HT or TTC selon price_base_type)
 *		@param 	float	$remise_percent_ligne       Discount for line
 *		@param 	float	$txtva                      0=do not apply standard tax, Vat rate=apply
 *		@param  float	$uselocaltax1_rate          0=do not use this localtax, >0=apply and get value from localtaxes_array (or database if empty), -1=autodetect according to seller if we must apply, get value from localtaxes_array (or database if empty)
 *		@param  float	$uselocaltax2_rate          0=do not use this localtax, >0=apply and get value from localtaxes_array (or database if empty), -1=autodetect according to seller if we must apply, get value from localtaxes_array (or database if empty)
 *		@param 	float	$remise_percent_global		0
 *		@param	string	$price_base_type 			HT=Unit price parameter is HT, TTC=Unit price parameter is TTC
 *		@param	int		$info_bits					Miscellaneous informations on line
 *		@param	int		$type						0/1=Product/service
 *		@param  Societe	$seller						Thirdparty seller (we need $seller->country_id property). Provided only if seller is the supplier, otherwise $seller will be $mysoc.
 *		@param  array	$localtaxes_array			Array with localtaxes info array('0'=>type1,'1'=>rate1,'2'=>type2,'3'=>rate2) (loaded by getLocalTaxesFromRate(vatrate, 0, ...) function).
 *		@param  integer	$progress                   Situation invoices progress (value from 0 to 100, 100 by default)
 *		@return result[ 0=total_ht,
 *						 1=total_vat, (main vat only)
 *						 2=total_ttc, (total_ht + main vat + local taxes)
 *						 3=pu_ht,
 *						 4=pu_vat, (main vat only)
 *						 5=pu_ttc,
 *						 6=total_ht_without_discount,
 *						 7=total_vat_without_discount, (main vat only)
 *						 8=total_ttc_without_discount, (total_ht + main vat + local taxes)
 *						 9=total_tax1 for total_ht,
 *						10=total_tax2 for total_ht,
 *						11=pu_tax1 for pu_ht, !! should not be used
 *						12=pu_tax2 for pu_ht, !! should not be used
 *						13=!! should not be used
 *						14=total_tax1 for total_ht_without_discount,
 *						15=total_tax2 for total_ht_without_discount]
 */
function calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $uselocaltax1_rate, $uselocaltax2_rate, $remise_percent_global, $price_base_type, $info_bits, $type, $seller = '', $localtaxes_array = '', $progress = 100)
{
    global $conf, $mysoc, $db;
    $result = array();
    // Clean parameters
    if (empty($txtva)) {
        $txtva = 0;
    }
    if (empty($seller) || !is_object($seller)) {
        dol_syslog("calcul_price_total Warning: function is called with parameter seller that is missing", LOG_WARNING);
        if (!is_object($mysoc)) {
            $mysoc = new Societe($db);
            $mysoc->setMysoc($conf);
        }
        $seller = $mysoc;
        // If sell is done to a customer, $seller is not provided, we use $mysoc
        //var_dump($seller->country_id);exit;
    }
    if (empty($localtaxes_array) || !is_array($localtaxes_array)) {
        dol_syslog("calcul_price_total Warning: function is called with parameter localtaxes_array that is missing", LOG_WARNING);
    }
    // Too verbose. Enable for debug only
    //dol_syslog("Price.lib::calcul_price_total qty=".$qty." pu=".$pu." remiserpercent_ligne=".$remise_percent_ligne." txtva=".$txtva." uselocaltax1_rate=".$uselocaltax1_rate." uselocaltax2_rate=".$uselocaltax2_rate.' remise_percent_global='.$remise_percent_global.' price_base_type='.$ice_base_type.' type='.$type.' progress='.$progress);
    $countryid = $seller->country_id;
    if (is_numeric($uselocaltax1_rate)) {
        $uselocaltax1_rate = (double) $uselocaltax1_rate;
    }
    if (is_numeric($uselocaltax2_rate)) {
        $uselocaltax2_rate = (double) $uselocaltax2_rate;
    }
    if ($uselocaltax1_rate < 0) {
        $uselocaltax1_rate = $seller->localtax1_assuj;
    }
    if ($uselocaltax2_rate < 0) {
        $uselocaltax2_rate = $seller->localtax2_assuj;
    }
    dol_syslog('Price.lib::calcul_price_total qty=' . $qty . ' pu=' . $pu . ' remise_percent_ligne=' . $remise_percent_ligne . ' txtva=' . $txtva . ' uselocaltax1_rate=' . $uselocaltax1_rate . ' uselocaltax2_rate=' . $uselocaltax2_rate . ' remise_percent_global=' . $remise_percent_global . ' price_base_type=' . $price_base_type . ' type=' . $type . ' progress=' . $progress);
    // Now we search localtaxes information ourself (rates and types).
    $localtax1_type = 0;
    $localtax2_type = 0;
    if (is_array($localtaxes_array)) {
        $localtax1_type = $localtaxes_array[0];
        $localtax1_rate = $localtaxes_array[1];
        $localtax2_type = $localtaxes_array[2];
        $localtax2_rate = $localtaxes_array[3];
    } else {
        $sql = "SELECT taux, localtax1, localtax2, localtax1_type, localtax2_type";
        $sql .= " FROM " . MAIN_DB_PREFIX . "c_tva as cv";
        $sql .= " WHERE cv.taux = " . $txtva;
        $sql .= " AND cv.fk_pays = " . $countryid;
        dol_syslog("calcul_price_total search vat information using old deprecated method", LOG_WARNING);
        $resql = $db->query($sql);
        if ($resql) {
            $obj = $db->fetch_object($resql);
            if ($obj) {
                $localtax1_rate = $obj->localtax1;
                $localtax2_rate = $obj->localtax2;
                $localtax1_type = $obj->localtax1_type;
                $localtax2_type = $obj->localtax2_type;
                //var_dump($localtax1_rate.' '.$localtax2_rate.' '.$localtax1_type.' '.$localtax2_type);exit;
            }
        } else {
            dol_print_error($db);
        }
    }
    // initialize total (may be HT or TTC depending on price_base_type)
    $tot_sans_remise = $pu * $qty * $progress / 100;
    $tot_avec_remise_ligne = $tot_sans_remise * (1 - $remise_percent_ligne / 100);
    $tot_avec_remise = $tot_avec_remise_ligne * (1 - $remise_percent_global / 100);
    // initialize result array
    for ($i = 0; $i <= 15; $i++) {
        $result[$i] = 0;
    }
    // if there's some localtax including vat, we calculate localtaxes (we will add later)
    //If input unit price is 'HT', we need to have the totals with main VAT for a correct calculation
    if ($price_base_type != 'TTC') {
        $tot_sans_remise_wt = price2num($tot_sans_remise * (1 + $txtva / 100), 'MU');
        $tot_avec_remise_wt = price2num($tot_avec_remise * (1 + $txtva / 100), 'MU');
        $pu_wt = price2num($pu * (1 + $txtva / 100), 'MU');
    } else {
        $tot_sans_remise_wt = $tot_sans_remise;
        $tot_avec_remise_wt = $tot_avec_remise;
        $pu_wt = $pu;
    }
    //print 'rr'.$price_base_type.'-'.$txtva.'-'.$tot_sans_remise_wt."-".$pu_wt."-".$uselocaltax1_rate."-".$localtax1_rate."-".$localtax1_type."\n";
    $localtaxes = array(0, 0, 0);
    $apply_tax = false;
    switch ($localtax1_type) {
        case '2':
            // localtax on product or service
            $apply_tax = true;
            break;
        case '4':
            // localtax on product
            if ($type == 0) {
                $apply_tax = true;
            }
            break;
        case '6':
            // localtax on service
            if ($type == 1) {
                $apply_tax = true;
            }
            break;
    }
    if ($uselocaltax1_rate && $apply_tax) {
        $result[14] = price2num($tot_sans_remise_wt * (1 + $localtax1_rate / 100) - $tot_sans_remise_wt, 'MT');
        $localtaxes[0] += $result[14];
        $result[9] = price2num($tot_avec_remise_wt * (1 + $localtax1_rate / 100) - $tot_avec_remise_wt, 'MT');
        $localtaxes[1] += $result[9];
        $result[11] = price2num($pu_wt * (1 + $localtax1_rate / 100) - $pu_wt, 'MU');
        $localtaxes[2] += $result[11];
    }
    $apply_tax = false;
    switch ($localtax2_type) {
        case '2':
            // localtax on product or service
            $apply_tax = true;
            break;
        case '4':
            // localtax on product
            if ($type == 0) {
                $apply_tax = true;
            }
            break;
        case '6':
            // localtax on service
            if ($type == 1) {
                $apply_tax = true;
            }
            break;
    }
    if ($uselocaltax2_rate && $apply_tax) {
        $result[15] = price2num($tot_sans_remise_wt * (1 + $localtax2_rate / 100) - $tot_sans_remise_wt, 'MT');
        $localtaxes[0] += $result[15];
        $result[10] = price2num($tot_avec_remise_wt * (1 + $localtax2_rate / 100) - $tot_avec_remise_wt, 'MT');
        $localtaxes[1] += $result[10];
        $result[12] = price2num($pu_wt * (1 + $localtax2_rate / 100) - $pu_wt, 'MU');
        $localtaxes[2] += $result[12];
    }
    //dol_syslog("price.lib::calcul_price_total $qty, $pu, $remise_percent_ligne, $txtva, $price_base_type $info_bits");
    if ($price_base_type == 'HT') {
        // We work to define prices using the price without tax
        $result[6] = price2num($tot_sans_remise, 'MT');
        $result[8] = price2num($tot_sans_remise * (1 + ($info_bits & 1 ? 0 : $txtva) / 100) + $localtaxes[0], 'MT');
        // Selon TVA NPR ou non
        $result8bis = price2num($tot_sans_remise * (1 + $txtva / 100) + $localtaxes[0], 'MT');
        // Si TVA consideree normale (non NPR)
        $result[7] = price2num($result8bis - ($result[6] + $localtaxes[0]), 'MT');
        $result[0] = price2num($tot_avec_remise, 'MT');
        $result[2] = price2num($tot_avec_remise * (1 + ($info_bits & 1 ? 0 : $txtva) / 100) + $localtaxes[1], 'MT');
        // Selon TVA NPR ou non
        $result2bis = price2num($tot_avec_remise * (1 + $txtva / 100) + $localtaxes[1], 'MT');
        // Si TVA consideree normale (non NPR)
        $result[1] = price2num($result2bis - ($result[0] + $localtaxes[1]), 'MT');
        // Total VAT = TTC - (HT + localtax)
        $result[3] = price2num($pu, 'MU');
        $result[5] = price2num($pu * (1 + ($info_bits & 1 ? 0 : $txtva) / 100) + $localtaxes[2], 'MU');
        // Selon TVA NPR ou non
        $result5bis = price2num($pu * (1 + $txtva / 100) + $localtaxes[2], 'MU');
        // Si TVA consideree normale (non NPR)
        $result[4] = price2num($result5bis - ($result[3] + $localtaxes[2]), 'MU');
    } else {
        // We work to define prices using the price with tax
        $result[8] = price2num($tot_sans_remise + $localtaxes[0], 'MT');
        $result[6] = price2num($tot_sans_remise / (1 + ($info_bits & 1 ? 0 : $txtva) / 100), 'MT');
        // Selon TVA NPR ou non
        $result6bis = price2num($tot_sans_remise / (1 + $txtva / 100), 'MT');
        // Si TVA consideree normale (non NPR)
        $result[7] = price2num($result[8] - ($result6bis + $localtaxes[0]), 'MT');
        $result[2] = price2num($tot_avec_remise + $localtaxes[1], 'MT');
        $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] = price2num($result[2] - ($result0bis + $localtaxes[1]), 'MT');
        // Total VAT = TTC - (HT + localtax)
        $result[5] = price2num($pu + $localtaxes[2], 'MU');
        $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] = price2num($result[5] - ($result3bis + $localtaxes[2]), 'MU');
    }
    // if there's some localtax without vat, we calculate localtaxes (we will add them at end)
    //If input unit price is 'TTC', we need to have the totals without main VAT for a correct calculation
    if ($price_base_type == 'TTC') {
        $tot_sans_remise = price2num($tot_sans_remise / (1 + $txtva / 100), 'MU');
        $tot_avec_remise = price2num($tot_avec_remise / (1 + $txtva / 100), 'MU');
        $pu = price2num($pu / (1 + $txtva / 100), 'MU');
    }
    $apply_tax = false;
    switch ($localtax1_type) {
        case '1':
            // localtax on product or service
            $apply_tax = true;
            break;
        case '3':
            // localtax on product
            if ($type == 0) {
                $apply_tax = true;
            }
            break;
        case '5':
            // localtax on service
            if ($type == 1) {
                $apply_tax = true;
            }
            break;
    }
    if ($uselocaltax1_rate && $apply_tax) {
        $result[14] = price2num($tot_sans_remise * (1 + $localtax1_rate / 100) - $tot_sans_remise, 'MT');
        // amount tax1 for total_ht_without_discount
        $result[8] += $result[14];
        // total_ttc_without_discount + tax1
        $result[9] = price2num($tot_avec_remise * (1 + $localtax1_rate / 100) - $tot_avec_remise, 'MT');
        // amount tax1 for total_ht
        $result[2] += $result[9];
        // total_ttc + tax1
        $result[11] = price2num($pu * (1 + $localtax1_rate / 100) - $pu, 'MU');
        // amount tax1 for pu_ht
        $result[5] += $result[11];
        // pu_ht + tax1
    }
    $apply_tax = false;
    switch ($localtax2_type) {
        case '1':
            // localtax on product or service
            $apply_tax = true;
            break;
        case '3':
            // localtax on product
            if ($type == 0) {
                $apply_tax = true;
            }
            break;
        case '5':
            // localtax on service
            if ($type == 1) {
                $apply_tax = true;
            }
            break;
    }
    if ($uselocaltax2_rate && $apply_tax) {
        $result[15] = price2num($tot_sans_remise * (1 + $localtax2_rate / 100) - $tot_sans_remise, 'MT');
        // amount tax2 for total_ht_without_discount
        $result[8] += $result[15];
        // total_ttc_without_discount + tax2
        $result[10] = price2num($tot_avec_remise * (1 + $localtax2_rate / 100) - $tot_avec_remise, 'MT');
        // amount tax2 for total_ht
        $result[2] += $result[10];
        // total_ttc + tax2
        $result[12] = price2num($pu * (1 + $localtax2_rate / 100) - $pu, 'MU');
        // amount tax2 for pu_ht
        $result[5] += $result[12];
        // pu_ht + tax2
    }
    // If rounding is not using base 10 (rare)
    if (!empty($conf->global->MAIN_ROUNDING_RULE_TOT)) {
        if ($price_base_type == 'HT') {
            $result[0] = round($result[0] / $conf->global->MAIN_ROUNDING_RULE_TOT, 0) * $conf->global->MAIN_ROUNDING_RULE_TOT;
            $result[1] = round($result[1] / $conf->global->MAIN_ROUNDING_RULE_TOT, 0) * $conf->global->MAIN_ROUNDING_RULE_TOT;
            $result[2] = price2num($result[0] + $result[1], 'MT');
            $result[9] = round($result[9] / $conf->global->MAIN_ROUNDING_RULE_TOT, 0) * $conf->global->MAIN_ROUNDING_RULE_TOT;
            $result[10] = round($result[10] / $conf->global->MAIN_ROUNDING_RULE_TOT, 0) * $conf->global->MAIN_ROUNDING_RULE_TOT;
        } else {
            $result[1] = round($result[1] / $conf->global->MAIN_ROUNDING_RULE_TOT, 0) * $conf->global->MAIN_ROUNDING_RULE_TOT;
            $result[2] = round($result[2] / $conf->global->MAIN_ROUNDING_RULE_TOT, 0) * $conf->global->MAIN_ROUNDING_RULE_TOT;
            $result[0] = price2num($result[2] - $result[0], 'MT');
            $result[9] = round($result[9] / $conf->global->MAIN_ROUNDING_RULE_TOT, 0) * $conf->global->MAIN_ROUNDING_RULE_TOT;
            $result[10] = round($result[10] / $conf->global->MAIN_ROUNDING_RULE_TOT, 0) * $conf->global->MAIN_ROUNDING_RULE_TOT;
        }
    }
    // initialize result array
    //for ($i=0; $i <= 15; $i++) $result[$i] = (float) $result[$i];
    dol_syslog('Price.lib::calcul_price_total MAIN_ROUNDING_RULE_TOT=' . $conf->global->MAIN_ROUNDING_RULE_TOT . ' pu=' . $pu . ' qty=' . $qty . ' price_base_type=' . $price_base_type . ' total_ht=' . $result[0] . '-total_vat=' . $result[1] . '-total_ttc=' . $result[2]);
    return $result;
}
Ejemplo n.º 2
0
/**
 * Update total of contract lines
 *
 * @param	DoliDB		$db		Database handler
 * @param	Translate	$langs	Object langs
 * @param	Conf		$conf	Object conf
 * @return	void
 */
function migrate_price_contrat($db, $langs, $conf)
{
    $db->begin();
    $tmpmysoc = new Societe($db);
    $tmpmysoc->setMysoc($conf);
    if (empty($tmpmysoc->country_id)) {
        $tmpmysoc->country_id = 0;
    }
    // Ti not have this set to '' or will make sql syntax error.
    print '<tr><td colspan="4">';
    print '<br>';
    print '<b>' . $langs->trans('MigrationContract') . "</b><br>\n";
    // Liste des lignes contrat non a jour
    $sql = "SELECT cd.rowid, cd.qty, cd.subprice, cd.remise_percent, cd.tva_tx as tva_taux, cd.info_bits,";
    $sql .= " c.rowid as contratid";
    $sql .= " FROM " . MAIN_DB_PREFIX . "contratdet as cd, " . MAIN_DB_PREFIX . "contrat as c";
    $sql .= " WHERE cd.fk_contrat = c.rowid";
    $sql .= " AND ((cd.total_ttc = 0 AND cd.remise_percent != 100 AND cd.subprice > 0) or cd.total_ttc IS NULL)";
    dolibarr_install_syslog("upgrade2::migrate_price_contrat", LOG_DEBUG);
    $resql = $db->query($sql);
    if ($resql) {
        $num = $db->num_rows($resql);
        $i = 0;
        if ($num) {
            while ($i < $num) {
                $obj = $db->fetch_object($resql);
                $rowid = $obj->rowid;
                $qty = $obj->qty;
                $pu = $obj->subprice;
                $txtva = $obj->tva_taux;
                $remise_percent = $obj->remise_percent;
                $info_bits = $obj->info_bits;
                // On met a jour les 3 nouveaux champs
                $contratligne = new ContratLigne($db);
                //$contratligne->fetch($rowid); Non requis car le update_total ne met a jour que chp redefinis
                $contratligne->id = $rowid;
                $result = calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, 0, 0, 'HT', $info_bits, 0, $tmpmysoc);
                $total_ht = $result[0];
                $total_tva = $result[1];
                $total_ttc = $result[2];
                $contratligne->total_ht = $total_ht;
                $contratligne->total_tva = $total_tva;
                $contratligne->total_ttc = $total_ttc;
                dolibarr_install_syslog("upgrade2: Line {$rowid}: contratdetid={$obj->rowid} pu={$pu} qty={$qty} tva_taux={$txtva} remise_percent={$remise_percent} -> {$total_ht}, {$total_tva}, {$total_ttc}");
                print ". ";
                $contratligne->update_total();
                $i++;
            }
        } else {
            print $langs->trans("AlreadyDone");
        }
        $db->free($resql);
        $db->commit();
    } else {
        print "Error #1 " . $db->error();
        $db->rollback();
    }
    print '<br>';
    print '</td></tr>';
}
            print 'You are logged with user "' . $_SESSION["dol_login"] . '" and only administrator user "' . $conf->global->MAIN_ONLY_LOGIN_ALLOWED . '" is allowed to connect for the moment.' . "\n";
            $nexturl = DOL_URL_ROOT . '/user/logout.php';
            print 'Please try later or <a href="' . $nexturl . '">click here to disconnect and change login user</a>...' . "\n";
        } else {
            print 'Sorry, your application is offline. Only administrator user "' . $conf->global->MAIN_ONLY_LOGIN_ALLOWED . '" is allowed to connect for the moment.' . "\n";
            $nexturl = DOL_URL_ROOT . '/';
            print 'Please try later or <a href="' . $nexturl . '">click here to change login user</a>...' . "\n";
        }
        exit;
    }
}
// Create object $mysoc (A thirdparty object that contains properties of companies managed by Dolibarr.
if (!defined('NOREQUIREDB') && !defined('NOREQUIRESOC')) {
    require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
    $mysoc = new Societe($db);
    $mysoc->setMysoc($conf);
    // For some countries, we need to invert our address with customer address
    if ($mysoc->country_code == 'DE' && !isset($conf->global->MAIN_INVERT_SENDER_RECIPIENT)) {
        $conf->global->MAIN_INVERT_SENDER_RECIPIENT = 1;
    }
}
// Set default language (must be after the setValues setting global $conf->global->MAIN_LANG_DEFAULT. Page main.inc.php will overwrite langs->defaultlang with user value later)
if (!defined('NOREQUIRETRAN')) {
    $langcode = GETPOST('lang') ? GETPOST('lang', 'alpha', 1) : (empty($conf->global->MAIN_LANG_DEFAULT) ? 'auto' : $conf->global->MAIN_LANG_DEFAULT);
    $langs->setDefaultLang($langcode);
}
// Create the global $hookmanager object
include_once DOL_DOCUMENT_ROOT . '/core/class/hookmanager.class.php';
$hookmanager = new HookManager($db);
if (!defined('MAIN_LABEL_MENTION_NPR')) {
    define('MAIN_LABEL_MENTION_NPR', 'NPR');
Ejemplo n.º 4
0
/**
 * Mise a jour des totaux lignes de commande fournisseur
 *
 * @param	DoliDB		$db		Database handler
 * @param	Translate	$langs	Object langs
 * @param	Conf		$conf	Object conf
 * @return	void
 */
function migrate_price_commande_fournisseur($db, $langs, $conf)
{
    $db->begin();
    $tmpmysoc = new Societe($db);
    $tmpmysoc->setMysoc($conf);
    print '<tr><td colspan="4">';
    print '<br>';
    print '<b>' . $langs->trans('MigrationSupplierOrder') . "</b><br>\n";
    // Liste des lignes commande non a jour
    $sql = "SELECT cd.rowid, cd.qty, cd.subprice, cd.remise_percent, cd.tva_tx as vatrate, cd.info_bits,";
    $sql .= " c.rowid as commandeid, c.remise_percent as remise_percent_global";
    $sql .= " FROM " . MAIN_DB_PREFIX . "commande_fournisseurdet as cd, " . MAIN_DB_PREFIX . "commande_fournisseur as c";
    $sql .= " WHERE cd.fk_commande = c.rowid";
    $sql .= " AND ((cd.total_ttc = 0 AND cd.remise_percent != 100) or cd.total_ttc IS NULL)";
    dolibarr_install_syslog("upgrade2::migrate_price_commande_fournisseur");
    $resql = $db->query($sql);
    if ($resql) {
        $num = $db->num_rows($resql);
        $i = 0;
        if ($num) {
            while ($i < $num) {
                $obj = $db->fetch_object($resql);
                $rowid = $obj->rowid;
                $qty = $obj->qty;
                $pu = $obj->subprice;
                $vatrate = $obj->vatrate;
                $remise_percent = $obj->remise_percent;
                $remise_percent_global = $obj->remise_percent_global;
                $info_bits = $obj->info_bits;
                // On met a jour les 3 nouveaux champs
                $commandeligne = new CommandeFournisseurLigne($db);
                $commandeligne->fetch($rowid);
                $result = calcul_price_total($qty, $pu, $remise_percent, $vatrate, 0, 0, $remise_percent_global, 'HT', $info_bits, $commandeligne->product_type, $tmpsoc);
                $total_ht = $result[0];
                $total_tva = $result[1];
                $total_ttc = $result[2];
                $commandeligne->total_ht = $total_ht;
                $commandeligne->total_tva = $total_tva;
                $commandeligne->total_ttc = $total_ttc;
                dolibarr_install_syslog("upgrade2: Line " . $rowid . ": commandeid=" . $obj->rowid . " pu=" . $pu . "  qty=" . $qty . " vatrate=" . $vatrate . " remise_percent=" . $remise_percent . " remise_global=" . $remise_percent_global . " -> " . $total_ht . ", " . $total_tva . ", " . $total_ttc);
                print ". ";
                $commandeligne->update_total();
                /* On touche pas a facture mere
                   $commande = new Commande($db);
                   $commande->id = $obj->rowid;
                   if ( $commande->fetch($commande->id) >= 0 )
                   {
                   if ( $commande->update_price() > 0 )
                   {
                   print ". ";
                   }
                   else
                   {
                   print "Error id=".$commande->id;
                   }
                   }
                   else
                   {
                   print "Error #3";
                   }
                   */
                $i++;
            }
        } else {
            print $langs->trans("AlreadyDone");
        }
        $db->free($resql);
        /*
        $sql = "DELETE FROM ".MAIN_DB_PREFIX."commande_fournisseurdet";
        $sql.= " WHERE subprice = 0 and total_ttc = 0 and total_tva = 0 and total_ht = 0";
        $resql=$db->query($sql);
        if (! $resql)
        {
        dol_print_error($db);
        }
        */
        $db->commit();
    } else {
        print "Error #1 " . $db->error();
        $db->rollback();
    }
    print '<br>';
    print '</td></tr>';
}