--- /tmp/dsg/dolibarr/htdocs/product/dynamic_price/class/github_19.0.3_price_expression.class.php +++ /tmp/dsg/dolibarr/htdocs/product/dynamic_price/class/client_price_expression.class.php @@ -4 +4 @@ - * Copyright (C) 2015 Ion Agorria +/* Copyright (C) 2015 Ion Agorria @@ -32,296 +32,349 @@ - /** - * @var DoliDB Database handler. - */ - public $db; - - /** - * @var string Error code (or message) - */ - public $error = ''; - - /** - * @var string[] Error codes (or messages) - */ - public $errors = array(); - - /** - * @var int ID - */ - public $id; - - public $title; - public $expression; - - /** - * @var string Name of table without prefix where object is stored - */ - public $table_element = "c_price_expression"; - - /** - * Constructor - * - * @param DoliDb $db Database handler - */ - public function __construct($db) - { - $this->db = $db; - } - - - /** - * Create object into database - * - * @param User $user User that creates - * @param int $notrigger 0=launch triggers after, 1=disable triggers - * @return int Return integer <0 if KO, Id of created object if OK - */ - public function create($user, $notrigger = 0) - { - $error = 0; - - // Clean parameters - if (isset($this->title)) { - $this->title = trim($this->title); - } - if (isset($this->expression)) { - $this->expression = trim($this->expression); - } - - // Insert request - $sql = "INSERT INTO ".$this->db->prefix().$this->table_element." ("; - $sql .= "title, expression"; - $sql .= ") VALUES ("; - $sql .= " ".(isset($this->title) ? "'".$this->db->escape($this->title)."'" : "''").","; - $sql .= " ".(isset($this->expression) ? "'".$this->db->escape($this->expression)."'" : "''"); - $sql .= ")"; - - $this->db->begin(); - - dol_syslog(__METHOD__, LOG_DEBUG); - $resql = $this->db->query($sql); - if (!$resql) { - $error++; - $this->errors[] = "Error ".$this->db->lasterror(); - } - - if (!$error) { - $this->id = $this->db->last_insert_id($this->db->prefix().$this->table_element); - } - - // Commit or rollback - if ($error) { - foreach ($this->errors as $errmsg) { - dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); - $this->error .= ($this->error ? ', '.$errmsg : $errmsg); - } - $this->db->rollback(); - return -1 * $error; - } else { - $this->db->commit(); - return $this->id; - } - } - - - /** - * Load object in memory from the database - * - * @param int $id Id object - * @return int Return integer < 0 if KO, 0 if OK but not found, > 0 if OK - */ - public function fetch($id) - { - // Check parameters - if (empty($id)) { - $this->error = 'ErrorWrongParameters'; - return -1; - } - - $sql = "SELECT title, expression"; - $sql .= " FROM ".$this->db->prefix().$this->table_element; - $sql .= " WHERE rowid = ".((int) $id); - - dol_syslog(__METHOD__); - $resql = $this->db->query($sql); - if ($resql) { - $obj = $this->db->fetch_object($resql); - if ($obj) { - $this->id = $id; - $this->title = $obj->title; - $this->expression = $obj->expression; - return 1; - } else { - return 0; - } - } else { - $this->error = "Error ".$this->db->lasterror(); - return -1; - } - } - - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps - /** - * List all price expressions - * - * @return array|int Array of price expressions, <0 if ko - */ - public function list_price_expression() - { - // phpcs:enable - $sql = "SELECT rowid, title, expression"; - $sql .= " FROM ".$this->db->prefix().$this->table_element; - $sql .= " ORDER BY title"; - - dol_syslog(__METHOD__, LOG_DEBUG); - $resql = $this->db->query($sql); - if ($resql) { - $retarray = array(); - - while ($record = $this->db->fetch_array($resql)) { - $price_expression_obj = new PriceExpression($this->db); - $price_expression_obj->id = $record["rowid"]; - $price_expression_obj->title = $record["title"]; - $price_expression_obj->expression = $record["expression"]; - $retarray[] = $price_expression_obj; - } - - $this->db->free($resql); - return $retarray; - } else { - $this->error = $this->db->error(); - return -1; - } - } - - - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps - /** - * Returns any existing rowid with specified title - * - * @param String $title Title of expression - * @return int Return integer < 0 if KO, 0 if OK but not found, > 0 rowid - */ - public function find_title($title) - { - // phpcs:enable - $sql = "SELECT rowid"; - $sql .= " FROM ".$this->db->prefix().$this->table_element; - $sql .= " WHERE title = '".$this->db->escape($title)."'"; - - dol_syslog(__METHOD__, LOG_DEBUG); - $resql = $this->db->query($sql); - if ($resql) { - $obj = $this->db->fetch_object($resql); - if ($obj) { - return (int) $obj->rowid; - } else { - return 0; - } - } else { - $this->error = "Error ".$this->db->lasterror(); - return -1; - } - } - - - /** - * Update object into database - * - * @param User $user User that modifies - * @param int $notrigger 0=launch triggers after, 1=disable triggers - * @return int Return integer <0 if KO, >0 if OK - */ - public function update($user = 0, $notrigger = 0) - { - $error = 0; - - // Clean parameters - if (isset($this->title)) { - $this->title = trim($this->title); - } - if (isset($this->expression)) { - $this->expression = trim($this->expression); - } - - // Update request - $sql = "UPDATE ".$this->db->prefix().$this->table_element." SET"; - $sql .= " title = ".(isset($this->title) ? "'".$this->db->escape($this->title)."'" : "''").","; - $sql .= " expression = ".(isset($this->expression) ? "'".$this->db->escape($this->expression)."'" : "''"); - $sql .= " WHERE rowid = ".((int) $this->id); - - $this->db->begin(); - - dol_syslog(__METHOD__); - $resql = $this->db->query($sql); - if (!$resql) { - $error++; - $this->errors[] = "Error ".$this->db->lasterror(); - } - - // Commit or rollback - if ($error) { - foreach ($this->errors as $errmsg) { - dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); - $this->error .= ($this->error ? ', '.$errmsg : $errmsg); - } - $this->db->rollback(); - return -1 * $error; - } else { - $this->db->commit(); - return 1; - } - } - - - /** - * Delete object in database - * - * @param User $user User that deletes - * @param int $notrigger 0=launch triggers after, 1=disable triggers - * @return int Return integer <0 if KO, >0 if OK - */ - public function delete(User $user, $notrigger = 0) - { - $error = 0; - - $rowid = $this->id; - - $this->db->begin(); - - if (!$error) { - $sql = "DELETE FROM ".$this->db->prefix().$this->table_element; - $sql .= " WHERE rowid = ".((int) $rowid); - - dol_syslog(__METHOD__); - $resql = $this->db->query($sql); - if (!$resql) { - $error++; - $this->errors[] = "Error ".$this->db->lasterror(); - } - } - - // Commit or rollback - if ($error) { - foreach ($this->errors as $errmsg) { - dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); - $this->error .= ($this->error ? ', '.$errmsg : $errmsg); - } - $this->db->rollback(); - return -1 * $error; - } else { - $this->db->commit(); - return 1; - } - } - - /** - * Initialise object with example values - * Id must be 0 if object instance is a specimen - * - * @return void - */ - public function initAsSpecimen() - { - $this->id = 0; - $this->expression = ''; - } + /** + * @var DoliDB Database handler. + */ + public $db; + + /** + * @var string Error code (or message) + */ + public $error = ''; + + /** + * @var string[] Error codes (or messages) + */ + public $errors = array(); + + /** + * @var int ID + */ + public $id; + + public $title; + public $expression; + + /** + * @var string Name of table without prefix where object is stored + */ + public $table_element = "c_price_expression"; + + /** + * Constructor + * + * @param DoliDb $db Database handler + */ + public function __construct($db) + { + $this->db = $db; + } + + + /** + * Create object into database + * + * @param User $user User that creates + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, Id of created object if OK + */ + public function create($user, $notrigger = 0) + { + $error = 0; + + // Clean parameters + if (isset($this->title)) $this->title = trim($this->title); + if (isset($this->expression)) $this->expression = trim($this->expression); + + // Insert request + $sql = "INSERT INTO ".MAIN_DB_PREFIX.$this->table_element." ("; + $sql .= "title, expression"; + $sql .= ") VALUES ("; + $sql .= " ".(isset($this->title) ? "'".$this->db->escape($this->title)."'" : "''").","; + $sql .= " ".(isset($this->expression) ? "'".$this->db->escape($this->expression)."'" : "''"); + $sql .= ")"; + + $this->db->begin(); + + dol_syslog(__METHOD__, LOG_DEBUG); + $resql = $this->db->query($sql); + if (!$resql) { $error++; $this->errors[] = "Error ".$this->db->lasterror(); } + + if (!$error) + { + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.$this->table_element); + + //if (! $notrigger) + //{ + // Uncomment this and change MYOBJECT to your own tag if you + // want this action calls a trigger. + + //// Call triggers + //$result=$this->call_trigger('MYOBJECT_CREATE',$user); + //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} + //// End call triggers + //} + } + + // Commit or rollback + if ($error) + { + foreach ($this->errors as $errmsg) + { + dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); + $this->error .= ($this->error ? ', '.$errmsg : $errmsg); + } + $this->db->rollback(); + return -1 * $error; + } + else + { + $this->db->commit(); + return $this->id; + } + } + + + /** + * Load object in memory from the database + * + * @param int $id Id object + * @return int < 0 if KO, 0 if OK but not found, > 0 if OK + */ + public function fetch($id) + { + // Check parameters + if (empty($id)) + { + $this->error = 'ErrorWrongParameters'; + return -1; + } + + $sql = "SELECT title, expression"; + $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element; + $sql .= " WHERE rowid = ".$id; + + dol_syslog(__METHOD__); + $resql = $this->db->query($sql); + if ($resql) + { + $obj = $this->db->fetch_object($resql); + if ($obj) + { + $this->id = $id; + $this->title = $obj->title; + $this->expression = $obj->expression; + return 1; + } + else + { + return 0; + } + } + else + { + $this->error = "Error ".$this->db->lasterror(); + return -1; + } + } + + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + /** + * List all price expressions + * + * @return array Array of price expressions + */ + public function list_price_expression() + { + // phpcs:enable + $sql = "SELECT rowid, title, expression"; + $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element; + $sql .= " ORDER BY title"; + + dol_syslog(__METHOD__, LOG_DEBUG); + $resql = $this->db->query($sql); + if ($resql) + { + $retarray = array(); + + while ($record = $this->db->fetch_array($resql)) + { + $price_expression_obj = new PriceExpression($this->db); + $price_expression_obj->id = $record["rowid"]; + $price_expression_obj->title = $record["title"]; + $price_expression_obj->expression = $record["expression"]; + $retarray[] = $price_expression_obj; + } + + $this->db->free($resql); + return $retarray; + } + else + { + $this->error = $this->db->error(); + return -1; + } + } + + + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + /** + * Returns any existing rowid with specified title + * + * @param String $title Title of expression + * @return int < 0 if KO, 0 if OK but not found, > 0 rowid + */ + public function find_title($title) + { + // phpcs:enable + $sql = "SELECT rowid"; + $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element; + $sql .= " WHERE title = '".$this->db->escape($title)."'"; + + dol_syslog(__METHOD__, LOG_DEBUG); + $resql = $this->db->query($sql); + if ($resql) + { + $obj = $this->db->fetch_object($resql); + if ($obj) + { + return (int) $obj->rowid; + } + else + { + return 0; + } + } + else + { + $this->error = "Error ".$this->db->lasterror(); + return -1; + } + } + + + /** + * Update object into database + * + * @param User $user User that modifies + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, >0 if OK + */ + public function update($user = 0, $notrigger = 0) + { + $error = 0; + + // Clean parameters + if (isset($this->title)) $this->title = trim($this->title); + if (isset($this->expression)) $this->expression = trim($this->expression); + + // Update request + $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET"; + $sql .= " title = ".(isset($this->title) ? "'".$this->db->escape($this->title)."'" : "''").","; + $sql .= " expression = ".(isset($this->expression) ? "'".$this->db->escape($this->expression)."'" : "''").""; + $sql .= " WHERE rowid = ".$this->id; + + $this->db->begin(); + + dol_syslog(__METHOD__); + $resql = $this->db->query($sql); + if (!$resql) { $error++; $this->errors[] = "Error ".$this->db->lasterror(); } + + // if (! $error) + // { + // if (! $notrigger) + // { + // // Uncomment this and change MYOBJECT to your own tag if you + // // want this action calls a trigger. + + // //// Call triggers + // //$result=$this->call_trigger('MYOBJECT_MODIFY',$user); + // //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} + // //// End call triggers + // } + // } + + // Commit or rollback + if ($error) + { + foreach ($this->errors as $errmsg) + { + dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); + $this->error .= ($this->error ? ', '.$errmsg : $errmsg); + } + $this->db->rollback(); + return -1 * $error; + } + else + { + $this->db->commit(); + return 1; + } + } + + + /** + * Delete object in database + * + * @param User $user User that deletes + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, >0 if OK + */ + public function delete(User $user, $notrigger = 0) + { + $error = 0; + + $rowid = $this->id; + + $this->db->begin(); + + //if (! $error) + //{ + // if (! $notrigger) + // { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action calls a trigger. + + //// Call triggers + //$result=$this->call_trigger('MYOBJECT_DELETE',$user); + //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} + //// End call triggers + // } + //} + + if (!$error) + { + $sql = "DELETE FROM ".MAIN_DB_PREFIX.$this->table_element; + $sql .= " WHERE rowid = ".$rowid; + + dol_syslog(__METHOD__); + $resql = $this->db->query($sql); + if (!$resql) { $error++; $this->errors[] = "Error ".$this->db->lasterror(); } + } + + // Commit or rollback + if ($error) + { + foreach ($this->errors as $errmsg) + { + dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); + $this->error .= ($this->error ? ', '.$errmsg : $errmsg); + } + $this->db->rollback(); + return -1 * $error; + } + else + { + $this->db->commit(); + return 1; + } + } + + /** + * Initialise object with example values + * Id must be 0 if object instance is a specimen + * + * @return void + */ + public function initAsSpecimen() + { + $this->id = 0; + $this->expression = ''; + } --- /tmp/dsg/dolibarr/htdocs/product/dynamic_price/class/github_19.0.3_price_global_variable.class.php +++ /tmp/dsg/dolibarr/htdocs/product/dynamic_price/class/client_price_global_variable.class.php @@ -4 +4 @@ - * Copyright (C) 2015 Ion Agorria +/* Copyright (C) 2015 Ion Agorria @@ -32,315 +32,327 @@ - /** - * @var DoliDB Database handler. - */ - public $db; - - /** - * @var string Error code (or message) - */ - public $error = ''; - - /** - * @var string[] Error codes (or messages) - */ - public $errors = array(); - - /** - * @var int ID - */ - public $id; - - public $code; - - /** - * @var string description - */ - public $description; - - public $value; - - /** - * @var string Name of table without prefix where object is stored - */ - public $table_element = "c_price_global_variable"; - - /** - * Constructor - * - * @param DoliDb $db Database handler - */ - public function __construct($db) - { - $this->db = $db; - } - - - /** - * Create object into database - * - * @param User $user User that creates - * @param int $notrigger 0=launch triggers after, 1=disable triggers - * @return int Return integer <0 if KO, Id of created object if OK - */ - public function create($user, $notrigger = 0) - { - $error = 0; - - $this->checkParameters(); - - // Insert request - $sql = "INSERT INTO ".$this->db->prefix().$this->table_element." ("; - $sql .= "code, description, value"; - $sql .= ") VALUES ("; - $sql .= " ".(isset($this->code) ? "'".$this->db->escape($this->code)."'" : "''").","; - $sql .= " ".(isset($this->description) ? "'".$this->db->escape($this->description)."'" : "''").","; - $sql .= " ".((float) $this->value); - $sql .= ")"; - - $this->db->begin(); - - dol_syslog(__METHOD__); - $resql = $this->db->query($sql); - if (!$resql) { - $error++; - $this->errors[] = "Error ".$this->db->lasterror(); - } - - if (!$error) { - $this->id = $this->db->last_insert_id($this->db->prefix().$this->table_element); - - if (!$notrigger) { - // Uncomment this and change MYOBJECT to your own tag if you - // want this action calls a trigger. - - //// Call triggers - //$result=$this->call_trigger('MYOBJECT_CREATE',$user); - //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} - //// End call triggers - } - } - - // Commit or rollback - if ($error) { - foreach ($this->errors as $errmsg) { - dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); - $this->error .= ($this->error ? ', '.$errmsg : $errmsg); - } - $this->db->rollback(); - return -1 * $error; - } else { - $this->db->commit(); - return $this->id; - } - } - - - /** - * Load object in memory from the database - * - * @param int $id Id object - * @return int Return integer < 0 if KO, 0 if OK but not found, > 0 if OK - */ - public function fetch($id) - { - $sql = "SELECT code, description, value"; - $sql .= " FROM ".$this->db->prefix().$this->table_element; - $sql .= " WHERE rowid = ".((int) $id); - - dol_syslog(__METHOD__); - $resql = $this->db->query($sql); - if ($resql) { - $obj = $this->db->fetch_object($resql); - if ($obj) { - $this->id = $id; - $this->code = $obj->code; - $this->description = $obj->description; - $this->value = $obj->value; - $this->checkParameters(); - return 1; - } else { - return 0; - } - } else { - $this->error = "Error ".$this->db->lasterror(); - return -1; - } - } - - /** - * Update object into database - * - * @param User $user User that modifies - * @param int $notrigger 0=launch triggers after, 1=disable triggers - * @return int Return integer <0 if KO, >0 if OK - */ - public function update($user = 0, $notrigger = 0) - { - $error = 0; - - $this->checkParameters(); - - // Update request - $sql = "UPDATE ".$this->db->prefix().$this->table_element." SET"; - $sql .= " code = ".(isset($this->code) ? "'".$this->db->escape($this->code)."'" : "''").","; - $sql .= " description = ".(isset($this->description) ? "'".$this->db->escape($this->description)."'" : "''").","; - $sql .= " value = ".((float) $this->value); - $sql .= " WHERE rowid = ".((int) $this->id); - - $this->db->begin(); - - dol_syslog(__METHOD__); - $resql = $this->db->query($sql); - if (!$resql) { - $error++; - $this->errors[] = "Error ".$this->db->lasterror(); - } - - // if (! $error) - // { - // if (! $notrigger) - // { - // // Uncomment this and change MYOBJECT to your own tag if you - // // want this action calls a trigger. - - // //// Call triggers - // //$result=$this->call_trigger('MYOBJECT_MODIFY',$user); - // //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} - // //// End call triggers - // } - // } - - // Commit or rollback - if ($error) { - foreach ($this->errors as $errmsg) { - dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); - $this->error .= ($this->error ? ', '.$errmsg : $errmsg); - } - $this->db->rollback(); - return -1 * $error; - } else { - $this->db->commit(); - return 1; - } - } - - - /** - * Delete object in database - * - * @param int $rowid Row id of global variable - * @param User $user User that deletes - * @param int $notrigger 0=launch triggers after, 1=disable triggers - * @return int Return integer <0 if KO, >0 if OK - */ - public function delete($rowid, $user, $notrigger = 0) - { - $error = 0; - - $this->db->begin(); - - if (!$error) { - if (!$notrigger) { - // Uncomment this and change MYOBJECT to your own tag if you - // want this action calls a trigger. - - //// Call triggers - //$result=$this->call_trigger('MYOBJECT_DELETE',$user); - //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} - //// End call triggers - } - } - - if (!$error) { - $sql = "DELETE FROM ".$this->db->prefix().$this->table_element; - $sql .= " WHERE rowid = ".((int) $rowid); - - dol_syslog(__METHOD__); - $resql = $this->db->query($sql); - if (!$resql) { - $error++; - $this->errors[] = "Error ".$this->db->lasterror(); - } - } - - // Commit or rollback - if ($error) { - foreach ($this->errors as $errmsg) { - dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); - $this->error .= ($this->error ? ', '.$errmsg : $errmsg); - } - $this->db->rollback(); - return -1 * $error; - } else { - $this->db->commit(); - return 1; - } - } - - /** - * Initialise object with example values - * Id must be 0 if object instance is a specimen - * - * @return void - */ - public function initAsSpecimen() - { - $this->id = 0; - $this->code = ''; - $this->description = ''; - $this->value = ''; - } - - /** - * Checks if all parameters are in order - * - * @return void - */ - public function checkParameters() - { - // Clean parameters - if (isset($this->code)) { - $this->code = trim($this->code); - } - if (isset($this->description)) { - $this->description = trim($this->description); - } - - // Check parameters - if (empty($this->value) || !is_numeric($this->value)) { - $this->value = 0; - } - } - - /** - * List all price global variables - * - * @return array|int Array of price global variables, <0 if ko - */ - public function listGlobalVariables() - { - $sql = "SELECT rowid, code, description, value"; - $sql .= " FROM ".$this->db->prefix().$this->table_element; - $sql .= " ORDER BY code"; - - dol_syslog(__METHOD__, LOG_DEBUG); - $resql = $this->db->query($sql); - if ($resql) { - $retarray = array(); - - while ($record = $this->db->fetch_array($resql)) { - $variable_obj = new PriceGlobalVariable($this->db); - $variable_obj->id = $record["rowid"]; - $variable_obj->code = $record["code"]; - $variable_obj->description = $record["description"]; - $variable_obj->value = $record["value"]; - $variable_obj->checkParameters(); - $retarray[] = $variable_obj; - } - - $this->db->free($resql); - return $retarray; - } else { - $this->error = $this->db->error(); - return -1; - } - } + /** + * @var DoliDB Database handler. + */ + public $db; + + /** + * @var string Error code (or message) + */ + public $error = ''; + + /** + * @var string[] Error codes (or messages) + */ + public $errors = array(); + + /** + * @var int ID + */ + public $id; + + public $code; + + /** + * @var string description + */ + public $description; + + public $value; + + /** + * @var string Name of table without prefix where object is stored + */ + public $table_element = "c_price_global_variable"; + + /** + * Constructor + * + * @param DoliDb $db Database handler + */ + public function __construct($db) + { + $this->db = $db; + } + + + /** + * Create object into database + * + * @param User $user User that creates + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, Id of created object if OK + */ + public function create($user, $notrigger = 0) + { + $error = 0; + + $this->checkParameters(); + + // Insert request + $sql = "INSERT INTO ".MAIN_DB_PREFIX.$this->table_element." ("; + $sql .= "code, description, value"; + $sql .= ") VALUES ("; + $sql .= " ".(isset($this->code) ? "'".$this->db->escape($this->code)."'" : "''").","; + $sql .= " ".(isset($this->description) ? "'".$this->db->escape($this->description)."'" : "''").","; + $sql .= " ".$this->value; + $sql .= ")"; + + $this->db->begin(); + + dol_syslog(__METHOD__); + $resql = $this->db->query($sql); + if (!$resql) { $error++; $this->errors[] = "Error ".$this->db->lasterror(); } + + if (!$error) + { + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.$this->table_element); + + if (!$notrigger) + { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action calls a trigger. + + //// Call triggers + //$result=$this->call_trigger('MYOBJECT_CREATE',$user); + //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} + //// End call triggers + } + } + + // Commit or rollback + if ($error) + { + foreach ($this->errors as $errmsg) + { + dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); + $this->error .= ($this->error ? ', '.$errmsg : $errmsg); + } + $this->db->rollback(); + return -1 * $error; + } + else + { + $this->db->commit(); + return $this->id; + } + } + + + /** + * Load object in memory from the database + * + * @param int $id Id object + * @return int < 0 if KO, 0 if OK but not found, > 0 if OK + */ + public function fetch($id) + { + $sql = "SELECT code, description, value"; + $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element; + $sql .= " WHERE rowid = ".$id; + + dol_syslog(__METHOD__); + $resql = $this->db->query($sql); + if ($resql) + { + $obj = $this->db->fetch_object($resql); + if ($obj) + { + $this->id = $id; + $this->code = $obj->code; + $this->description = $obj->description; + $this->value = $obj->value; + $this->checkParameters(); + return 1; + } + else + { + return 0; + } + } + else + { + $this->error = "Error ".$this->db->lasterror(); + return -1; + } + } + + /** + * Update object into database + * + * @param User $user User that modifies + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, >0 if OK + */ + public function update($user = 0, $notrigger = 0) + { + $error = 0; + + $this->checkParameters(); + + // Update request + $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET"; + $sql .= " code = ".(isset($this->code) ? "'".$this->db->escape($this->code)."'" : "''").","; + $sql .= " description = ".(isset($this->description) ? "'".$this->db->escape($this->description)."'" : "''").","; + $sql .= " value = ".$this->value; + $sql .= " WHERE rowid = ".$this->id; + + $this->db->begin(); + + dol_syslog(__METHOD__); + $resql = $this->db->query($sql); + if (!$resql) { $error++; $this->errors[] = "Error ".$this->db->lasterror(); } + + // if (! $error) + // { + // if (! $notrigger) + // { + // // Uncomment this and change MYOBJECT to your own tag if you + // // want this action calls a trigger. + + // //// Call triggers + // //$result=$this->call_trigger('MYOBJECT_MODIFY',$user); + // //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} + // //// End call triggers + // } + // } + + // Commit or rollback + if ($error) + { + foreach ($this->errors as $errmsg) + { + dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); + $this->error .= ($this->error ? ', '.$errmsg : $errmsg); + } + $this->db->rollback(); + return -1 * $error; + } + else + { + $this->db->commit(); + return 1; + } + } + + + /** + * Delete object in database + * + * @param int $rowid Row id of global variable + * @param User $user User that deletes + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, >0 if OK + */ + public function delete($rowid, $user, $notrigger = 0) + { + $error = 0; + + $this->db->begin(); + + if (!$error) + { + if (!$notrigger) + { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action calls a trigger. + + //// Call triggers + //$result=$this->call_trigger('MYOBJECT_DELETE',$user); + //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} + //// End call triggers + } + } + + if (!$error) + { + $sql = "DELETE FROM ".MAIN_DB_PREFIX.$this->table_element; + $sql .= " WHERE rowid = ".$rowid; + + dol_syslog(__METHOD__); + $resql = $this->db->query($sql); + if (!$resql) { $error++; $this->errors[] = "Error ".$this->db->lasterror(); } + } + + // Commit or rollback + if ($error) + { + foreach ($this->errors as $errmsg) + { + dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); + $this->error .= ($this->error ? ', '.$errmsg : $errmsg); + } + $this->db->rollback(); + return -1 * $error; + } + else + { + $this->db->commit(); + return 1; + } + } + + /** + * Initialise object with example values + * Id must be 0 if object instance is a specimen + * + * @return void + */ + public function initAsSpecimen() + { + $this->id = 0; + $this->code = ''; + $this->description = ''; + $this->value = ''; + } + + /** + * Checks if all parameters are in order + * + * @return void + */ + public function checkParameters() + { + // Clean parameters + if (isset($this->code)) $this->code = trim($this->code); + if (isset($this->description)) $this->description = trim($this->description); + + // Check parameters + if (empty($this->value) || !is_numeric($this->value)) $this->value = 0; + } + + /** + * List all price global variables + * + * @return array Array of price global variables + */ + public function listGlobalVariables() + { + $sql = "SELECT rowid, code, description, value"; + $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element; + $sql .= " ORDER BY code"; + + dol_syslog(__METHOD__, LOG_DEBUG); + $resql = $this->db->query($sql); + if ($resql) + { + $retarray = array(); + + while ($record = $this->db->fetch_array($resql)) + { + $variable_obj = new PriceGlobalVariable($this->db); + $variable_obj->id = $record["rowid"]; + $variable_obj->code = $record["code"]; + $variable_obj->description = $record["description"]; + $variable_obj->value = $record["value"]; + $variable_obj->checkParameters(); + $retarray[] = $variable_obj; + } + + $this->db->free($resql); + return $retarray; + } + else + { + $this->error = $this->db->error(); + return -1; + } + } --- /tmp/dsg/dolibarr/htdocs/product/dynamic_price/class/github_19.0.3_price_global_variable_updater.class.php +++ /tmp/dsg/dolibarr/htdocs/product/dynamic_price/class/client_price_global_variable_updater.class.php @@ -4 +4 @@ - * Copyright (C) 2015 Ion Agorria +/* Copyright (C) 2015 Ion Agorria @@ -32,613 +32,622 @@ - /** - * @var DoliDB Database handler. - */ - public $db; - - /** - * @var string Error code (or message) - */ - public $error = ''; - - /** - * @var string[] Error codes (or messages) - */ - public $errors = array(); - - public $types = array(0, 1); //!< Updater types - public $update_min = 5; //!< Minimal update rate - - /** - * @var int ID - */ - public $id; - - public $type; - - /** - * @var string description - */ - public $description; - - public $parameters; - - /** - * @var int ID - */ - public $fk_variable; - - public $update_interval; //!< Interval in mins - public $next_update; //!< Next update timestamp - public $last_status; - - /** - * @var string Name of table without prefix where object is stored - */ - public $table_element = "c_price_global_variable_updater"; - - /** - * Constructor - * - * @param DoliDb $db Database handler - */ - public function __construct($db) - { - $this->db = $db; - } - - - /** - * Create object into database - * - * @param User $user User that creates - * @param int $notrigger 0=launch triggers after, 1=disable triggers - * @return int Return integer <0 if KO, Id of created object if OK - */ - public function create($user, $notrigger = 0) - { - $error = 0; - - $this->checkParameters(); - - // Insert request - $sql = "INSERT INTO ".$this->db->prefix().$this->table_element." ("; - $sql .= "type, description, parameters, fk_variable, update_interval, next_update, last_status"; - $sql .= ") VALUES ("; - $sql .= " ".((int) $this->type).","; - $sql .= " ".(isset($this->description) ? "'".$this->db->escape($this->description)."'" : "''").","; - $sql .= " ".(isset($this->parameters) ? "'".$this->db->escape($this->parameters)."'" : "''").","; - $sql .= " ".((int) $this->fk_variable).","; - $sql .= " ".((int) $this->update_interval).","; - $sql .= " ".((int) $this->next_update).","; - $sql .= " ".(isset($this->last_status) ? "'".$this->db->escape($this->last_status)."'" : "''"); - $sql .= ")"; - - $this->db->begin(); - - dol_syslog(__METHOD__, LOG_DEBUG); - $resql = $this->db->query($sql); - if (!$resql) { - $error++; - $this->errors[] = "Error ".$this->db->lasterror(); - } - - if (!$error) { - $this->id = $this->db->last_insert_id($this->db->prefix().$this->table_element); - - if (!$notrigger) { - // Uncomment this and change MYOBJECT to your own tag if you - // want this action calls a trigger. - - //// Call triggers - //$result=$this->call_trigger('MYOBJECT_CREATE',$user); - //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} - //// End call triggers - } - } - - // Commit or rollback - if ($error) { - foreach ($this->errors as $errmsg) { - dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); - $this->error .= ($this->error ? ', '.$errmsg : $errmsg); - } - $this->db->rollback(); - return -1 * $error; - } else { - $this->db->commit(); - return $this->id; - } - } - - - /** - * Load object in memory from the database - * - * @param int $id Id object - * @return int Return integer < 0 if KO, 0 if OK but not found, > 0 if OK - */ - public function fetch($id) - { - $sql = "SELECT type, description, parameters, fk_variable, update_interval, next_update, last_status"; - $sql .= " FROM ".$this->db->prefix().$this->table_element; - $sql .= " WHERE rowid = ".((int) $id); - - dol_syslog(__METHOD__); - $resql = $this->db->query($sql); - if ($resql) { - $obj = $this->db->fetch_object($resql); - if ($obj) { - $this->id = $id; - $this->type = $obj->type; - $this->description = $obj->description; - $this->parameters = $obj->parameters; - $this->fk_variable = $obj->fk_variable; - $this->update_interval = $obj->update_interval; - $this->next_update = $obj->next_update; - $this->last_status = $obj->last_status; - $this->checkParameters(); - return 1; - } else { - return 0; - } - } else { - $this->error = "Error ".$this->db->lasterror(); - return -1; - } - } - - /** - * Update object into database - * - * @param User $user User that modifies - * @param int $notrigger 0=launch triggers after, 1=disable triggers - * @return int Return integer <0 if KO, >0 if OK - */ - public function update($user = 0, $notrigger = 0) - { - $error = 0; - - $this->checkParameters(); - - // Update request - $sql = "UPDATE ".$this->db->prefix().$this->table_element." SET"; - $sql .= " type = ".((int) $this->type).","; - $sql .= " description = ".(isset($this->description) ? "'".$this->db->escape($this->description)."'" : "''").","; - $sql .= " parameters = ".(isset($this->parameters) ? "'".$this->db->escape($this->parameters)."'" : "''").","; - $sql .= " fk_variable = ".((int) $this->fk_variable).","; - $sql .= " update_interval = ".((int) $this->update_interval).","; - $sql .= " next_update = ".((int) $this->next_update).","; - $sql .= " last_status = ".(isset($this->last_status) ? "'".$this->db->escape($this->last_status)."'" : "''"); - $sql .= " WHERE rowid = ".((int) $this->id); - - $this->db->begin(); - - dol_syslog(__METHOD__); - $resql = $this->db->query($sql); - if (!$resql) { - $error++; - $this->errors[] = "Error ".$this->db->lasterror(); - } - - // if (! $error) - // { - // if (! $notrigger) - // { - // // Uncomment this and change MYOBJECT to your own tag if you - // // want this action calls a trigger. - - // //// Call triggers - // //$result=$this->call_trigger('MYOBJECT_MODIFY',$user); - // //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} - // //// End call triggers - // } - // } - - // Commit or rollback - if ($error) { - foreach ($this->errors as $errmsg) { - dol_syslog(get_class($this)."::update ".$errmsg, LOG_ERR); - $this->error .= ($this->error ? ', '.$errmsg : $errmsg); - } - $this->db->rollback(); - return -1 * $error; - } else { - $this->db->commit(); - return 1; - } - } - - /** - * Delete object in database - * - * @param int $rowid Row id of global variable - * @param User $user User that deletes - * @param int $notrigger 0=launch triggers after, 1=disable triggers - * @return int Return integer <0 if KO, >0 if OK - */ - public function delete($rowid, $user, $notrigger = 0) - { - $error = 0; - - $this->db->begin(); - - //if (! $error) - //{ - // if (! $notrigger) - // { - // Uncomment this and change MYOBJECT to your own tag if you - // want this action calls a trigger. - - //// Call triggers - //$result=$this->call_trigger('MYOBJECT_DELETE',$user); - //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} - //// End call triggers - // } - //} - - if (!$error) { - $sql = "DELETE FROM ".$this->db->prefix().$this->table_element; - $sql .= " WHERE rowid = ".((int) $rowid); - - dol_syslog(__METHOD__); - $resql = $this->db->query($sql); - if (!$resql) { - $error++; - $this->errors[] = "Error ".$this->db->lasterror(); - } - } - - // Commit or rollback - if ($error) { - foreach ($this->errors as $errmsg) { - dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); - $this->error .= ($this->error ? ', '.$errmsg : $errmsg); - } - $this->db->rollback(); - return -1 * $error; - } else { - $this->db->commit(); - return 1; - } - } - - /** - * Initialise object with example values - * Id must be 0 if object instance is a specimen - * - * @return void - */ - public function initAsSpecimen() - { - $this->id = 0; - $this->type = 0; - $this->description = ''; - $this->parameters = ''; - $this->fk_variable = 0; - $this->update_interval = 0; - $this->next_update = 0; - $this->last_status = ''; - } - - /** - * Returns the last updated time in string html format, returns "never" if its less than 1 - * - * @return string - */ - public function getLastUpdated() - { - global $langs; - $last = $this->next_update - ($this->update_interval * 60); - if ($last < 1) { - return $langs->trans("Never"); - } - $status = empty($this->last_status) ? $langs->trans("CorrectlyUpdated") : $this->last_status; - return $status.'
'.dol_print_date($last, '%d/%m/%Y %H:%M:%S'); - } - - /** - * Checks if all parameters are in order - * - * @return void - */ - public function checkParameters() - { - // Clean parameters - if (isset($this->description)) { - $this->description = trim($this->description); - } - if (isset($this->parameters)) { - $this->parameters = trim($this->parameters); - } else { - $this->parameters = ""; - } - if (isset($this->last_status)) { - $this->last_status = trim($this->last_status); - } - - // Check parameters - if (empty($this->type) || !is_numeric($this->type) || !in_array($this->type, $this->types)) { - $this->type = 0; - } - if (empty($this->update_interval) || !is_numeric($this->update_interval) || $this->update_interval < 1) { - $this->update_interval = $this->update_min; - } - if (empty($this->next_update) || !is_numeric($this->next_update) || $this->next_update < 0) { - $this->next_update = 0; - } - } - - /** - * List all price global variables - * - * @return array|int Array of price global variable updaters - */ - public function listUpdaters() - { - $sql = "SELECT rowid, type, description, parameters, fk_variable, update_interval, next_update, last_status"; - $sql .= " FROM ".$this->db->prefix().$this->table_element; - - dol_syslog(__METHOD__, LOG_DEBUG); - $resql = $this->db->query($sql); - if ($resql) { - $retarray = array(); - - while ($record = $this->db->fetch_array($resql)) { - $updater_obj = new PriceGlobalVariableUpdater($this->db); - $updater_obj->id = $record["rowid"]; - $updater_obj->type = $record["type"]; - $updater_obj->description = $record["description"]; - $updater_obj->parameters = $record["parameters"]; - $updater_obj->fk_variable = $record["fk_variable"]; - $updater_obj->update_interval = $record["update_interval"]; - $updater_obj->next_update = $record["next_update"]; - $updater_obj->last_status = $record["last_status"]; - $updater_obj->checkParameters(); - $retarray[] = $updater_obj; - } - - $this->db->free($resql); - return $retarray; - } else { - $this->error = $this->db->error(); - return -1; - } - } - - /** - * List all updaters which need to be processed - * - * @return array|int Array of price global variable updaters - */ - public function listPendingUpdaters() - { - $sql = "SELECT rowid, type, description, parameters, fk_variable, update_interval, next_update, last_status"; - $sql .= " FROM ".$this->db->prefix().$this->table_element; - $sql .= " WHERE next_update < ".dol_now(); - - dol_syslog(__METHOD__, LOG_DEBUG); - $resql = $this->db->query($sql); - if ($resql) { - $retarray = array(); - - while ($record = $this->db->fetch_array($resql)) { - $updater_obj = new PriceGlobalVariableUpdater($this->db); - $updater_obj->id = $record["rowid"]; - $updater_obj->type = $record["type"]; - $updater_obj->description = $record["description"]; - $updater_obj->parameters = $record["parameters"]; - $updater_obj->fk_variable = $record["fk_variable"]; - $updater_obj->update_interval = $record["update_interval"]; - $updater_obj->next_update = $record["next_update"]; - $updater_obj->last_status = $record["last_status"]; - $updater_obj->checkParameters(); - $retarray[] = $updater_obj; - } - - $this->db->free($resql); - return $retarray; - } else { - $this->error = $this->db->error(); - return -1; - } - } - - /** - * Handles the processing of this updater - * - * @return int Return integer <0 if KO, 0 if OK but no global variable found, >0 if OK - */ - public function process() - { - global $langs, $user; - $langs->load("errors"); - dol_syslog(__METHOD__, LOG_DEBUG); - - $this->error = null; - $this->checkParameters(); - - //Try to load the target global variable and abort if fails - if ($this->fk_variable < 1) { - $this->error = $langs->trans("ErrorGlobalVariableUpdater5"); - return 0; - } - $price_globals = new PriceGlobalVariable($this->db); - $res = $price_globals->fetch($this->fk_variable); - if ($res < 1) { - $this->error = $langs->trans("ErrorGlobalVariableUpdater5"); - return 0; - } - - //Process depending of type - if ($this->type == 0 || $this->type == 1) { - //Get and check if required parameters are present - $parameters = json_decode($this->parameters, true); - if (!isset($parameters)) { - $this->error = $langs->trans("ErrorGlobalVariableUpdater1", $this->parameters); - return -1; - } - $url = $parameters['URL']; - if (!isset($url)) { - $this->error = $langs->trans("ErrorGlobalVariableUpdater2", 'URL'); - return -1; - } - $value = $parameters['VALUE']; - if (!isset($value)) { - $this->error = $langs->trans("ErrorGlobalVariableUpdater2", 'VALUE'); - return -1; - } - $result = ""; - if ($this->type == 0) { - // Call JSON request - include_once DOL_DOCUMENT_ROOT.'/core/lib/geturl.lib.php'; - $tmpresult = getURLContent($url, 'GET', '', 1, array(), array('http', 'https'), 0); - $code = $tmpresult['http_code']; - $result = $tmpresult['content']; - - if (!isset($result)) { - $this->error = $langs->trans("ErrorGlobalVariableUpdater0", "empty response"); - return -1; - } - if ($code !== 200) { - $this->error = $langs->trans("ErrorGlobalVariableUpdater0", $code.' '.$tmpresult['curl_error_msg']); - return -1; - } - - //Decode returned response - $result = json_decode($result, true); - } elseif ($this->type == 1) { - $ns = $parameters['NS']; - if (!isset($ns)) { - $this->error = $langs->trans("ErrorGlobalVariableUpdater2", 'NS'); - return -1; - } - $method = $parameters['METHOD']; - if (!isset($method)) { - $this->error = $langs->trans("ErrorGlobalVariableUpdater2", 'METHOD'); - return -1; - } - $data = $parameters['DATA']; - if (!isset($data)) { - $this->error = $langs->trans("ErrorGlobalVariableUpdater2", 'DATA'); - return -1; - } - - //SOAP client - require_once NUSOAP_PATH.'/nusoap.php'; - $soap_client = new nusoap_client($url); - $soap_client->soap_defencoding = 'UTF-8'; - $soap_client->decodeUTF8(false); - $result = $soap_client->call($method, $data, $ns, ''); - - //Check if result is a error - if ($result === false) { - $this->error = $langs->trans("ErrorGlobalVariableUpdater4", $soap_client->error_str); - return -1; - } - } - - //Explode value and walk for each key in value array to get the relevant key - $value = explode(',', $value); - foreach ($value as $key) { - $result = $result[$key]; - } - if (!isset($result)) { - $this->error = $langs->trans("ErrorGlobalVariableUpdater3"); - return -1; - } - - //Save data to global and update it - $price_globals->value = $result; - $price_globals->update($user); - } - return 1; - } - - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps - /** - * Update next_update into database - * - * @param string $next_update Next update to write - * @param User $user User that modifies - * @param int $notrigger 0=launch triggers after, 1=disable triggers - * @return int Return integer <0 if KO, >0 if OK - */ - public function update_next_update($next_update, $user = 0, $notrigger = 0) - { - // phpcs:enable - $error = 0; - - $this->next_update = $next_update; - $this->checkParameters(); - - // Update request - $sql = "UPDATE ".$this->db->prefix().$this->table_element." SET"; - $sql .= " next_update = ".$this->next_update; - $sql .= " WHERE rowid = ".((int) $this->id); - - $this->db->begin(); - - dol_syslog(__METHOD__); - $resql = $this->db->query($sql); - if (!$resql) { - $error++; - $this->errors[] = "Error ".$this->db->lasterror(); - } - - // Commit or rollback - if ($error) { - foreach ($this->errors as $errmsg) { - dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); - $this->error .= ($this->error ? ', '.$errmsg : $errmsg); - } - $this->db->rollback(); - return -1 * $error; - } else { - $this->db->commit(); - return 1; - } - } - - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps - /** - * Update last_status into database - * - * @param string $last_status Status to write - * @param User $user User that modifies - * @param int $notrigger 0=launch triggers after, 1=disable triggers - * @return int Return integer <0 if KO, >0 if OK - */ - public function update_status($last_status, $user = 0, $notrigger = 0) - { - // phpcs:enable - $error = 0; - - $this->last_status = $last_status; - $this->checkParameters(); - - // Update request - $sql = "UPDATE ".$this->db->prefix().$this->table_element." SET"; - $sql .= " last_status = ".(isset($this->last_status) ? "'".$this->db->escape($this->last_status)."'" : "''"); - $sql .= " WHERE rowid = ".((int) $this->id); - - $this->db->begin(); - - dol_syslog(__METHOD__); - $resql = $this->db->query($sql); - if (!$resql) { - $error++; - $this->errors[] = "Error ".$this->db->lasterror(); - } - - // Commit or rollback - if ($error) { - foreach ($this->errors as $errmsg) { - dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); - $this->error .= ($this->error ? ', '.$errmsg : $errmsg); - } - $this->db->rollback(); - return -1 * $error; - } else { - $this->db->commit(); - return 1; - } - } + /** + * @var DoliDB Database handler. + */ + public $db; + + /** + * @var string Error code (or message) + */ + public $error = ''; + + /** + * @var string[] Error codes (or messages) + */ + public $errors = array(); + + public $types = array(0, 1); //!< Updater types + public $update_min = 5; //!< Minimal update rate + + /** + * @var int ID + */ + public $id; + + public $type; + + /** + * @var string description + */ + public $description; + + public $parameters; + + /** + * @var int ID + */ + public $fk_variable; + + public $update_interval; //!< Interval in mins + public $next_update; //!< Next update timestamp + public $last_status; + + /** + * @var string Name of table without prefix where object is stored + */ + public $table_element = "c_price_global_variable_updater"; + + /** + * Constructor + * + * @param DoliDb $db Database handler + */ + public function __construct($db) + { + $this->db = $db; + } + + + /** + * Create object into database + * + * @param User $user User that creates + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, Id of created object if OK + */ + public function create($user, $notrigger = 0) + { + $error = 0; + + $this->checkParameters(); + + // Insert request + $sql = "INSERT INTO ".MAIN_DB_PREFIX.$this->table_element." ("; + $sql .= "type, description, parameters, fk_variable, update_interval, next_update, last_status"; + $sql .= ") VALUES ("; + $sql .= " ".$this->type.","; + $sql .= " ".(isset($this->description) ? "'".$this->db->escape($this->description)."'" : "''").","; + $sql .= " ".(isset($this->parameters) ? "'".$this->db->escape($this->parameters)."'" : "''").","; + $sql .= " ".$this->fk_variable.","; + $sql .= " ".$this->update_interval.","; + $sql .= " ".$this->next_update.","; + $sql .= " ".(isset($this->last_status) ? "'".$this->db->escape($this->last_status)."'" : "''"); + $sql .= ")"; + + $this->db->begin(); + + dol_syslog(__METHOD__, LOG_DEBUG); + $resql = $this->db->query($sql); + if (!$resql) { $error++; $this->errors[] = "Error ".$this->db->lasterror(); } + + if (!$error) + { + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.$this->table_element); + + if (!$notrigger) + { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action calls a trigger. + + //// Call triggers + //$result=$this->call_trigger('MYOBJECT_CREATE',$user); + //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} + //// End call triggers + } + } + + // Commit or rollback + if ($error) + { + foreach ($this->errors as $errmsg) + { + dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); + $this->error .= ($this->error ? ', '.$errmsg : $errmsg); + } + $this->db->rollback(); + return -1 * $error; + } + else + { + $this->db->commit(); + return $this->id; + } + } + + + /** + * Load object in memory from the database + * + * @param int $id Id object + * @return int < 0 if KO, 0 if OK but not found, > 0 if OK + */ + public function fetch($id) + { + $sql = "SELECT type, description, parameters, fk_variable, update_interval, next_update, last_status"; + $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element; + $sql .= " WHERE rowid = ".$id; + + dol_syslog(__METHOD__); + $resql = $this->db->query($sql); + if ($resql) + { + $obj = $this->db->fetch_object($resql); + if ($obj) + { + $this->id = $id; + $this->type = $obj->type; + $this->description = $obj->description; + $this->parameters = $obj->parameters; + $this->fk_variable = $obj->fk_variable; + $this->update_interval = $obj->update_interval; + $this->next_update = $obj->next_update; + $this->last_status = $obj->last_status; + $this->checkParameters(); + return 1; + } + else + { + return 0; + } + } + else + { + $this->error = "Error ".$this->db->lasterror(); + return -1; + } + } + + /** + * Update object into database + * + * @param User $user User that modifies + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, >0 if OK + */ + public function update($user = 0, $notrigger = 0) + { + $error = 0; + + $this->checkParameters(); + + // Update request + $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET"; + $sql .= " type = ".$this->type.","; + $sql .= " description = ".(isset($this->description) ? "'".$this->db->escape($this->description)."'" : "''").","; + $sql .= " parameters = ".(isset($this->parameters) ? "'".$this->db->escape($this->parameters)."'" : "''").","; + $sql .= " fk_variable = ".$this->fk_variable.","; + $sql .= " update_interval = ".$this->update_interval.","; + $sql .= " next_update = ".$this->next_update.","; + $sql .= " last_status = ".(isset($this->last_status) ? "'".$this->db->escape($this->last_status)."'" : "''"); + $sql .= " WHERE rowid = ".$this->id; + + $this->db->begin(); + + dol_syslog(__METHOD__); + $resql = $this->db->query($sql); + if (!$resql) { $error++; $this->errors[] = "Error ".$this->db->lasterror(); } + + // if (! $error) + // { + // if (! $notrigger) + // { + // // Uncomment this and change MYOBJECT to your own tag if you + // // want this action calls a trigger. + + // //// Call triggers + // //$result=$this->call_trigger('MYOBJECT_MODIFY',$user); + // //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} + // //// End call triggers + // } + // } + + // Commit or rollback + if ($error) + { + foreach ($this->errors as $errmsg) + { + dol_syslog(get_class($this)."::update ".$errmsg, LOG_ERR); + $this->error .= ($this->error ? ', '.$errmsg : $errmsg); + } + $this->db->rollback(); + return -1 * $error; + } + else + { + $this->db->commit(); + return 1; + } + } + + /** + * Delete object in database + * + * @param int $rowid Row id of global variable + * @param User $user User that deletes + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, >0 if OK + */ + public function delete($rowid, $user, $notrigger = 0) + { + $error = 0; + + $this->db->begin(); + + //if (! $error) + //{ + // if (! $notrigger) + // { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action calls a trigger. + + //// Call triggers + //$result=$this->call_trigger('MYOBJECT_DELETE',$user); + //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} + //// End call triggers + // } + //} + + if (!$error) + { + $sql = "DELETE FROM ".MAIN_DB_PREFIX.$this->table_element; + $sql .= " WHERE rowid = ".$rowid; + + dol_syslog(__METHOD__); + $resql = $this->db->query($sql); + if (!$resql) { $error++; $this->errors[] = "Error ".$this->db->lasterror(); } + } + + // Commit or rollback + if ($error) + { + foreach ($this->errors as $errmsg) + { + dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); + $this->error .= ($this->error ? ', '.$errmsg : $errmsg); + } + $this->db->rollback(); + return -1 * $error; + } + else + { + $this->db->commit(); + return 1; + } + } + + /** + * Initialise object with example values + * Id must be 0 if object instance is a specimen + * + * @return void + */ + public function initAsSpecimen() + { + $this->id = 0; + $this->type = 0; + $this->description = ''; + $this->parameters = ''; + $this->fk_variable = 0; + $this->update_interval = 0; + $this->next_update = 0; + $this->last_status = ''; + } + + /** + * Returns the last updated time in string html format, returns "never" if its less than 1 + * + * @return string + */ + public function getLastUpdated() + { + global $langs; + $last = $this->next_update - ($this->update_interval * 60); + if ($last < 1) { + return $langs->trans("Never"); + } + $status = empty($this->last_status) ? $langs->trans("CorrectlyUpdated") : $this->last_status; + return $status.'
'.dol_print_date($last, '%d/%m/%Y %H:%M:%S'); + } + + /** + * Checks if all parameters are in order + * + * @return void + */ + public function checkParameters() + { + // Clean parameters + if (isset($this->description)) $this->description = trim($this->description); + if (isset($this->parameters)) $this->parameters = trim($this->parameters); + else $this->parameters = ""; + if (isset($this->last_status)) $this->last_status = trim($this->last_status); + + // Check parameters + if (empty($this->type) || !is_numeric($this->type) || !in_array($this->type, $this->types)) $this->type = 0; + if (empty($this->update_interval) || !is_numeric($this->update_interval) || $this->update_interval < 1) $this->update_interval = $this->update_min; + if (empty($this->next_update) || !is_numeric($this->next_update) || $this->next_update < 0) $this->next_update = 0; + } + + /** + * List all price global variables + * + * @return array Array of price global variable updaters + */ + public function listUpdaters() + { + $sql = "SELECT rowid, type, description, parameters, fk_variable, update_interval, next_update, last_status"; + $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element; + + dol_syslog(__METHOD__, LOG_DEBUG); + $resql = $this->db->query($sql); + if ($resql) + { + $retarray = array(); + + while ($record = $this->db->fetch_array($resql)) + { + $updater_obj = new PriceGlobalVariableUpdater($this->db); + $updater_obj->id = $record["rowid"]; + $updater_obj->type = $record["type"]; + $updater_obj->description = $record["description"]; + $updater_obj->parameters = $record["parameters"]; + $updater_obj->fk_variable = $record["fk_variable"]; + $updater_obj->update_interval = $record["update_interval"]; + $updater_obj->next_update = $record["next_update"]; + $updater_obj->last_status = $record["last_status"]; + $updater_obj->checkParameters(); + $retarray[] = $updater_obj; + } + + $this->db->free($resql); + return $retarray; + } + else + { + $this->error = $this->db->error(); + return -1; + } + } + + /** + * List all updaters which need to be processed + * + * @return array Array of price global variable updaters + */ + public function listPendingUpdaters() + { + $sql = "SELECT rowid, type, description, parameters, fk_variable, update_interval, next_update, last_status"; + $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element; + $sql .= " WHERE next_update < ".dol_now(); + + dol_syslog(__METHOD__, LOG_DEBUG); + $resql = $this->db->query($sql); + if ($resql) + { + $retarray = array(); + + while ($record = $this->db->fetch_array($resql)) + { + $updater_obj = new PriceGlobalVariableUpdater($this->db); + $updater_obj->id = $record["rowid"]; + $updater_obj->type = $record["type"]; + $updater_obj->description = $record["description"]; + $updater_obj->parameters = $record["parameters"]; + $updater_obj->fk_variable = $record["fk_variable"]; + $updater_obj->update_interval = $record["update_interval"]; + $updater_obj->next_update = $record["next_update"]; + $updater_obj->last_status = $record["last_status"]; + $updater_obj->checkParameters(); + $retarray[] = $updater_obj; + } + + $this->db->free($resql); + return $retarray; + } + else + { + $this->error = $this->db->error(); + return -1; + } + } + + /** + * Handles the processing of this updater + * + * @return int <0 if KO, 0 if OK but no global variable found, >0 if OK + */ + public function process() + { + global $langs, $user; + $langs->load("errors"); + dol_syslog(__METHOD__, LOG_DEBUG); + + $this->error = null; + $this->checkParameters(); + + //Try to load the target global variable and abort if fails + if ($this->fk_variable < 1) { + $this->error = $langs->trans("ErrorGlobalVariableUpdater5"); + return 0; + } + $price_globals = new PriceGlobalVariable($this->db); + $res = $price_globals->fetch($this->fk_variable); + if ($res < 1) { + $this->error = $langs->trans("ErrorGlobalVariableUpdater5"); + return 0; + } + + //Process depending of type + if ($this->type == 0 || $this->type == 1) { + //Get and check if required parameters are present + $parameters = json_decode($this->parameters, true); + if (!isset($parameters)) { + $this->error = $langs->trans("ErrorGlobalVariableUpdater1", $this->parameters); + return -1; + } + $url = $parameters['URL']; + if (!isset($url)) { + $this->error = $langs->trans("ErrorGlobalVariableUpdater2", 'URL'); + return -1; + } + $value = $parameters['VALUE']; + if (!isset($value)) { + $this->error = $langs->trans("ErrorGlobalVariableUpdater2", 'VALUE'); + return -1; + } + $result = ""; + if ($this->type == 0) { + // Call JSON request + include_once DOL_DOCUMENT_ROOT.'/core/lib/geturl.lib.php'; + $tmpresult = getURLContent($url); + $code = $tmpresult['http_code']; + $result = $tmpresult['content']; + + if (!isset($result)) { + $this->error = $langs->trans("ErrorGlobalVariableUpdater0", "empty response"); + return -1; + } + if ($code !== 200) { + $this->error = $langs->trans("ErrorGlobalVariableUpdater0", $code.' '.$tmpresult['curl_error_msg']); + return -1; + } + + //Decode returned response + $result = json_decode($result, true); + } elseif ($this->type == 1) { + $ns = $parameters['NS']; + if (!isset($ns)) { + $this->error = $langs->trans("ErrorGlobalVariableUpdater2", 'NS'); + return -1; + } + $method = $parameters['METHOD']; + if (!isset($method)) { + $this->error = $langs->trans("ErrorGlobalVariableUpdater2", 'METHOD'); + return -1; + } + $data = $parameters['DATA']; + if (!isset($data)) { + $this->error = $langs->trans("ErrorGlobalVariableUpdater2", 'DATA'); + return -1; + } + + //SOAP client + require_once NUSOAP_PATH.'/nusoap.php'; + $soap_client = new nusoap_client($url); + $soap_client->soap_defencoding = 'UTF-8'; + $soap_client->decodeUTF8(false); + $result = $soap_client->call($method, $data, $ns, ''); + + //Check if result is a error + if ($result === false) { + $this->error = $langs->trans("ErrorGlobalVariableUpdater4", $soap_client->error_str); + return -1; + } + } + + //Explode value and walk for each key in value array to get the relevant key + $value = explode(',', $value); + foreach ($value as $key) { + $result = $result[$key]; + } + if (!isset($result)) { + $this->error = $langs->trans("ErrorGlobalVariableUpdater3"); + return -1; + } + + //Save data to global and update it + $price_globals->value = $result; + $price_globals->update($user); + } + return 1; + } + + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + /** + * Update next_update into database + * + * @param string $next_update Next update to write + * @param User $user User that modifies + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, >0 if OK + */ + public function update_next_update($next_update, $user = 0, $notrigger = 0) + { + // phpcs:enable + $error = 0; + + $this->next_update = $next_update; + $this->checkParameters(); + + // Update request + $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET"; + $sql .= " next_update = ".$this->next_update; + $sql .= " WHERE rowid = ".$this->id; + + $this->db->begin(); + + dol_syslog(__METHOD__); + $resql = $this->db->query($sql); + if (!$resql) { $error++; $this->errors[] = "Error ".$this->db->lasterror(); } + + // Commit or rollback + if ($error) + { + foreach ($this->errors as $errmsg) + { + dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); + $this->error .= ($this->error ? ', '.$errmsg : $errmsg); + } + $this->db->rollback(); + return -1 * $error; + } + else + { + $this->db->commit(); + return 1; + } + } + + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + /** + * Update last_status into database + * + * @param string $last_status Status to write + * @param User $user User that modifies + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, >0 if OK + */ + public function update_status($last_status, $user = 0, $notrigger = 0) + { + // phpcs:enable + $error = 0; + + $this->last_status = $last_status; + $this->checkParameters(); + + // Update request + $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET"; + $sql .= " last_status = ".(isset($this->last_status) ? "'".$this->db->escape($this->last_status)."'" : "''"); + $sql .= " WHERE rowid = ".$this->id; + + $this->db->begin(); + + dol_syslog(__METHOD__); + $resql = $this->db->query($sql); + if (!$resql) { $error++; $this->errors[] = "Error ".$this->db->lasterror(); } + + // Commit or rollback + if ($error) + { + foreach ($this->errors as $errmsg) + { + dol_syslog(__METHOD__." ".$errmsg, LOG_ERR); + $this->error .= ($this->error ? ', '.$errmsg : $errmsg); + } + $this->db->rollback(); + return -1 * $error; + } + else + { + $this->db->commit(); + return 1; + } + } --- /tmp/dsg/dolibarr/htdocs/product/dynamic_price/class/github_19.0.3_price_parser.class.php +++ /tmp/dsg/dolibarr/htdocs/product/dynamic_price/class/client_price_parser.class.php @@ -35,130 +35,137 @@ - protected $db; - // Limit of expressions per price - public $limit = 100; - // The error that occurred when parsing price - public $error_parser; - // The expression that caused the error - public $error_expr; - //The special char - public $special_chr = "#"; - //The separator char - public $separator_chr = ";"; - - /** - * Constructor - * - * @param DoliDB $db Database handler - */ - public function __construct($db) - { - $this->db = $db; - } - - /** - * Returns translated error - * - * @return string Translated error - */ - public function translatedError() - { - global $langs; - $langs->load("errors"); - /* - -No arg - 9, an unexpected error occured - 14, division by zero - 19, expression not found - 20, empty expression - - -1 Arg - 1, cannot assign to constant '%s' - 2, cannot redefine built-in function '%s' - 3, undefined variable '%s' in function definition - 4, illegal character '%s' - 5, unexpected '%s' - 8, unexpected operator '%s' - 10, operator '%s' lacks operand - 11, expecting '%s' - 17, undefined variable '%s' - 21, empty result '%s' - 22, negative result '%s' - 24, variable '%s' exists but has no value - - -2 Args - 6, wrong number of arguments (%s given, %s expected) - 23, unknown or non set variable '%s' after %s - - -internal errors - 7, internal error - 12, internal error - 13, internal error - 15, internal error - 16, internal error - 18, internal error - */ - if (empty($this->error_parser)) { - return $langs->trans("ErrorPriceExpressionUnknown", 0); //this is not supposed to happen - } - list($code, $info) = $this->error_parser; - if (in_array($code, array(9, 14, 19, 20))) { //Errors which have 0 arg - return $langs->trans("ErrorPriceExpression".$code); - } elseif (in_array($code, array(1, 2, 3, 4, 5, 8, 10, 11, 17, 21, 22))) { //Errors which have 1 arg - return $langs->trans("ErrorPriceExpression".$code, $info); - } elseif (in_array($code, array(6, 23))) { //Errors which have 2 args - return $langs->trans("ErrorPriceExpression".$code, $info[0], $info[1]); - } elseif (in_array($code, array(7, 12, 13, 15, 16, 18))) { //Internal errors - return $langs->trans("ErrorPriceExpressionInternal", $code); - } else { //Unknown errors - return $langs->trans("ErrorPriceExpressionUnknown", $code); - } - } - - /** - * Calculates price based on expression - * - * @param Product $product The Product object to get information - * @param String $expression The expression to parse - * @param array $values Strings to replaces - * @return int > 0 if OK, < 1 if KO - */ - public function parseExpression($product, $expression, $values) - { - global $user, $hookmanager, $extrafields; - - $action = 'PARSEEXPRESSION'; - if ($reshook = $hookmanager->executeHooks('doDynamiPrice', array( - 'expression' => &$expression, - 'product' => &$product, - 'values' => &$values - ), $this, $action)) { - return $hookmanager->resArray['return']; - } - //Check if empty - $expression = trim($expression); - if (empty($expression)) { - $this->error_parser = array(20, null); - return -2; - } - - //Accessible product values by expressions - $values = array_merge($values, array( - "tva_tx" => $product->tva_tx, - "localtax1_tx" => $product->localtax1_tx, - "localtax2_tx" => $product->localtax2_tx, - "weight" => $product->weight, - "length" => $product->length, - "surface" => $product->surface, - "price_min" => $product->price_min, - "cost_price" => $product->cost_price, - "pmp" => $product->pmp, - )); - - // Retrieve all extrafields if not already not know (should not happen) - if (! is_object($extrafields)) { - $extrafields = new ExtraFields($this->db); - $extrafields->fetch_name_optionals_label($product->table_element); - } - - $product->fetch_optionals(); - if (is_array($extrafields->attributes[$product->table_element]['label'])) { - foreach ($extrafields->attributes[$product->table_element]['label'] as $key => $label) { + protected $db; + // Limit of expressions per price + public $limit = 100; + // The error that occurred when parsing price + public $error_parser; + // The expression that caused the error + public $error_expr; + //The special char + public $special_chr = "#"; + //The separator char + public $separator_chr = ";"; + + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + public function __construct($db) + { + $this->db = $db; + } + + /** + * Returns translated error + * + * @return string Translated error + */ + public function translatedError() + { + global $langs; + $langs->load("errors"); + /* + -No arg + 9, an unexpected error occured + 14, division by zero + 19, expression not found + 20, empty expression + + -1 Arg + 1, cannot assign to constant '%s' + 2, cannot redefine built-in function '%s' + 3, undefined variable '%s' in function definition + 4, illegal character '%s' + 5, unexpected '%s' + 8, unexpected operator '%s' + 10, operator '%s' lacks operand + 11, expecting '%s' + 17, undefined variable '%s' + 21, empty result '%s' + 22, negative result '%s' + 24, variable '%s' exists but has no value + + -2 Args + 6, wrong number of arguments (%s given, %s expected) + 23, unknown or non set variable '%s' after %s + + -internal errors + 7, internal error + 12, internal error + 13, internal error + 15, internal error + 16, internal error + 18, internal error + */ + if (empty($this->error_parser)) { + return $langs->trans("ErrorPriceExpressionUnknown", 0); //this is not supposed to happen + } + list($code, $info) = $this->error_parser; + if (in_array($code, array(9, 14, 19, 20))) //Errors which have 0 arg + { + return $langs->trans("ErrorPriceExpression".$code); + } + elseif (in_array($code, array(1, 2, 3, 4, 5, 8, 10, 11, 17, 21, 22))) //Errors which have 1 arg + { + return $langs->trans("ErrorPriceExpression".$code, $info); + } + elseif (in_array($code, array(6, 23))) //Errors which have 2 args + { + return $langs->trans("ErrorPriceExpression".$code, $info[0], $info[1]); + } + elseif (in_array($code, array(7, 12, 13, 15, 16, 18))) //Internal errors + { + return $langs->trans("ErrorPriceExpressionInternal", $code); + } + else //Unknown errors + { + return $langs->trans("ErrorPriceExpressionUnknown", $code); + } + } + + /** + * Calculates price based on expression + * + * @param Product $product The Product object to get information + * @param String $expression The expression to parse + * @param array $values Strings to replaces + * @return int > 0 if OK, < 1 if KO + */ + public function parseExpression($product, $expression, $values) + { + global $user; + global $hookmanager; + $action = 'PARSEEXPRESSION'; + if ($result = $hookmanager->executeHooks('doDynamiPrice', array( + 'expression' =>$expression, + 'product' => $product, + 'values' => $values + ), $this, $action)) { + return $result; + } + //Check if empty + $expression = trim($expression); + if (empty($expression)) + { + $this->error_parser = array(20, null); + return -2; + } + + //Accessible product values by expressions + $values = array_merge($values, array( + "tva_tx" => $product->tva_tx, + "localtax1_tx" => $product->localtax1_tx, + "localtax2_tx" => $product->localtax2_tx, + "weight" => $product->weight, + "length" => $product->length, + "surface" => $product->surface, + "price_min" => $product->price_min, + )); + + //Retrieve all extrafield for product and add it to values + $extrafields = new ExtraFields($this->db); + $extrafields->fetch_name_optionals_label('product', true); + $product->fetch_optionals(); + if (is_array($extrafields->attributes[$product->table_element]['label'])) + { + foreach ($extrafields->attributes[$product->table_element]['label'] as $key=>$label) + { @@ -169,92 +176,96 @@ - //Process any pending updaters - $price_updaters = new PriceGlobalVariableUpdater($this->db); - foreach ($price_updaters->listPendingUpdaters() as $entry) { - //Schedule the next update by adding current timestamp (secs) + interval (mins) - $entry->update_next_update(dol_now() + ($entry->update_interval * 60), $user); - //Do processing - $res = $entry->process(); - //Store any error or clear status if OK - $entry->update_status($res < 1 ? $entry->error : '', $user); - } - - //Get all global values - $price_globals = new PriceGlobalVariable($this->db); - foreach ($price_globals->listGlobalVariables() as $entry) { - $values["global_".$entry->code] = $entry->value; - } - - //Remove internal variables - unset($values["supplier_id"]); - - //Prepare the lib, parameters and values - $em = new EvalMath(); - $em->suppress_errors = true; //Don't print errors on page - $this->error_expr = null; - $last_result = null; - - //Fill each variable in expression from values - $expression = str_replace("\n", $this->separator_chr, $expression); - foreach ($values as $key => $value) { - if ($value === null && strpos($expression, $key) !== false) { - $this->error_parser = array(24, $key); - return -7; - } - $expression = str_replace($this->special_chr.$key.$this->special_chr, strval($value), $expression); - } - - //Check if there is unfilled variable - if (strpos($expression, $this->special_chr) !== false) { - $data = explode($this->special_chr, $expression); - $variable = $this->special_chr.$data[1]; - if (isset($data[2])) { - $variable .= $this->special_chr; - } - $this->error_parser = array(23, array($variable, $expression)); - return -6; - } - - //Iterate over each expression splitted by $separator_chr - $expressions = explode($this->separator_chr, $expression); - $expressions = array_slice($expressions, 0, $this->limit); - foreach ($expressions as $expr) { - $expr = trim($expr); - if (!empty($expr)) { - $last_result = $em->evaluate($expr); - $this->error_parser = $em->last_error_code; - if ($this->error_parser !== null) { //$em->last_error_code is null if no error happened, so just check if error_parser is not null - $this->error_expr = $expr; - return -3; - } - } - } - $vars = $em->vars(); - if (empty($vars["price"])) { - $vars["price"] = $last_result; - } - if (!isset($vars["price"])) { - $this->error_parser = array(21, $expression); - return -4; - } - if ($vars["price"] < 0) { - $this->error_parser = array(22, $expression); - return -5; - } - return $vars["price"]; - } - - /** - * 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 - */ - public function parseProduct($product, $extra_values = array()) - { - //Get the expression from db - $price_expression = new PriceExpression($this->db); - $res = $price_expression->fetch($product->fk_price_expression); - if ($res < 1) { - $this->error_parser = array(19, null); - return -1; - } + //Process any pending updaters + $price_updaters = new PriceGlobalVariableUpdater($this->db); + foreach ($price_updaters->listPendingUpdaters() as $entry) { + //Schedule the next update by adding current timestamp (secs) + interval (mins) + $entry->update_next_update(dol_now() + ($entry->update_interval * 60), $user); + //Do processing + $res = $entry->process(); + //Store any error or clear status if OK + $entry->update_status($res < 1 ? $entry->error : '', $user); + } + + //Get all global values + $price_globals = new PriceGlobalVariable($this->db); + foreach ($price_globals->listGlobalVariables() as $entry) + { + $values["global_".$entry->code] = $entry->value; + } + + //Remove internal variables + unset($values["supplier_id"]); + + //Prepare the lib, parameters and values + $em = new EvalMath(); + $em->suppress_errors = true; //Don't print errors on page + $this->error_expr = null; + $last_result = null; + + //Fill each variable in expression from values + $expression = str_replace("\n", $this->separator_chr, $expression); + foreach ($values as $key => $value) + { + if ($value === null && strpos($expression, $key) !== false) { + $this->error_parser = array(24, $key); + return -7; + } + $expression = str_replace($this->special_chr.$key.$this->special_chr, strval($value), $expression); + } + + //Check if there is unfilled variable + if (strpos($expression, $this->special_chr) !== false) + { + $data = explode($this->special_chr, $expression); + $variable = $this->special_chr.$data[1]; + if (isset($data[2])) $variable .= $this->special_chr; + $this->error_parser = array(23, array($variable, $expression)); + return -6; + } + + //Iterate over each expression splitted by $separator_chr + $expressions = explode($this->separator_chr, $expression); + $expressions = array_slice($expressions, 0, $this->limit); + foreach ($expressions as $expr) { + $expr = trim($expr); + if (!empty($expr)) + { + $last_result = $em->evaluate($expr); + $this->error_parser = $em->last_error_code; + if ($this->error_parser !== null) { //$em->last_error_code is null if no error happened, so just check if error_parser is not null + $this->error_expr = $expr; + return -3; + } + } + } + $vars = $em->vars(); + if (empty($vars["price"])) { + $vars["price"] = $last_result; + } + if (!isset($vars["price"])) + { + $this->error_parser = array(21, $expression); + return -4; + } + if ($vars["price"] < 0) + { + $this->error_parser = array(22, $expression); + return -5; + } + return $vars["price"]; + } + + /** + * 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 + */ + public function parseProduct($product, $extra_values = array()) + { + //Get the expression from db + $price_expression = new PriceExpression($this->db); + $res = $price_expression->fetch($product->fk_price_expression); + if ($res < 1) { + $this->error_parser = array(19, null); + return -1; + } @@ -268 +279 @@ - } elseif ($res == 0) { + } elseif ($res == 0) { @@ -270 +280,0 @@ - $supplier_min_price_with_discount = 0; @@ -272,2 +282 @@ - $supplier_min_price = $productFournisseur->fourn_unitprice; - $supplier_min_price_with_discount = $productFournisseur->fourn_unitprice_with_discount; + $supplier_min_price = $productFournisseur->fourn_unitprice; @@ -276 +285 @@ - //Accessible values by expressions + //Accessible values by expressions @@ -279 +287,0 @@ - "supplier_min_price_with_discount" => $supplier_min_price_with_discount, @@ -292,57 +300,57 @@ - /** - * Calculates supplier product price based on product supplier price and associated 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_supplier, $extra_values = array()) - { - //Get the expression from db - $price_expression = new PriceExpression($this->db); - $res = $price_expression->fetch($product_supplier->fk_supplier_price_expression); - if ($res < 1) { - $this->error_parser = 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->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, - "supplier_min_price_with_discount" => 2, - )); - - //Values for supplier product expressions - $extra_values = array_merge($extra_values, array( - "supplier_quantity" => 3, - "supplier_tva_tx" => 4, - )); - return $this->parseExpression($product, $expression, $extra_values); - } + /** + * Calculates supplier product price based on product supplier price and associated 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_supplier, $extra_values = array()) + { + //Get the expression from db + $price_expression = new PriceExpression($this->db); + $res = $price_expression->fetch($product_supplier->fk_supplier_price_expression); + if ($res < 1) + { + $this->error_parser = 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->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); + }