2
0
forked from Wavyzz/dolibarr

Merge branch '12.0' of git@github.com:Dolibarr/dolibarr.git into develop

Conflicts:
	htdocs/product/price.php
This commit is contained in:
Laurent Destailleur
2020-11-23 19:55:13 +01:00
3 changed files with 53 additions and 8 deletions

View File

@@ -4783,6 +4783,9 @@ function price2num($amount, $rounding = '', $alreadysqlnb = 0)
// Convert amount to format with dolibarr dec and thousand (this is because PHP convert a number // Convert amount to format with dolibarr dec and thousand (this is because PHP convert a number
// to format defined by LC_NUMERIC after a calculation and we want source format to be like defined by Dolibarr setup. // to format defined by LC_NUMERIC after a calculation and we want source format to be like defined by Dolibarr setup.
if ($thousand == '.') {
$amount = str_replace($thousand, '', $amount); // Replace of thousand before test of is_numeric to avoid pb if thousand is .
}
if (is_numeric($amount)) if (is_numeric($amount))
{ {
// We put in temps value of decimal ("0.00001"). Works with 0 and 2.0E-5 and 9999.10 // We put in temps value of decimal ("0.00001"). Works with 0 and 2.0E-5 and 9999.10
@@ -4794,7 +4797,9 @@ function price2num($amount, $rounding = '', $alreadysqlnb = 0)
//print "QQ".$amount.'<br>'; //print "QQ".$amount.'<br>';
// Now make replace (the main goal of function) // Now make replace (the main goal of function)
if ($thousand != ',' && $thousand != '.') $amount = str_replace(',', '.', $amount); // To accept 2 notations for french users if ($thousand != ',' && $thousand != '.') {
$amount = str_replace(',', '.', $amount); // To accept 2 notations for french users
}
$amount = str_replace(' ', '', $amount); // To avoid spaces $amount = str_replace(' ', '', $amount); // To avoid spaces
$amount = str_replace($thousand, '', $amount); // Replace of thousand before replace of dec to avoid pb if thousand is . $amount = str_replace($thousand, '', $amount); // Replace of thousand before replace of dec to avoid pb if thousand is .
$amount = str_replace($dec, '.', $amount); $amount = str_replace($dec, '.', $amount);

View File

@@ -226,6 +226,7 @@ if (empty($reshook))
$tva_tx = $tva_tx_txt; $tva_tx = $tva_tx_txt;
$vatratecode = ''; $vatratecode = '';
$reg = array();
if (preg_match('/\((.*)\)/', $tva_tx_txt, $reg)) if (preg_match('/\((.*)\)/', $tva_tx_txt, $reg))
{ {
$vat_src_code = $reg[1]; $vat_src_code = $reg[1];
@@ -261,8 +262,8 @@ if (empty($reshook))
} }
$pricestoupdate[$i] = array( $pricestoupdate[$i] = array(
'price' => $newprice[$i], 'price' => price2num($newprice[$i]),
'price_min' => $newprice_min[$i], 'price_min' => price2num($newprice_min[$i]),
'price_base_type' => $newpricebase[$i], 'price_base_type' => $newpricebase[$i],
'default_vat_code' => $vatratecode, 'default_vat_code' => $vatratecode,
'vat_tx' => $tva_tx, // default_vat_code should be used in priority in a future 'vat_tx' => $tva_tx, // default_vat_code should be used in priority in a future
@@ -277,10 +278,14 @@ if (empty($reshook))
} }
} elseif (!$error) } elseif (!$error)
{ {
$newprice = price2num(GETPOST('price', 'alpha'));
$newprice_min = price2num(GETPOST('price_min', 'alpha'));
$newpricebase = GETPOST('price_base_type', 'alpha');
$tva_tx_txt = GETPOST('tva_tx', 'alpha'); // tva_tx can be '8.5' or '8.5*' or '8.5 (XXX)' or '8.5* (XXX)' $tva_tx_txt = GETPOST('tva_tx', 'alpha'); // tva_tx can be '8.5' or '8.5*' or '8.5 (XXX)' or '8.5* (XXX)'
$tva_tx = $tva_tx_txt; $tva_tx = $tva_tx_txt;
$vatratecode = ''; $vatratecode = '';
$reg = array();
if (preg_match('/\((.*)\)/', $tva_tx_txt, $reg)) if (preg_match('/\((.*)\)/', $tva_tx_txt, $reg))
{ {
$vat_src_code = $reg[1]; $vat_src_code = $reg[1];
@@ -320,9 +325,9 @@ if (empty($reshook))
} }
} }
$pricestoupdate[0] = array( $pricestoupdate[0] = array(
'price' => $_POST["price"], 'price' => $newprice,
'price_min' => $_POST["price_min"], 'price_min' => $newprice_min,
'price_base_type' => $_POST["price_base_type"], 'price_base_type' => $newpricebase,
'default_vat_code' => $vatratecode, 'default_vat_code' => $vatratecode,
'vat_tx' => $tva_tx, // default_vat_code should be used in priority in a future 'vat_tx' => $tva_tx, // default_vat_code should be used in priority in a future
'npr' => $npr, // default_vat_code should be used in priority in a future 'npr' => $npr, // default_vat_code should be used in priority in a future

View File

@@ -1225,6 +1225,15 @@ class FunctionsLibTest extends PHPUnit\Framework\TestCase
*/ */
public function testDolPrice2Num() public function testDolPrice2Num()
{ {
global $langs, $conf;
$oldlangs = $langs;
$newlangs = new Translate('', $conf);
$newlangs->setDefaultLang('en_US');
$newlangs->load("main");
$langs = $newlangs;
$this->assertEquals(1000, price2num('1 000.0')); $this->assertEquals(1000, price2num('1 000.0'));
$this->assertEquals(1000, price2num('1 000', 'MT')); $this->assertEquals(1000, price2num('1 000', 'MT'));
$this->assertEquals(1000, price2num('1 000', 'MU')); $this->assertEquals(1000, price2num('1 000', 'MU'));
@@ -1239,10 +1248,36 @@ class FunctionsLibTest extends PHPUnit\Framework\TestCase
$this->assertEquals(1000.13, price2num('1 000.125456', 'MT')); $this->assertEquals(1000.13, price2num('1 000.125456', 'MT'));
$this->assertEquals(1000.12546, price2num('1 000.125456', 'MU'), "Test MU"); $this->assertEquals(1000.12546, price2num('1 000.125456', 'MU'), "Test MU");
$this->assertEquals(1, price2num('1.000'), 'Test 1.000 give 1 with english language');
// Text can't be converted // Text can't be converted
$this->assertEquals('12.4$', price2num('12.4$')); $this->assertEquals('12.4$', price2num('12.4$'));
$this->assertEquals('12r.4$', price2num('12r.4$')); $this->assertEquals('12r.4$', price2num('12r.4$'));
// For spanish language
$newlangs2 = new Translate('', $conf);
$newlangs2->setDefaultLang('es_ES');
$newlangs2->load("main");
$langs = $newlangs2;
$this->assertEquals(1000, price2num('1.000'), 'Test 1.000 give 1000 with spanish language');
$this->assertEquals(1000, price2num('1 000'), 'Test 1 000 give 1000 with spanish language');
$this->assertEquals(1234, price2num('1.234'), 'Test 1.234 give 1234 with spanish language');
$this->assertEquals(1.234, price2num('1,234'), 'Test 1,234 give 1.234 with spanish language');
// For french language
$newlangs3 = new Translate('', $conf);
$newlangs3->setDefaultLang('fr_FR');
$newlangs3->load("main");
$langs = $newlangs3;
$this->assertEquals(1, price2num('1.000'), 'Test 1.000 give 1 with french language');
$this->assertEquals(1000, price2num('1 000'), 'Test 1.000 give 1 with french language');
$this->assertEquals(1.234, price2num('1.234'), 'Test 1.234 give 1.234 with french language');
$this->assertEquals(1.234, price2num('1,234'), 'Test 1,234 give 1.234 with french language');
$langs = $oldlangs;
return true; return true;
} }