diff --git a/htdocs/api/class/api_setup.class.php b/htdocs/api/class/api_setup.class.php index ca9f3d97ce6..75edc096ac9 100644 --- a/htdocs/api/class/api_setup.class.php +++ b/htdocs/api/class/api_setup.class.php @@ -25,6 +25,7 @@ use Luracast\Restler\RestException; require_once DOL_DOCUMENT_ROOT.'/main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/cstate.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/cregion.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/ccountry.class.php'; require_once DOL_DOCUMENT_ROOT.'/hrm/class/establishment.class.php'; @@ -236,6 +237,107 @@ class Setup extends DolibarrApi return $list; } + /** + * Get the list of regions. + * + * The returned list is sorted by region ID. + * + * @param string $sortfield Sort field + * @param string $sortorder Sort order + * @param int $limit Number of items per page + * @param int $page Page number (starting from zero) + * @param int $country To filter on country + * @param string $filter To filter the regions by name + * @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.code:like:'A%') and (t.active:>=:0)" + * @return array List of regions + * + * @url GET dictionary/regions + * + * @throws RestException + */ + public function getListOfRegions($sortfield = "code_region", $sortorder = 'ASC', $limit = 100, $page = 0, $country = 0, $filter = '', $sqlfilters = '') + { + $list = array(); + + // Note: The filter is not applied in the SQL request because it must + // be applied to the translated names, not to the names in database. + $sql = "SELECT t.rowid FROM ".MAIN_DB_PREFIX."c_regions as t"; + $sql .= " WHERE 1 = 1"; + if ($country) { + $sql .= " AND t.fk_pays = ".((int) $country); + } + // Add sql filters + if ($sqlfilters) { + $errormessage = ''; + if (!DolibarrApi::_checkFilters($sqlfilters, $errormessage)) { + throw new RestException(400, 'Error when validating parameter sqlfilters -> '.$errormessage); + } + $regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^\(\)]+)\)'; + $sql .= " AND (".preg_replace_callback('/'.$regexstring.'/', 'DolibarrApi::_forge_criteria_callback', $sqlfilters).")"; + } + + $sql .= $this->db->order($sortfield, $sortorder); + + if ($limit) { + if ($page < 0) { + $page = 0; + } + $offset = $limit * $page; + + $sql .= $this->db->plimit($limit, $offset); + } + + $result = $this->db->query($sql); + + if ($result) { + $num = $this->db->num_rows($result); + $min = min($num, ($limit <= 0 ? $num : $limit)); + for ($i = 0; $i < $min; $i++) { + $obj = $this->db->fetch_object($result); + $region = new Cregion($this->db); + if ($region->fetch($obj->rowid) > 0) { + if (empty($filter) || stripos($region->name, $filter) !== false) { + $list[] = $this->_cleanObjectDatas($region); + } + } + } + } else { + throw new RestException(503, 'Error when retrieving list of regions'); + } + + return $list; + } + + /** + * Get region by ID. + * + * @param int $id ID of region + * @return array Array of cleaned object properties + * + * @url GET dictionary/regions/{id} + * + * @throws RestException + */ + public function getRegionByID($id) + { + return $this->_fetchCregion($id, ''); + } + + /** + * Get region by Code. + * + * @param string $code Code of region + * @return array Array of cleaned object properties + * + * @url GET dictionary/regions/byCode/{code} + * + * @throws RestException + */ + public function getRegionByCode($code) + { + return $this->_fetchCregion('', $code); + } + /** * Get the list of states/provinces. * @@ -464,6 +566,29 @@ class Setup extends DolibarrApi return $this->_fetchCcountry('', '', $iso, $lang); } + /** + * Get region. + * + * @param int $id ID of region + * @param string $code Code of region + * @return array Array of cleaned object properties + * + * @throws RestException + */ + private function _fetchCregion($id, $code = '') + { + $region = new Cregion($this->db); + + $result = $region->fetch($id, $code); + if ($result < 0) { + throw new RestException(503, 'Error when retrieving region : '.$region->error); + } elseif ($result == 0) { + throw new RestException(404, 'Region not found'); + } + + return $this->_cleanObjectDatas($region); + } + /** * Get state. * diff --git a/htdocs/core/class/cregion.class.php b/htdocs/core/class/cregion.class.php new file mode 100644 index 00000000000..72e4a89ff1b --- /dev/null +++ b/htdocs/core/class/cregion.class.php @@ -0,0 +1,327 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/core/class/cregion.class.php + * \ingroup core + * \brief This file is a CRUD class file (Create/Read/Update/Delete) for c_regions dictionary + */ + +/** + * Class to manage dictionary Regions + */ +class Cregion +{ + /** + * @var DoliDB Database handler. + */ + public $db; + + /** + * @var string Error code (or message) + */ + public $error = ''; + + /** + * @var string[] Error codes (or messages) + */ + public $errors = array(); + + //public $element = 'cregion'; //!< Id that identify managed objects + //public $table_element = 'c_regions'; //!< Name of table without prefix where object is stored + + /** + * @var int ID + */ + public $id; + + public $code_region; + public $fk_pays; + + /** + * @var string Region name + */ + public $name; + + /** + * @var string Region chef lieu + */ + public $cheflieu; + + public $active; + + /** + * Constructor + * + * @param DoliDb $db Database handler + */ + public function __construct($db) + { + $this->db = $db; + } + + + /** + * Create object into database + * + * @param User $user User that create + * @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) + { + global $conf, $langs; + $error = 0; + + // Clean parameters + if (isset($this->code_region)) { + $this->code_region = trim($this->code_region); + } + if (isset($this->fk_pays)) { + $this->fk_pays = trim($this->fk_pays); + } + if (isset($this->nom)) { + $this->nom = trim($this->nom); + } + if (isset($this->cheflieu)) { + $this->cheflieu = trim($this->cheflieu); + } + if (isset($this->active)) { + $this->active = trim($this->active); + } + + // Check parameters + // Put here code to add control on parameters values + + // Insert request + $sql = "INSERT INTO ".$this->db->prefix()."c_regions("; + $sql .= "rowid,"; + $sql .= "code_region,"; + $sql .= "fk_pays,"; + $sql .= "nom,"; + $sql .= "cheflieu,"; + $sql .= "active"; + $sql .= ") VALUES ("; + $sql .= " ".(!isset($this->rowid) ? 'NULL' : "'".$this->db->escape($this->rowid)."'").","; + $sql .= " ".(!isset($this->code_region) ? 'NULL' : "'".$this->db->escape($this->code_region)."'").","; + $sql .= " ".(!isset($this->fk_pays) ? 'NULL' : "'".$this->db->escape($this->fk_pays)."'").","; + $sql .= " ".(!isset($this->name) ? 'NULL' : "'".$this->db->escape($this->name)."'").","; + $sql .= " ".(!isset($this->cheflieu) ? 'NULL' : "'".$this->db->escape($this->cheflieu)."'").","; + $sql .= " ".(!isset($this->active) ? 'NULL' : "'".$this->db->escape($this->active)."'").""; + $sql .= ")"; + + $this->db->begin(); + + dol_syslog(get_class($this)."::create", 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()."c_regions"); + } + + // Commit or rollback + if ($error) { + foreach ($this->errors as $errmsg) { + dol_syslog(get_class($this)."::create ".$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 database + * + * @param int $id Id object + * @param string $code_region Code + * @param string $fk_pays Country Id + * @return int >0 if OK, 0 if not found, <0 if KO + */ + public function fetch($id, $code_region = '', $fk_pays = '') + { + $sql = "SELECT"; + $sql .= " t.rowid,"; + $sql .= " t.code_region,"; + $sql .= " t.fk_pays,"; + $sql .= " t.nom,"; + $sql .= " t.cheflieu,"; + $sql .= " t.active"; + $sql .= " FROM ".$this->db->prefix()."c_regions as t"; + if ($id) { + $sql .= " WHERE t.rowid = ".((int) $id); + } elseif ($code_region) { + $sql .= " WHERE t.code_region = '".$this->db->escape(strtoupper($code_region))."'"; + } elseif ($fk_pays) { + $sql .= " WHERE t.fk_pays = '".$this->db->escape(strtoupper($fk_pays))."'"; + } + + dol_syslog(get_class($this)."::fetch", LOG_DEBUG); + $resql = $this->db->query($sql); + if ($resql) { + if ($this->db->num_rows($resql)) { + $obj = $this->db->fetch_object($resql); + + if ($obj) { + $this->id = $obj->rowid; + $this->code_region = $obj->code_region; + $this->fk_pays = $obj->fk_pays; + $this->name = $obj->nom; + $this->cheflieu = $obj->cheflieu; + $this->active = $obj->active; + } + + $this->db->free($resql); + return 1; + } else { + return 0; + } + } else { + $this->error = "Error ".$this->db->lasterror(); + return -1; + } + } + + + /** + * Update object into database + * + * @param User $user User that modify + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, >0 if OK + */ + public function update($user = null, $notrigger = 0) + { + global $conf, $langs; + $error = 0; + + // Clean parameters + if (isset($this->code_region)) { + $this->code_region = trim($this->code_region); + } + if (isset($this->fk_pays)) { + $this->fk_pays = trim($this->fk_pays); + } + if (isset($this->name)) { + $this->name = trim($this->name); + } + if (isset($this->cheflieu)) { + $this->cheflieu = trim($this->cheflieu); + } + if (isset($this->active)) { + $this->active = trim($this->active); + } + + + // Check parameters + // Put here code to add control on parameters values + + // Update request + $sql = "UPDATE ".$this->db->prefix()."c_regions SET"; + $sql .= " code_region=".(isset($this->code_region) ? "'".$this->db->escape($this->code_region)."'" : "null").","; + $sql .= " fk_pays=".(isset($this->fk_pays) ? "'".$this->db->escape($this->fk_pays)."'" : "null").","; + $sql .= " nom=".(isset($this->name) ? "'".$this->db->escape($this->name)."'" : "null").","; + $sql .= " cheflieu=".(isset($this->cheflieu) ? "'".$this->db->escape($this->cheflieu)."'" : "null").","; + $sql .= " active=".(isset($this->active) ? $this->active : "null").""; + $sql .= " WHERE rowid=".((int) $this->id); + + $this->db->begin(); + + dol_syslog(get_class($this)."::update", LOG_DEBUG); + $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(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 User $user User that delete + * @param int $notrigger 0=launch triggers after, 1=disable triggers + * @return int <0 if KO, >0 if OK + */ + public function delete($user, $notrigger = 0) + { + global $conf, $langs; + $error = 0; + + $sql = "DELETE FROM ".$this->db->prefix()."c_regions"; + $sql .= " WHERE rowid=".((int) $this->id); + + $this->db->begin(); + + dol_syslog(get_class($this)."::delete", LOG_DEBUG); + $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(get_class($this)."::delete ".$errmsg, LOG_ERR); + $this->error .= ($this->error ? ', '.$errmsg : $errmsg); + } + $this->db->rollback(); + return -1 * $error; + } else { + $this->db->commit(); + return 1; + } + } + + /** + * Return a link to the object card (with optionaly the picto) + * + * @param int $withpicto Include picto in link (0=No picto, 1=Include picto into link, 2=Only picto) + * @param string $option On what the link point to ('nolink', ...) + * @param int $notooltip 1=Disable tooltip + * @param string $morecss Add more css on link + * @param int $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking + * @return string String with URL + */ + public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1) + { + global $langs; + return $langs->trans($this->name); + } +}