diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php
index a71f161fe37..07ea1fc6edf 100644
--- a/htdocs/core/class/html.form.class.php
+++ b/htdocs/core/class/html.form.class.php
@@ -2084,7 +2084,7 @@ class Form
$sql = "SELECT p.rowid, p.label, p.ref, p.price, p.duration,";
$sql.= " pfp.ref_fourn, pfp.rowid as idprodfournprice, pfp.price as fprice, pfp.quantity, pfp.remise_percent, pfp.remise, pfp.unitprice,";
- $sql.= " pfp.fk_supplier_price_expression, pfp.fk_product, pfp.tva_tx, s.nom as name";
+ $sql.= " pfp.fk_supplier_price_expression, pfp.fk_product, pfp.tva_tx, pfp.fk_soc, s.nom as name";
$sql.= " FROM ".MAIN_DB_PREFIX."product as p";
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_fournisseur_price as pfp ON p.rowid = pfp.fk_product";
if ($socid) $sql.= " AND pfp.fk_soc = ".$socid;
@@ -2169,8 +2169,14 @@ class Form
$outqty=$objp->quantity;
$outdiscount=$objp->remise_percent;
if (!empty($conf->dynamicprices->enabled) && !empty($objp->fk_supplier_price_expression)) {
+ $prod_supplier = new ProductFournisseur($this->db);
+ $prod_supplier->product_fourn_price_id = $objp->idprodfournprice;
+ $prod_supplier->id = $objp->fk_product;
+ $prod_supplier->fourn_qty = $objp->quantity;
+ $prod_supplier->fourn_tva_tx = $objp->tva_tx;
+ $prod_supplier->fk_supplier_price_expression = $objp->fk_supplier_price_expression;
$priceparser = new PriceParser($this->db);
- $price_result = $priceparser->parseProductSupplier($objp->fk_product, $objp->fk_supplier_price_expression, $objp->quantity, $objp->tva_tx);
+ $price_result = $priceparser->parseProductSupplier($prod_supplier);
if ($price_result >= 0) {
$objp->fprice = $price_result;
if ($objp->quantity >= 1)
@@ -2308,8 +2314,14 @@ class Form
$opt.= '>'.$objp->name.' - '.$objp->ref_fourn.' - ';
if (!empty($conf->dynamicprices->enabled) && !empty($objp->fk_supplier_price_expression)) {
+ $prod_supplier = new ProductFournisseur($this->db);
+ $prod_supplier->product_fourn_price_id = $objp->idprodfournprice;
+ $prod_supplier->id = $productid;
+ $prod_supplier->fourn_qty = $objp->quantity;
+ $prod_supplier->fourn_tva_tx = $objp->tva_tx;
+ $prod_supplier->fk_supplier_price_expression = $objp->fk_supplier_price_expression;
$priceparser = new PriceParser($this->db);
- $price_result = $priceparser->parseProductSupplier($objp->fk_product, $objp->fk_supplier_price_expression, $objp->quantity, $objp->tva_tx);
+ $price_result = $priceparser->parseProductSupplier($prod_supplier);
if ($price_result >= 0) {
$objp->fprice = $price_result;
if ($objp->quantity >= 1)
diff --git a/htdocs/fourn/class/fournisseur.product.class.php b/htdocs/fourn/class/fournisseur.product.class.php
index ed0dcb96680..0bf0492b411 100644
--- a/htdocs/fourn/class/fournisseur.product.class.php
+++ b/htdocs/fourn/class/fournisseur.product.class.php
@@ -476,7 +476,7 @@ class ProductFournisseur extends Product
if (!empty($conf->dynamicprices->enabled) && !empty($prodfourn->fk_supplier_price_expression)) {
$priceparser = new PriceParser($this->db);
- $price_result = $priceparser->parseProductSupplier($prodid, $prodfourn->fk_supplier_price_expression, $prodfourn->fourn_qty, $prodfourn->fourn_tva_tx);
+ $price_result = $priceparser->parseProductSupplier($prodfourn);
if ($price_result >= 0) {
$prodfourn->fourn_price = $price_result;
$prodfourn->fourn_unitprice = null; //force recalculation of unitprice, as probably the price changed...
@@ -574,8 +574,14 @@ class ProductFournisseur extends Product
$fourn_price = $record["price"];
$fourn_unitprice = $record["unitprice"];
if (!empty($conf->dynamicprices->enabled) && !empty($record["fk_supplier_price_expression"])) {
+ $prod_supplier = new ProductFournisseur($this->db);
+ $prod_supplier->product_fourn_price_id = $record["product_fourn_price_id"];
+ $prod_supplier->id = $prodid;
+ $prod_supplier->fourn_qty = $record["quantity"];
+ $prod_supplier->fourn_tva_tx = $record["tva_tx"];
+ $prod_supplier->fk_supplier_price_expression = $record["fk_supplier_price_expression"];
$priceparser = new PriceParser($this->db);
- $price_result = $priceparser->parseProductSupplier($prodid, $record["fk_supplier_price_expression"], $record["quantity"], $record["tva_tx"]);
+ $price_result = $priceparser->parseProductSupplier($prod_supplier);
if ($price_result >= 0) {
$fourn_price = price2num($price_result,'MU');
if ($record["quantity"] != 0)
diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php
index 2891b2e1cf9..721f3c38759 100644
--- a/htdocs/product/class/product.class.php
+++ b/htdocs/product/class/product.class.php
@@ -1298,8 +1298,14 @@ class Product extends CommonObject
if (!empty($conf->dynamicprices->enabled) && !empty($obj->fk_supplier_price_expression))
{
require_once DOL_DOCUMENT_ROOT.'/product/dynamic_price/class/price_parser.class.php';
- $priceparser = new PriceParser($this->db);
- $price_result = $priceparser->parseProductSupplier($obj->fk_product, $obj->fk_supplier_price_expression, $obj->quantity, $obj->tva_tx);
+ $prod_supplier = new ProductFournisseur($this->db);
+ $prod_supplier->product_fourn_price_id = $obj->rowid;
+ $prod_supplier->id = $obj->fk_product;
+ $prod_supplier->fourn_qty = $obj->quantity;
+ $prod_supplier->fourn_tva_tx = $obj->tva_tx;
+ $prod_supplier->fk_supplier_price_expression = $obj->fk_supplier_price_expression;
+ $priceparser = new PriceParser($this->db);
+ $price_result = $priceparser->parseProductSupplier($prod_supplier);
if ($price_result >= 0) {
$obj->price = $price_result;
}
@@ -1333,8 +1339,14 @@ class Product extends CommonObject
if (!empty($conf->dynamicprices->enabled) && !empty($obj->fk_supplier_price_expression))
{
require_once DOL_DOCUMENT_ROOT.'/product/dynamic_price/class/price_parser.class.php';
- $priceparser = new PriceParser($this->db);
- $price_result = $priceparser->parseProductSupplier($obj->fk_product, $obj->fk_supplier_price_expression, $obj->quantity, $obj->tva_tx);
+ $prod_supplier = new ProductFournisseur($this->db);
+ $prod_supplier->product_fourn_price_id = $obj->rowid;
+ $prod_supplier->id = $obj->fk_product;
+ $prod_supplier->fourn_qty = $obj->quantity;
+ $prod_supplier->fourn_tva_tx = $obj->tva_tx;
+ $prod_supplier->fk_supplier_price_expression = $obj->fk_supplier_price_expression;
+ $priceparser = new PriceParser($this->db);
+ $price_result = $priceparser->parseProductSupplier($prod_supplier);
if ($result >= 0) {
$obj->price = $price_result;
}
diff --git a/htdocs/product/dynamic_price/class/price_parser.class.php b/htdocs/product/dynamic_price/class/price_parser.class.php
index 4a7bdb7acf6..eb1ef4e4345 100644
--- a/htdocs/product/dynamic_price/class/price_parser.class.php
+++ b/htdocs/product/dynamic_price/class/price_parser.class.php
@@ -131,6 +131,15 @@ class PriceParser
public function parseExpression($product, $expression, $values)
{
global $user;
+
+ //Check if empty
+ $expression = trim($expression);
+ if (empty($expression))
+ {
+ $this->error = array(20, null);
+ return -2;
+ }
+
//Accessible product values by expressions
$values = array_merge($values, array(
"tva_tx" => $product->tva_tx,
@@ -169,14 +178,6 @@ class PriceParser
$values["global_".$entry->code] = $entry->value;
}
- //Check if empty
- $expression = trim($expression);
- if (empty($expression))
- {
- $this->error = array(20, null);
- return -2;
- }
-
//Prepare the lib, parameters and values
$em = new EvalMath();
$em->suppress_errors = true; //Don't print errors on page
@@ -221,40 +222,11 @@ class PriceParser
}
/**
- * Calculates product price based on product id and string expression
- *
- * @param Product $product The Product object to get information
- * @param string $expression The expression to parse
- * @param array $extra_values Any aditional values for expression
- * @return int > 0 if OK, < 1 if KO
- */
- public function parseProductExpression($product, $expression, $extra_values = array())
- {
- //Get the supplier min
- $productFournisseur = new ProductFournisseur($this->db);
- $supplier_min_price = $productFournisseur->find_min_price_product_fournisseur($product->id);
-
- //Accessible values by expressions
- $extra_values = array_merge($extra_values, array(
- "supplier_min_price" => $supplier_min_price,
- ));
-
- //Parse the expression and return the price, if not error occurred check if price is higher than min
- $result = $this->parseExpression($product, $expression, $extra_values);
- if (empty($this->error)) {
- if ($result < $product->price_min) {
- $result = $product->price_min;
- }
- }
- return $result;
- }
-
- /**
- * Calculates product price based on product id and expression id
+ * Calculates product price based on product id and associated expression
*
* @param Product $product The Product object to get information
* @param array $extra_values Any aditional values for expression
- * @return int > 0 if OK, < 1 if KO
+ * @return int > 0 if OK, < 1 if KO
*/
public function parseProduct($product, $extra_values = array())
{
@@ -266,55 +238,80 @@ class PriceParser
return -1;
}
- //Parse the expression and return the price
- return $this->parseProductExpression($product, $price_expression->expression, $extra_values);
- }
-
- /**
- * Calculates supplier product price based on product id and string expression
- *
- * @param int $product_id The Product id to get information
- * @param string $expression The expression to parse
- * @param int $quantity Supplier Min quantity
- * @param int $tva_tx Supplier VAT rate
- * @param array $extra_values Any aditional values for expression
- * @return int > 0 if OK, < 1 if KO
- */
- public function parseProductSupplierExpression($product_id, $expression, $quantity = null, $tva_tx = null, $extra_values = array())
- {
- //Get the product data
- $product = new ProductFournisseur($this->db);
- $product->fetch($product_id, '', '', 1);
+ //Get the supplier min
+ $productFournisseur = new ProductFournisseur($this->db);
+ $supplier_min_price = $productFournisseur->find_min_price_product_fournisseur($product->id);
//Accessible values by expressions
$extra_values = array_merge($extra_values, array(
- "supplier_quantity" => $quantity,
- "supplier_tva_tx" => $tva_tx,
+ "supplier_min_price" => $supplier_min_price,
));
- return $this->parseExpression($product, $expression, $extra_values);
+
+ //Parse the expression and return the price, if not error occurred check if price is higher than min
+ $result = $this->parseExpression($product, $price_expression->expression, $extra_values);
+ if (empty($this->error)) {
+ if ($result < $product->price_min) {
+ $result = $product->price_min;
+ }
+ }
+ return $result;
}
/**
- * Calculates supplier product price based on product id and expression id
+ * Calculates supplier product price based on product supplier price and associated expression
*
- * @param int $product_id The Product id to get information
- * @param int $expression_id The expression to parse
- * @param int $quantity Min quantity
- * @param int $tva_tx VAT rate
- * @param array $extra_values Any aditional values for expression
+ * @param ProductFournisseur $product_supplier The Product supplier object to get information
+ * @param array $extra_values Any aditional values for expression
* @return int > 0 if OK, < 1 if KO
*/
- public function parseProductSupplier($product_id, $expression_id, $quantity = null, $tva_tx = null, $extra_values = array())
+ public function parseProductSupplier($product_supplier, $extra_values = array())
{
//Get the expression from db
$price_expression = new PriceExpression($this->db);
- $res = $price_expression->fetch($expression_id);
- if ($res < 1) {
+ $res = $price_expression->fetch($product_supplier->fk_supplier_price_expression);
+ if ($res < 1)
+ {
$this->error = array(19, null);
return -1;
}
+ //Get the product data (use ignore_expression to avoid possible recursion)
+ $product_supplier->fetch($product_supplier->id, '', '', 1);
+
+ //Accessible values by expressions
+ $extra_values = array_merge($extra_values, array(
+ "supplier_quantity" => $product_supplier->fourn_qty,
+ "supplier_tva_tx" => $product_supplier->fourn_tva_tx,
+ ));
+
//Parse the expression and return the price
- return $this->parseProductSupplierExpression($product_id, $price_expression->expression, $quantity, $tva_tx, $extra_values);
+ return $this->parseExpression($product_supplier, $price_expression->expression, $extra_values);
+ }
+
+ /**
+ * Tests string expression for validity
+ *
+ * @param int $product_id The Product id to get information
+ * @param string $expression The expression to parse
+ * @param array $extra_values Any aditional values for expression
+ * @return int > 0 if OK, < 1 if KO
+ */
+ public function testExpression($product_id, $expression, $extra_values = array())
+ {
+ //Get the product data
+ $product = new Product($this->db);
+ $product->fetch($product_id, '', '', 1);
+
+ //Values for product expressions
+ $extra_values = array_merge($extra_values, array(
+ "supplier_min_price" => 1,
+ ));
+
+ //Values for supplier product expressions
+ $extra_values = array_merge($extra_values, array(
+ "supplier_quantity" => 2,
+ "supplier_tva_tx" => 3,
+ ));
+ return $this->parseExpression($product, $expression, $extra_values);
}
}
\ No newline at end of file
diff --git a/htdocs/product/dynamic_price/editor.php b/htdocs/product/dynamic_price/editor.php
index d7d059ae10d..9b20371ea5b 100644
--- a/htdocs/product/dynamic_price/editor.php
+++ b/htdocs/product/dynamic_price/editor.php
@@ -16,7 +16,7 @@
*/
/**
- * \file htdocs/product/expression/editor.php
+ * \file htdocs/product/dynamic_price/editor.php
* \ingroup product
* \brief Page for editing expression
*/
@@ -73,7 +73,7 @@ if ($action == 'add')
{
//Check the expression validity by parsing it
$priceparser = new PriceParser($db);
- $price_result = $priceparser->parseProductSupplierExpression($id, $expression, 0, 0);
+ $price_result = $priceparser->testExpression($id, $expression);
if ($price_result < 0) { //Expression is not valid
setEventMessages($priceparser->translatedError(), null, 'errors');
}
@@ -113,7 +113,7 @@ if ($action == 'update')
{
//Check the expression validity by parsing it
$priceparser = new PriceParser($db);
- $price_result = $priceparser->parseProductSupplierExpression($id, $expression, 0, 0);
+ $price_result = $priceparser->testExpression($id, $expression);
if ($price_result < 0) { //Expression is not valid
setEventMessages($priceparser->translatedError(), null, 'errors');
}
diff --git a/htdocs/product/fournisseurs.php b/htdocs/product/fournisseurs.php
index 535420d3243..db6adb52648 100644
--- a/htdocs/product/fournisseurs.php
+++ b/htdocs/product/fournisseurs.php
@@ -228,8 +228,14 @@ if (empty($reshook))
if (!empty($conf->dynamicprices->enabled) && $price_expression !== '')
{
//Check the expression validity by parsing it
- $priceparser = new PriceParser($db);
- $price_result = $priceparser->parseProductSupplier($id, $price_expression, $quantity, $tva_tx);
+ $prod_supplier = new ProductFournisseur($this->db);
+ $prod_supplier->id = $prodid;
+ $prod_supplier->fourn_qty = $quantity;
+ $prod_supplier->fourn_tva_tx = $tva_tx;
+ $prod_supplier->fourn_id = $id_fourn;
+ $prod_supplier->fk_supplier_price_expression = $price_expression;
+ $priceparser = new PriceParser($db);
+ $price_result = $priceparser->parseProductSupplier($prod_supplier);
if ($price_result < 0) { //Expression is not valid
$error++;
setEventMessages($priceparser->translatedError(), null, 'errors');