1<?php
2/* Copyright (C) 2002-2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2006-2008 Laurent Destailleur  <eldy@users.sourceforge.net>
4 * Copyright (C) 2010-2013 Juanjo Menent        <jmenent@2byte.es>
5 * Copyright (C) 2012      Christophe Battarel  <christophe.battarel@altairis.fr>
6 * Copyright (C) 2012      Cédric Salvador      <csalvador@gpcsolutions.fr>
7 * Copyright (C) 2012-2014 Raphaël Doursenaud   <rdoursenaud@gpcsolutions.fr>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 */
22
23/**
24 *		\file 		htdocs/core/lib/price.lib.php
25 *		\brief 		Library with functions to calculate prices
26 */
27
28
29/**
30 *		Calculate totals (net, vat, ...) of a line.
31 *		Value for localtaxX_type are	'0' : local tax not applied
32 *										'1' : local tax apply on products and services without vat (localtax is calculated on amount without tax)
33 *										'2' : local tax apply on products and services including vat (localtax is calculated on amount + tax)
34 *										'3' : local tax apply on products without vat (localtax is calculated on amount without tax)
35 *										'4' : local tax apply on products including vat (localtax is calculated on amount + tax)
36 *										'5' : local tax apply on services without vat (localtax is calculated on amount without tax)
37 *										'6' : local tax apply on services including vat (localtax is calculated on amount + tax)
38 *
39 *		@param	int		$qty						Quantity
40 * 		@param 	float	$pu                         Unit price (HT or TTC selon price_base_type)
41 *		@param 	float	$remise_percent_ligne       Discount for line
42 *		@param 	float	$txtva                      0=do not apply VAT tax, VAT rate=apply (this is VAT rate only without text code, we don't need text code because we alreaydy have all tax info into $localtaxes_array)
43 *		@param  float	$uselocaltax1_rate          0=do not use localtax1, >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). Try to always use -1.
44 *		@param  float	$uselocaltax2_rate          0=do not use localtax2, >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). Try to always use -1.
45 *		@param 	float	$remise_percent_global		0
46 *		@param	string	$price_base_type 			HT=Unit price parameter is HT, TTC=Unit price parameter is TTC
47 *		@param	int		$info_bits					Miscellaneous informations on line
48 *		@param	int		$type						0/1=Product/service
49 *		@param  Societe	$seller						Thirdparty seller (we need $seller->country_id property). Provided only if seller is the supplier, otherwise $seller will be $mysoc.
50 *		@param  array	$localtaxes_array			Array with localtaxes info array('0'=>type1,'1'=>rate1,'2'=>type2,'3'=>rate2) (loaded by getLocalTaxesFromRate(vatrate, 0, ...) function).
51 *		@param  integer	$progress                   Situation invoices progress (value from 0 to 100, 100 by default)
52 *		@param  double	$multicurrency_tx           Currency rate (1 by default)
53 * 		@param  double	$pu_devise					Amount in currency
54 *      @param  string  $multicurrency_code			Value of the foreign currency if multicurrency is used ('EUR', 'USD', ...). It will be used for rounding according to currency.
55 *		@return         array [
56 *                       0=total_ht,
57 *						 1=total_vat, (main vat only)
58 *						 2=total_ttc, (total_ht + main vat + local taxes)
59 *						 3=pu_ht,
60 *						 4=pu_vat, (main vat only)
61 *						 5=pu_ttc,
62 *						 6=total_ht_without_discount,
63 *						 7=total_vat_without_discount, (main vat only)
64 *						 8=total_ttc_without_discount, (total_ht + main vat + local taxes)
65 *						 9=total_tax1 for total_ht,
66 *						10=total_tax2 for total_ht,
67 *
68 *						11=pu_tax1 for pu_ht, 							!! should not be used
69 *						12=pu_tax2 for pu_ht, 							!! should not be used
70 *						13=??                 							!! should not be used
71 *						14=total_tax1 for total_ht_without_discount,	!! should not be used
72 *						15=total_tax2 for total_ht_without_discount,	!! should not be used
73 *
74 * 						16=multicurrency_total_ht
75 * 						17=multicurrency_total_tva
76 * 						18=multicurrency_total_ttc
77 * 						19=multicurrency_pu_ht
78 * 						20=multicurrency_pu_vat
79 * 						21=multicurrency_pu_ttc
80 * 						22=multicurrency_total_ht_without_discount
81 * 						23=multicurrency_total_vat_without_discount
82 * 						24=multicurrency_total_ttc_without_discount
83 * 						25=multicurrency_total_tax1 for total_ht
84 *                      26=multicurrency_total_tax2 for total_ht
85 */
86function 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, $multicurrency_tx = 1, $pu_devise = 0, $multicurrency_code = '')
87{
88	global $conf, $mysoc, $db;
89
90	$result = array();
91
92	// Clean parameters
93	if (empty($info_bits)) $info_bits = 0;
94	if (empty($txtva)) $txtva = 0;
95	if (empty($seller) || !is_object($seller))
96	{
97		dol_syslog("Price.lib::calcul_price_total Warning: function is called with parameter seller that is missing", LOG_WARNING);
98		if (!is_object($mysoc))	// mysoc may be not defined (during migration process)
99		{
100			$mysoc = new Societe($db);
101			$mysoc->setMysoc($conf);
102		}
103		$seller = $mysoc; // If sell is done to a customer, $seller is not provided, we use $mysoc
104		//var_dump($seller->country_id);exit;
105	}
106	if (empty($localtaxes_array) || !is_array($localtaxes_array)) {
107		dol_syslog("Price.lib::calcul_price_total Warning: function is called with parameter localtaxes_array that is missing or empty", LOG_WARNING);
108	}
109	if (!is_numeric($txtva)) {
110		dol_syslog("Price.lib::calcul_price_total Warning: function was called with a parameter vat rate that is not a real numeric value. There is surely a bug.", LOG_ERR);
111	} elseif ($txtva >= 1000) {
112		dol_syslog("Price.lib::calcul_price_total Warning: function was called with a bad value for vat rate (should be often < 100, always < 1000). There is surely a bug.", LOG_ERR);
113	}
114	// Too verbose. Enable for debug only
115	//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);
116
117	$countryid = $seller->country_id;
118
119	if (is_numeric($uselocaltax1_rate)) $uselocaltax1_rate = (float) $uselocaltax1_rate;
120	if (is_numeric($uselocaltax2_rate)) $uselocaltax2_rate = (float) $uselocaltax2_rate;
121
122	if ($uselocaltax1_rate < 0) $uselocaltax1_rate = $seller->localtax1_assuj;
123	if ($uselocaltax2_rate < 0) $uselocaltax2_rate = $seller->localtax2_assuj;
124
125	//var_dump($uselocaltax1_rate.' - '.$uselocaltax2_rate);
126	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);
127
128	// Now we search localtaxes information ourself (rates and types).
129	$localtax1_type = 0;
130	$localtax2_type = 0;
131
132	if (is_array($localtaxes_array) && count($localtaxes_array)) {
133		$localtax1_type = $localtaxes_array[0];
134		$localtax1_rate = $localtaxes_array[1];
135		$localtax2_type = $localtaxes_array[2];
136		$localtax2_rate = $localtaxes_array[3];
137	} else {
138		// deprecated method. values and type for localtaxes must be provided by caller and loaded with getLocalTaxesFromRate using the full vat rate (including text code)
139		// also, with this method, we may get several possible values (for example with localtax2 in spain), so we take the first one.
140		dol_syslog("Price.lib::calcul_price_total search vat information using old deprecated method", LOG_WARNING);
141
142		$sql = "SELECT taux, localtax1, localtax2, localtax1_type, localtax2_type";
143		$sql .= " FROM ".MAIN_DB_PREFIX."c_tva as cv";
144		$sql .= " WHERE cv.taux = ".$txtva;
145		$sql .= " AND cv.fk_pays = ".$countryid;
146		$resql = $db->query($sql);
147		if ($resql)
148		{
149			$obj = $db->fetch_object($resql);
150			if ($obj)
151			{
152				$localtax1_rate = (float) $obj->localtax1;		// Use float to force to get first numeric value when value is x:y:z
153				$localtax2_rate = (float) $obj->localtax2;		// Use float to force to get first numeric value when value is -19:-15:-9
154				$localtax1_type = $obj->localtax1_type;
155				$localtax2_type = $obj->localtax2_type;
156				//var_dump($localtax1_rate.' '.$localtax2_rate.' '.$localtax1_type.' '.$localtax2_type);
157			}
158		} else dol_print_error($db);
159	}
160
161	// pu calculation from pu_devise if pu empty
162	if (empty($pu) && !empty($pu_devise)) {
163		if (!empty($multicurrency_tx)) $pu = $pu_devise / $multicurrency_tx;
164		else {
165			dol_syslog('Price.lib::calcul_price_total function called with bad parameters combination (multicurrency_tx empty when pu_devise not) ', LOG_ERR);
166			return array();
167		}
168	}
169	if ($pu === '') $pu = 0;
170	// pu_devise calculation from pu
171	if (empty($pu_devise) && !empty($multicurrency_tx)) {
172		if (is_numeric($pu) && is_numeric($multicurrency_tx)) $pu_devise = $pu * $multicurrency_tx;
173		else {
174			dol_syslog('Price.lib::calcul_price_total function called with bad parameters combination (pu or multicurrency_tx are not numeric)', LOG_ERR);
175			return array();
176		}
177	}
178
179	// initialize total (may be HT or TTC depending on price_base_type)
180	$tot_sans_remise = $pu * $qty * $progress / 100;
181	$tot_avec_remise_ligne = $tot_sans_remise * (1 - ($remise_percent_ligne / 100));
182	$tot_avec_remise       = $tot_avec_remise_ligne * (1 - ($remise_percent_global / 100));
183
184	// initialize result array
185	for ($i = 0; $i <= 15; $i++) $result[$i] = 0;
186
187	// if there's some localtax including vat, we calculate localtaxes (we will add later)
188
189	// if input unit price is 'HT', we need to have the totals with main VAT for a correct calculation
190	if ($price_base_type != 'TTC')
191	{
192		$tot_sans_remise_wt = price2num($tot_sans_remise * (1 + ($txtva / 100)), 'MU');
193		$tot_avec_remise_wt = price2num($tot_avec_remise * (1 + ($txtva / 100)), 'MU');
194		$pu_wt = price2num($pu * (1 + ($txtva / 100)), 'MU');
195	} else {
196		$tot_sans_remise_wt = $tot_sans_remise;
197		$tot_avec_remise_wt = $tot_avec_remise;
198		$pu_wt = $pu;
199	}
200
201	//print 'rr'.$price_base_type.'-'.$txtva.'-'.$tot_sans_remise_wt."-".$pu_wt."-".$uselocaltax1_rate."-".$localtax1_rate."-".$localtax1_type."\n";
202
203	$localtaxes = array(0, 0, 0);
204	$apply_tax = false;
205	switch ($localtax1_type) {
206		case '2':     // localtax on product or service
207			$apply_tax = true;
208			break;
209		case '4':     // localtax on product
210			if ($type == 0) $apply_tax = true;
211			break;
212		case '6':     // localtax on service
213			if ($type == 1) $apply_tax = true;
214			break;
215	}
216
217	if ($uselocaltax1_rate && $apply_tax) {
218  		$result[14] = price2num(($tot_sans_remise_wt * (1 + ($localtax1_rate / 100))) - $tot_sans_remise_wt, 'MT');
219  		$localtaxes[0] += $result[14];
220
221  		$result[9] = price2num(($tot_avec_remise_wt * (1 + ($localtax1_rate / 100))) - $tot_avec_remise_wt, 'MT');
222  		$localtaxes[1] += $result[9];
223
224  		$result[11] = price2num(($pu_wt * (1 + ($localtax1_rate / 100))) - $pu_wt, 'MU');
225  		$localtaxes[2] += $result[11];
226	}
227
228	$apply_tax = false;
229	switch ($localtax2_type) {
230		case '2':     // localtax on product or service
231			$apply_tax = true;
232			break;
233		case '4':     // localtax on product
234			if ($type == 0) $apply_tax = true;
235			break;
236		case '6':     // localtax on service
237			if ($type == 1) $apply_tax = true;
238			break;
239	}
240	if ($uselocaltax2_rate && $apply_tax) {
241  		$result[15] = price2num(($tot_sans_remise_wt * (1 + ($localtax2_rate / 100))) - $tot_sans_remise_wt, 'MT');
242  		$localtaxes[0] += $result[15];
243
244  		$result[10] = price2num(($tot_avec_remise_wt * (1 + ($localtax2_rate / 100))) - $tot_avec_remise_wt, 'MT');
245  		$localtaxes[1] += $result[10];
246
247  		$result[12] = price2num(($pu_wt * (1 + ($localtax2_rate / 100))) - $pu_wt, 'MU');
248  		$localtaxes[2] += $result[12];
249	}
250
251	//dol_syslog("price.lib::calcul_price_total $qty, $pu, $remise_percent_ligne, $txtva, $price_base_type $info_bits");
252	if ($price_base_type == 'HT')
253	{
254		// We work to define prices using the price without tax
255		$result[6] = price2num($tot_sans_remise, 'MT');
256		$result[8] = price2num($tot_sans_remise * (1 + ((($info_bits & 1) ? 0 : $txtva) / 100)) + $localtaxes[0], 'MT'); // Selon TVA NPR ou non
257		$result8bis = price2num($tot_sans_remise * (1 + ($txtva / 100)) + $localtaxes[0], 'MT'); // Si TVA consideree normale (non NPR)
258		$result[7] = price2num($result8bis - ($result[6] + $localtaxes[0]), 'MT');
259
260		$result[0] = price2num($tot_avec_remise, 'MT');
261		$result[2] = price2num($tot_avec_remise * (1 + ((($info_bits & 1) ? 0 : $txtva) / 100)) + $localtaxes[1], 'MT'); // Selon TVA NPR ou non
262		$result2bis = price2num($tot_avec_remise * (1 + ($txtva / 100)) + $localtaxes[1], 'MT'); // Si TVA consideree normale (non NPR)
263		$result[1] = price2num($result2bis - ($result[0] + $localtaxes[1]), 'MT'); // Total VAT = TTC - (HT + localtax)
264
265		$result[3] = price2num($pu, 'MU');
266		$result[5] = price2num($pu * (1 + ((($info_bits & 1) ? 0 : $txtva) / 100)) + $localtaxes[2], 'MU'); // Selon TVA NPR ou non
267		$result5bis = price2num($pu * (1 + ($txtva / 100)) + $localtaxes[2], 'MU'); // Si TVA consideree normale (non NPR)
268		$result[4] = price2num($result5bis - ($result[3] + $localtaxes[2]), 'MU');
269	} else {
270		// We work to define prices using the price with tax
271		$result[8] = price2num($tot_sans_remise + $localtaxes[0], 'MT');
272		$result[6] = price2num($tot_sans_remise / (1 + ((($info_bits & 1) ? 0 : $txtva) / 100)), 'MT'); // Selon TVA NPR ou non
273		$result6bis = price2num($tot_sans_remise / (1 + ($txtva / 100)), 'MT'); // Si TVA consideree normale (non NPR)
274		$result[7] = price2num($result[8] - ($result6bis + $localtaxes[0]), 'MT');
275
276		$result[2] = price2num($tot_avec_remise + $localtaxes[1], 'MT');
277		$result[0] = price2num($tot_avec_remise / (1 + ((($info_bits & 1) ? 0 : $txtva) / 100)), 'MT'); // Selon TVA NPR ou non
278		$result0bis = price2num($tot_avec_remise / (1 + ($txtva / 100)), 'MT'); // Si TVA consideree normale (non NPR)
279		$result[1] = price2num($result[2] - ($result0bis + $localtaxes[1]), 'MT'); // Total VAT = TTC - (HT + localtax)
280
281		$result[5] = price2num($pu + $localtaxes[2], 'MU');
282		$result[3] = price2num($pu / (1 + ((($info_bits & 1) ? 0 : $txtva) / 100)), 'MU'); // Selon TVA NPR ou non
283		$result3bis = price2num($pu / (1 + ($txtva / 100)), 'MU'); // Si TVA consideree normale (non NPR)
284		$result[4] = price2num($result[5] - ($result3bis + $localtaxes[2]), 'MU');
285	}
286
287	// if there's some localtax without vat, we calculate localtaxes (we will add them at end)
288
289	//If input unit price is 'TTC', we need to have the totals without main VAT for a correct calculation
290	if ($price_base_type == 'TTC')
291	{
292		$tot_sans_remise = price2num($tot_sans_remise / (1 + ($txtva / 100)), 'MU');
293		$tot_avec_remise = price2num($tot_avec_remise / (1 + ($txtva / 100)), 'MU');
294		$pu = price2num($pu / (1 + ($txtva / 100)), 'MU');
295	}
296
297	$apply_tax = false;
298	switch ($localtax1_type) {
299		case '1':     // localtax on product or service
300			$apply_tax = true;
301			break;
302		case '3':     // localtax on product
303			if ($type == 0) $apply_tax = true;
304			break;
305		case '5':     // localtax on service
306			if ($type == 1) $apply_tax = true;
307			break;
308	}
309	if ($uselocaltax1_rate && $apply_tax) {
310  		$result[14] = price2num(($tot_sans_remise * (1 + ($localtax1_rate / 100))) - $tot_sans_remise, 'MT'); // amount tax1 for total_ht_without_discount
311  		$result[8] += $result[14]; // total_ttc_without_discount + tax1
312
313  		$result[9] = price2num(($tot_avec_remise * (1 + ($localtax1_rate / 100))) - $tot_avec_remise, 'MT'); // amount tax1 for total_ht
314  		$result[2] += $result[9]; // total_ttc + tax1
315
316  		$result[11] = price2num(($pu * (1 + ($localtax1_rate / 100))) - $pu, 'MU'); // amount tax1 for pu_ht
317  		$result[5] += $result[11]; // pu_ht + tax1
318	}
319
320	$apply_tax = false;
321	switch ($localtax2_type) {
322		case '1':     // localtax on product or service
323			$apply_tax = true;
324			break;
325		case '3':     // localtax on product
326			if ($type == 0) $apply_tax = true;
327			break;
328		case '5':     // localtax on service
329			if ($type == 1) $apply_tax = true;
330			break;
331	}
332	if ($uselocaltax2_rate && $apply_tax) {
333  		$result[15] = price2num(($tot_sans_remise * (1 + ($localtax2_rate / 100))) - $tot_sans_remise, 'MT'); // amount tax2 for total_ht_without_discount
334  		$result[8] += $result[15]; // total_ttc_without_discount + tax2
335
336  		$result[10] = price2num(($tot_avec_remise * (1 + ($localtax2_rate / 100))) - $tot_avec_remise, 'MT'); // amount tax2 for total_ht
337  		$result[2] += $result[10]; // total_ttc + tax2
338
339  		$result[12] = price2num(($pu * (1 + ($localtax2_rate / 100))) - $pu, 'MU'); // amount tax2 for pu_ht
340  		$result[5] += $result[12]; // pu_ht + tax2
341	}
342
343	// If rounding is not using base 10 (rare)
344	if (!empty($conf->global->MAIN_ROUNDING_RULE_TOT))
345	{
346		if ($price_base_type == 'HT')
347		{
348			$result[0] = round($result[0] / $conf->global->MAIN_ROUNDING_RULE_TOT, 0) * $conf->global->MAIN_ROUNDING_RULE_TOT;
349			$result[1] = round($result[1] / $conf->global->MAIN_ROUNDING_RULE_TOT, 0) * $conf->global->MAIN_ROUNDING_RULE_TOT;
350			$result[9] = round($result[9] / $conf->global->MAIN_ROUNDING_RULE_TOT, 0) * $conf->global->MAIN_ROUNDING_RULE_TOT;
351			$result[10] = round($result[10] / $conf->global->MAIN_ROUNDING_RULE_TOT, 0) * $conf->global->MAIN_ROUNDING_RULE_TOT;
352			$result[2] = price2num($result[0] + $result[1] + $result[9] + $result[10], 'MT');
353		} else {
354			$result[1] = round($result[1] / $conf->global->MAIN_ROUNDING_RULE_TOT, 0) * $conf->global->MAIN_ROUNDING_RULE_TOT;
355			$result[2] = round($result[2] / $conf->global->MAIN_ROUNDING_RULE_TOT, 0) * $conf->global->MAIN_ROUNDING_RULE_TOT;
356			$result[9] = round($result[9] / $conf->global->MAIN_ROUNDING_RULE_TOT, 0) * $conf->global->MAIN_ROUNDING_RULE_TOT;
357			$result[10] = round($result[10] / $conf->global->MAIN_ROUNDING_RULE_TOT, 0) * $conf->global->MAIN_ROUNDING_RULE_TOT;
358			$result[0] = price2num($result[2] - $result[1] - $result[9] - $result[10], 'MT');
359		}
360	}
361
362	// Multicurrency
363	if ($multicurrency_tx != 1)
364	{
365		if ($multicurrency_code) {
366			$savMAIN_MAX_DECIMALS_UNIT = $conf->global->MAIN_MAX_DECIMALS_UNIT;
367			$savMAIN_MAX_DECIMALS_TOT = $conf->global->MAIN_MAX_DECIMALS_TOT;
368			$savMAIN_ROUNDING_RULE_TOT = $conf->global->MAIN_ROUNDING_RULE_TOT;
369
370			// Set parameter for currency accurency according to the value of $multicurrency_code (this is because a foreign currency may have different rounding rules)
371			$keyforforeignMAIN_MAX_DECIMALS_UNIT = 'MAIN_MAX_DECIMALS_UNIT_'.$multicurrency_code;
372			$keyforforeignMAIN_MAX_DECIMALS_TOT = 'MAIN_MAX_DECIMALS_TOT_'.$multicurrency_code;
373			$keyforforeignMAIN_ROUNDING_RULE_TOT = 'MAIN_ROUNDING_RULE_TOT_'.$multicurrency_code;
374			if (!empty($conf->global->$keyforforeignMAIN_ROUNDING_RULE_TOT)) {
375				$conf->global->MAIN_MAX_DECIMALS_UNIT = $conf->global->$keyforforeignMAIN_MAX_DECIMALS_UNIT;
376				$conf->global->MAIN_MAX_DECIMALS_TOT = $conf->global->$keyforforeignMAIN_MAX_DECIMALS_TOT;
377				$conf->global->MAIN_ROUNDING_RULE_TOT = $conf->global->$keyforforeignMAIN_ROUNDING_RULE_TOT;
378			}
379		}
380
381		// Recal function using the multicurrency price as reference price. We must set param $multicurrency_tx to 1 to avoid infinite loop.
382		$newresult = calcul_price_total($qty, $pu_devise, $remise_percent_ligne, $txtva, $uselocaltax1_rate, $uselocaltax2_rate, $remise_percent_global, $price_base_type, $info_bits, $type, $seller, $localtaxes_array, $progress, 1, 0, '');
383
384		if ($multicurrency_code) {
385			// Restore setup of currency accurency
386			$conf->global->MAIN_MAX_DECIMALS_UNIT = $savMAIN_MAX_DECIMALS_UNIT;
387			$conf->global->MAIN_MAX_DECIMALS_TOT = $savMAIN_MAX_DECIMALS_TOT;
388			$conf->global->MAIN_ROUNDING_RULE_TOT = $savMAIN_ROUNDING_RULE_TOT;
389		}
390
391		$result[16] = $newresult[0];
392		$result[17] = $newresult[1];
393		$result[18] = $newresult[2];
394		$result[19] = $newresult[3];
395		$result[20] = $newresult[4];
396		$result[21] = $newresult[5];
397		$result[22] = $newresult[6];
398		$result[23] = $newresult[7];
399		$result[24] = $newresult[8];
400		$result[25] = $newresult[9];
401		$result[26] = $newresult[10];
402	} else {
403		$result[16] = $result[0];
404		$result[17] = $result[1];
405		$result[18] = $result[2];
406		$result[19] = $result[3];
407		$result[20] = $result[4];
408		$result[21] = $result[5];
409		$result[22] = $result[6];
410		$result[23] = $result[7];
411		$result[24] = $result[8];
412		$result[25] = $result[9];
413		$result[26] = $result[10];
414	}
415
416	//var_dump($result);
417	// initialize result array
418	//for ($i=0; $i <= 18; $i++) $result[$i] = (float) $result[$i];
419
420	dol_syslog('Price.lib::calcul_price_total MAIN_ROUNDING_RULE_TOT='.(empty($conf->global->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]);
421
422	return $result;
423}
424