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');