23 require_once DOL_DOCUMENT_ROOT.
'/core/class/evalmath.class.php';
24 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
25 require_once DOL_DOCUMENT_ROOT.
'/product/dynamic_price/class/price_expression.class.php';
26 require_once DOL_DOCUMENT_ROOT.
'/product/dynamic_price/class/price_global_variable.class.php';
27 require_once DOL_DOCUMENT_ROOT.
'/product/dynamic_price/class/price_global_variable_updater.class.php';
28 require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
43 public $special_chr =
"#";
45 public $separator_chr =
";";
65 $langs->load(
"errors");
99 if (empty($this->error_parser)) {
100 return $langs->trans(
"ErrorPriceExpressionUnknown", 0);
102 list($code, $info) = $this->error_parser;
103 if (in_array($code, array(9, 14, 19, 20)))
105 return $langs->trans(
"ErrorPriceExpression".$code);
106 } elseif (in_array($code, array(1, 2, 3, 4, 5, 8, 10, 11, 17, 21, 22)))
108 return $langs->trans(
"ErrorPriceExpression".$code, $info);
109 } elseif (in_array($code, array(6, 23)))
111 return $langs->trans(
"ErrorPriceExpression".$code, $info[0], $info[1]);
112 } elseif (in_array($code, array(7, 12, 13, 15, 16, 18)))
114 return $langs->trans(
"ErrorPriceExpressionInternal", $code);
117 return $langs->trans(
"ErrorPriceExpressionUnknown", $code);
133 $action =
'PARSEEXPRESSION';
134 if ($result = $hookmanager->executeHooks(
'doDynamiPrice', array(
135 'expression' =>$expression,
136 'product' => $product,
138 ), $this, $action)) {
142 $expression = trim($expression);
143 if (empty($expression))
145 $this->error_parser = array(20, null);
150 $values = array_merge($values, array(
151 "tva_tx" => $product->tva_tx,
152 "localtax1_tx" => $product->localtax1_tx,
153 "localtax2_tx" => $product->localtax2_tx,
154 "weight" => $product->weight,
155 "length" => $product->length,
156 "surface" => $product->surface,
157 "price_min" => $product->price_min,
162 $extrafields->fetch_name_optionals_label(
'product',
true);
163 $product->fetch_optionals();
164 if (is_array($extrafields->attributes[$product->table_element][
'label']))
166 foreach ($extrafields->attributes[$product->table_element][
'label'] as $key=>$label)
168 $values[
"extrafield_".$key] = $product->array_options[
'options_'.$key];
174 foreach ($price_updaters->listPendingUpdaters() as $entry) {
176 $entry->update_next_update(
dol_now() + ($entry->update_interval * 60), $user);
178 $res = $entry->process();
180 $entry->update_status($res < 1 ? $entry->error :
'', $user);
185 foreach ($price_globals->listGlobalVariables() as $entry)
187 $values[
"global_".$entry->code] = $entry->value;
191 unset($values[
"supplier_id"]);
195 $em->suppress_errors =
true;
196 $this->error_expr = null;
200 $expression = str_replace(
"\n", $this->separator_chr, $expression);
201 foreach ($values as $key => $value)
203 if ($value === null && strpos($expression, $key) !==
false) {
204 $this->error_parser = array(24, $key);
207 $expression = str_replace($this->special_chr.$key.$this->special_chr, strval($value), $expression);
211 if (strpos($expression, $this->special_chr) !==
false)
213 $data = explode($this->special_chr, $expression);
214 $variable = $this->special_chr.$data[1];
215 if (isset($data[2])) $variable .= $this->special_chr;
216 $this->error_parser = array(23, array($variable, $expression));
221 $expressions = explode($this->separator_chr, $expression);
222 $expressions = array_slice($expressions, 0, $this->limit);
223 foreach ($expressions as $expr) {
227 $last_result = $em->evaluate($expr);
228 $this->error_parser = $em->last_error_code;
229 if ($this->error_parser !== null) {
230 $this->error_expr = $expr;
236 if (empty($vars[
"price"])) {
237 $vars[
"price"] = $last_result;
239 if (!isset($vars[
"price"]))
241 $this->error_parser = array(21, $expression);
244 if ($vars[
"price"] < 0)
246 $this->error_parser = array(22, $expression);
249 return $vars[
"price"];
263 $res = $price_expression->fetch($product->fk_price_expression);
265 $this->error_parser = array(19, null);
271 $res = $productFournisseur->find_min_price_product_fournisseur($product->id, 0, 0);
273 $this->error_parser = array(25, null);
275 } elseif ($res == 0) {
276 $supplier_min_price = 0;
278 $supplier_min_price = $productFournisseur->fourn_unitprice;
282 $extra_values = array_merge($extra_values, array(
283 "supplier_min_price" => $supplier_min_price,
287 $result = $this->
parseExpression($product, $price_expression->expression, $extra_values);
288 if (empty($this->error_parser)) {
289 if ($result < $product->price_min) {
290 $result = $product->price_min;
307 $res = $price_expression->fetch($product_supplier->fk_supplier_price_expression);
310 $this->error_parser = array(19, null);
315 $product_supplier->fetch($product_supplier->id,
'',
'',
'', 1);
318 $extra_values = array_merge($extra_values, array(
319 "supplier_quantity" => $product_supplier->fourn_qty,
320 "supplier_tva_tx" => $product_supplier->fourn_tva_tx,
324 return $this->
parseExpression($product_supplier, $price_expression->expression, $extra_values);
335 public function testExpression($product_id, $expression, $extra_values = array())
339 $product->fetch($product_id,
'',
'', 1);
342 $extra_values = array_merge($extra_values, array(
343 "supplier_min_price" => 1,
347 $extra_values = array_merge($extra_values, array(
348 "supplier_quantity" => 2,
349 "supplier_tva_tx" => 3,
Class to parse product price expressions.
Class to manage products or services.
parseProductSupplier($product_supplier, $extra_values=array())
Calculates supplier product price based on product supplier price and associated expression.
dol_now($mode= 'auto')
Return date for now.
testExpression($product_id, $expression, $extra_values=array())
Tests string expression for validity.
translatedError()
Returns translated error.
parseProduct($product, $extra_values=array())
Calculates product price based on product id and associated expression.
$conf db
API class for accounts.
parseExpression($product, $expression, $values)
Calculates price based on expression.
Class for accesing price expression table.
Class for accesing price global variables table.
__construct($db)
Constructor.
Class for price global variable updaters table.
Class to manage predefined suppliers products.