Changed Price Parser functions and added testExpression
This commit is contained in:
parent
6bfc3f446f
commit
89657d0439
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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');
|
||||
}
|
||||
|
||||
@ -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');
|
||||
|
||||
Loading…
Reference in New Issue
Block a user