Changed Price Parser functions and added testExpression

This commit is contained in:
Ion Agorria 2016-02-14 17:28:31 +01:00
parent 6bfc3f446f
commit 89657d0439
6 changed files with 118 additions and 85 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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;
}

View File

@ -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);
}
}

View File

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

View File

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