diff --git a/htdocs/adherents/class/api_members.class.php b/htdocs/adherents/class/api_members.class.php index d551f6b5af9..7603a19b3c2 100644 --- a/htdocs/adherents/class/api_members.class.php +++ b/htdocs/adherents/class/api_members.class.php @@ -24,6 +24,7 @@ require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php'; require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; +require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php'; /** * API class for members @@ -452,18 +453,63 @@ class Members extends DolibarrApi $object = parent::_cleanObjectDatas($object); // Remove the subscriptions because they are handled as a subresource. - unset($object->subscriptions); - unset($object->fk_incoterms); - unset($object->label_incoterms); - unset($object->location_incoterms); - unset($object->fk_delivery_address); - unset($object->shipping_method_id); + if ($object instanceof Adherent) { + unset($object->subscriptions); + unset($object->fk_incoterms); + unset($object->label_incoterms); + unset($object->location_incoterms); + unset($object->fk_delivery_address); + unset($object->shipping_method_id); - unset($object->total_ht); - unset($object->total_ttc); - unset($object->total_tva); - unset($object->total_localtax1); - unset($object->total_localtax2); + unset($object->total_ht); + unset($object->total_ttc); + unset($object->total_tva); + unset($object->total_localtax1); + unset($object->total_localtax2); + } + + if ($object instanceof AdherentType) { + unset($object->array_options); + unset($object->linkedObjectsIds); + unset($object->context); + unset($object->canvas); + unset($object->fk_project); + unset($object->contact); + unset($object->contact_id); + unset($object->thirdparty); + unset($object->user); + unset($object->origin); + unset($object->origin_id); + unset($object->ref_ext); + unset($object->country); + unset($object->country_id); + unset($object->country_code); + unset($object->barcode_type); + unset($object->barcode_type_code); + unset($object->barcode_type_label); + unset($object->barcode_type_coder); + unset($object->mode_reglement_id); + unset($object->cond_reglement_id); + unset($object->cond_reglement); + unset($object->fk_delivery_address); + unset($object->shipping_method_id); + unset($object->model_pdf); + unset($object->fk_account); + unset($object->note_public); + unset($object->note_private); + unset($object->fk_incoterms); + unset($object->label_incoterms); + unset($object->location_incoterms); + unset($object->name); + unset($object->lastname); + unset($object->firstname); + unset($object->civility_id); + unset($object->total_ht); + unset($object->total_tva); + unset($object->total_localtax1); + unset($object->total_localtax2); + unset($object->total_ttc); + } return $object; } @@ -565,4 +611,257 @@ class Members extends DolibarrApi return $result; } + + + + + /** + * Get properties of a member type object + * + * Return an array with member type information + * + * @param int $id ID of member type + * @return Object Object with cleaned properties + * + * @url GET /types/{id} + * + * @throws RestException 403 Access denied + * @throws RestException 404 No Member Type found + */ + public function getType($id) + { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'lire')) { + throw new RestException(403); + } + + $membertype = new AdherentType($this->db); + $result = $membertype->fetch($id); + if (!$result) { + throw new RestException(404, 'member type not found'); + } + + if (!DolibarrApi::_checkAccessToResource('member', $membertype->id, 'adherent_type')) { + throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); + } + + return $this->_cleanObjectDatas($membertype); + } + + /** + * List members types + * + * Get a list of members types + * + * @param string $sortfield Sort field + * @param string $sortorder Sort order + * @param int $limit Limit for list + * @param int $page Page number + * @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.libelle:like:'SO-%') and (t.subscription:=:'1')" + * @param string $properties Restrict the data returned to these properties. Ignored if empty. Comma separated list of properties names + * @return array Array of member type objects + * + * @url GET /types/ + * + * @throws RestException 403 Access denied + * @throws RestException 404 No Member Type found + * @throws RestException 503 Error when retrieving Member list + */ + public function indexType($sortfield = "t.rowid", $sortorder = 'ASC', $limit = 100, $page = 0, $sqlfilters = '', $properties = '') + { + $obj_ret = array(); + + if (!DolibarrApiAccess::$user->hasRight('adherent', 'lire')) { + throw new RestException(403); + } + + $sql = "SELECT t.rowid"; + $sql .= " FROM ".MAIN_DB_PREFIX."adherent_type AS t LEFT JOIN ".MAIN_DB_PREFIX."adherent_type_extrafields AS ef ON (ef.fk_object = t.rowid)"; // Modification VMR Global Solutions to include extrafields as search parameters in the API GET call, so we will be able to filter on extrafields + $sql .= ' WHERE t.entity IN ('.getEntity('member_type').')'; + + // Add sql filters + if ($sqlfilters) { + $errormessage = ''; + $sql .= forgeSQLFromUniversalSearchCriteria($sqlfilters, $errormessage); + if ($errormessage) { + throw new RestException(503, 'Error when validating parameter sqlfilters -> '.$errormessage); + } + } + + $sql .= $this->db->order($sortfield, $sortorder); + if ($limit) { + if ($page < 0) { + $page = 0; + } + $offset = $limit * $page; + + $sql .= $this->db->plimit($limit + 1, $offset); + } + + $result = $this->db->query($sql); + if ($result) { + $i = 0; + $num = $this->db->num_rows($result); + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { + $obj = $this->db->fetch_object($result); + $membertype = new AdherentType($this->db); + if ($membertype->fetch($obj->rowid)) { + $obj_ret[] = $this->_filterObjectProperties($this->_cleanObjectDatas($membertype), $properties); + } + $i++; + } + } else { + throw new RestException(503, 'Error when retrieve member type list : '.$this->db->lasterror()); + } + + return $obj_ret; + } + + /** + * Create member type object + * + * @param array $request_data Request data + * @return int ID of member type + * + * @url POST /types/{id} + * + * @throws RestException 403 Access denied + * @throws RestException 500 Error when creating Member Type + */ + public function postType($request_data = null) + { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'configurer')) { + throw new RestException(403); + } + // Check mandatory fields + $result = $this->_validateType($request_data); + + $membertype = new AdherentType($this->db); + foreach ($request_data as $field => $value) { + if ($field === 'caller') { + // Add a mention of caller so on trigger called after action, we can filter to avoid a loop if we try to sync back again with the caller + $membertype->context['caller'] = $request_data['caller']; + continue; + } + + $membertype->$field = $value; + } + if ($membertype->create(DolibarrApiAccess::$user) < 0) { + throw new RestException(500, 'Error creating member type', array_merge(array($membertype->error), $membertype->errors)); + } + return $membertype->id; + } + + /** + * Update member type + * + * @param int $id ID of member type to update + * @param array $request_data Datas + * @return Object Updated object + * + * @url PUT /types/{id} + * + * @throws RestException 403 Access denied + * @throws RestException 404 No Member Type found + * @throws RestException 500 Error when updating Member Type + */ + public function putType($id, $request_data = null) + { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'configurer')) { + throw new RestException(403); + } + + $membertype = new AdherentType($this->db); + $result = $membertype->fetch($id); + if (!$result) { + throw new RestException(404, 'member type not found'); + } + + if (!DolibarrApi::_checkAccessToResource('member', $membertype->id, 'adherent_type')) { + throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); + } + + foreach ($request_data as $field => $value) { + if ($field == 'id') { + continue; + } + if ($field === 'caller') { + // Add a mention of caller so on trigger called after action, we can filter to avoid a loop if we try to sync back again with the caller + $membertype->context['caller'] = $request_data['caller']; + continue; + } + + // Process the status separately because it must be updated using + // the validate(), resiliate() and exclude() methods of the class AdherentType. + $membertype->$field = $value; + } + + // If there is no error, update() returns the number of affected rows + // so if the update is a no op, the return value is zero. + if ($membertype->update(DolibarrApiAccess::$user) >= 0) { + return $this->get($id); + } else { + throw new RestException(500, 'Error when updating member type: '.$membertype->error); + } + } + + /** + * Delete member type + * + * @param int $id member type ID + * @return array + * + * @url GET /types/{id} + * + * @throws RestException 403 Access denied + * @throws RestException 404 No Member Type found + * @throws RestException 500 Error when deleting Member Type + */ + public function deleteType($id) + { + if (!DolibarrApiAccess::$user->hasRight('adherent', 'configurer')) { + throw new RestException(403); + } + $membertype = new AdherentType($this->db); + $result = $membertype->fetch($id); + if (!$result) { + throw new RestException(404, 'member type not found'); + } + + if (!DolibarrApi::_checkAccessToResource('member', $membertype->id, 'adherent_type')) { + throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); + } + + $res = $membertype->delete(DolibarrApiAccess::$user); + if ($res < 0) { + throw new RestException(500, "Can't delete, error occurs"); + } + + return array( + 'success' => array( + 'code' => 200, + 'message' => 'Member type deleted' + ) + ); + } + + /** + * Validate fields before creating an object + * + * @param array|null $data Data to validate + * @return array + * + * @throws RestException + */ + private function _validateType($data) + { + $membertype = array(); + foreach (MembersTypes::$FIELDS as $field) { + if (!isset($data[$field])) { + throw new RestException(400, "$field field missing"); + } + $membertype[$field] = $data[$field]; + } + return $membertype; + } } diff --git a/htdocs/adherents/class/api_memberstypes.class.php b/htdocs/adherents/class/api_memberstypes.class.php deleted file mode 100644 index c3d0e374746..00000000000 --- a/htdocs/adherents/class/api_memberstypes.class.php +++ /dev/null @@ -1,343 +0,0 @@ - - * - * 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 . - */ - -use Luracast\Restler\RestException; - -require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php'; - -/** - * API class for members types - * - * @access protected - * @class DolibarrApiAccess {@requires user,external} - */ -class MembersTypes extends DolibarrApi -{ - /** - * @var array $FIELDS Mandatory fields, checked when create and update object - */ - public static $FIELDS = array( - 'label', - ); - - /** - * Constructor - */ - public function __construct() - { - global $db, $conf; - $this->db = $db; - } - - /** - * Get properties of a member type object - * - * Return an array with member type information - * - * @param int $id ID of member type - * @return Object Object with cleaned properties - * - * @throws RestException 403 Access denied - * @throws RestException 404 No Member Type found - */ - public function get($id) - { - if (!DolibarrApiAccess::$user->hasRight('adherent', 'lire')) { - throw new RestException(403); - } - - $membertype = new AdherentType($this->db); - $result = $membertype->fetch($id); - if (!$result) { - throw new RestException(404, 'member type not found'); - } - - if (!DolibarrApi::_checkAccessToResource('member', $membertype->id, 'adherent_type')) { - throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); - } - - return $this->_cleanObjectDatas($membertype); - } - - /** - * List members types - * - * Get a list of members types - * - * @param string $sortfield Sort field - * @param string $sortorder Sort order - * @param int $limit Limit for list - * @param int $page Page number - * @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.libelle:like:'SO-%') and (t.subscription:=:'1')" - * @param string $properties Restrict the data returned to these properties. Ignored if empty. Comma separated list of properties names - * @return array Array of member type objects - * - * @throws RestException 403 Access denied - * @throws RestException 404 No Member Type found - * @throws RestException 503 Error when retrieving Member list - */ - public function index($sortfield = "t.rowid", $sortorder = 'ASC', $limit = 100, $page = 0, $sqlfilters = '', $properties = '') - { - global $db, $conf; - - $obj_ret = array(); - - if (!DolibarrApiAccess::$user->hasRight('adherent', 'lire')) { - throw new RestException(403); - } - - $sql = "SELECT t.rowid"; - $sql .= " FROM ".MAIN_DB_PREFIX."adherent_type AS t LEFT JOIN ".MAIN_DB_PREFIX."adherent_type_extrafields AS ef ON (ef.fk_object = t.rowid)"; // Modification VMR Global Solutions to include extrafields as search parameters in the API GET call, so we will be able to filter on extrafields - $sql .= ' WHERE t.entity IN ('.getEntity('member_type').')'; - - // Add sql filters - if ($sqlfilters) { - $errormessage = ''; - $sql .= forgeSQLFromUniversalSearchCriteria($sqlfilters, $errormessage); - if ($errormessage) { - throw new RestException(503, 'Error when validating parameter sqlfilters -> '.$errormessage); - } - } - - $sql .= $this->db->order($sortfield, $sortorder); - if ($limit) { - if ($page < 0) { - $page = 0; - } - $offset = $limit * $page; - - $sql .= $this->db->plimit($limit + 1, $offset); - } - - $result = $this->db->query($sql); - if ($result) { - $i = 0; - $num = $this->db->num_rows($result); - $min = min($num, ($limit <= 0 ? $num : $limit)); - while ($i < $min) { - $obj = $this->db->fetch_object($result); - $membertype = new AdherentType($this->db); - if ($membertype->fetch($obj->rowid)) { - $obj_ret[] = $this->_filterObjectProperties($this->_cleanObjectDatas($membertype), $properties); - } - $i++; - } - } else { - throw new RestException(503, 'Error when retrieve member type list : '.$this->db->lasterror()); - } - - return $obj_ret; - } - - /** - * Create member type object - * - * @param array $request_data Request data - * @return int ID of member type - * - * @throws RestException 403 Access denied - * @throws RestException 500 Error when creating Member Type - */ - public function post($request_data = null) - { - if (!DolibarrApiAccess::$user->hasRight('adherent', 'configurer')) { - throw new RestException(403); - } - // Check mandatory fields - $result = $this->_validate($request_data); - - $membertype = new AdherentType($this->db); - foreach ($request_data as $field => $value) { - if ($field === 'caller') { - // Add a mention of caller so on trigger called after action, we can filter to avoid a loop if we try to sync back again with the caller - $membertype->context['caller'] = $request_data['caller']; - continue; - } - - $membertype->$field = $value; - } - if ($membertype->create(DolibarrApiAccess::$user) < 0) { - throw new RestException(500, 'Error creating member type', array_merge(array($membertype->error), $membertype->errors)); - } - return $membertype->id; - } - - /** - * Update member type - * - * @param int $id ID of member type to update - * @param array $request_data Datas - * @return Object Updated object - * - * @throws RestException 403 Access denied - * @throws RestException 404 No Member Type found - * @throws RestException 500 Error when updating Member Type - */ - public function put($id, $request_data = null) - { - if (!DolibarrApiAccess::$user->hasRight('adherent', 'configurer')) { - throw new RestException(403); - } - - $membertype = new AdherentType($this->db); - $result = $membertype->fetch($id); - if (!$result) { - throw new RestException(404, 'member type not found'); - } - - if (!DolibarrApi::_checkAccessToResource('member', $membertype->id, 'adherent_type')) { - throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); - } - - foreach ($request_data as $field => $value) { - if ($field == 'id') { - continue; - } - if ($field === 'caller') { - // Add a mention of caller so on trigger called after action, we can filter to avoid a loop if we try to sync back again with the caller - $membertype->context['caller'] = $request_data['caller']; - continue; - } - - // Process the status separately because it must be updated using - // the validate(), resiliate() and exclude() methods of the class AdherentType. - $membertype->$field = $value; - } - - // If there is no error, update() returns the number of affected rows - // so if the update is a no op, the return value is zero. - if ($membertype->update(DolibarrApiAccess::$user) >= 0) { - return $this->get($id); - } else { - throw new RestException(500, 'Error when updating member type: '.$membertype->error); - } - } - - /** - * Delete member type - * - * @param int $id member type ID - * @return array - * - * @throws RestException 403 Access denied - * @throws RestException 404 No Member Type found - * @throws RestException 500 Error when deleting Member Type - */ - public function delete($id) - { - if (!DolibarrApiAccess::$user->hasRight('adherent', 'configurer')) { - throw new RestException(403); - } - $membertype = new AdherentType($this->db); - $result = $membertype->fetch($id); - if (!$result) { - throw new RestException(404, 'member type not found'); - } - - if (!DolibarrApi::_checkAccessToResource('member', $membertype->id, 'adherent_type')) { - throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); - } - - $res = $membertype->delete(DolibarrApiAccess::$user); - if ($res < 0) { - throw new RestException(500, "Can't delete, error occurs"); - } - - return array( - 'success' => array( - 'code' => 200, - 'message' => 'Member type deleted' - ) - ); - } - - /** - * Validate fields before creating an object - * - * @param array|null $data Data to validate - * @return array - * - * @throws RestException - */ - private function _validate($data) - { - $membertype = array(); - foreach (MembersTypes::$FIELDS as $field) { - if (!isset($data[$field])) { - throw new RestException(400, "$field field missing"); - } - $membertype[$field] = $data[$field]; - } - return $membertype; - } - - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore - /** - * Clean sensible object datas - * - * @param Object $object Object to clean - * @return Object Object with cleaned properties - */ - protected function _cleanObjectDatas($object) - { - // phpcs:enable - $object = parent::_cleanObjectDatas($object); - - unset($object->array_options); - unset($object->linkedObjectsIds); - unset($object->context); - unset($object->canvas); - unset($object->fk_project); - unset($object->contact); - unset($object->contact_id); - unset($object->thirdparty); - unset($object->user); - unset($object->origin); - unset($object->origin_id); - unset($object->ref_ext); - unset($object->country); - unset($object->country_id); - unset($object->country_code); - unset($object->barcode_type); - unset($object->barcode_type_code); - unset($object->barcode_type_label); - unset($object->barcode_type_coder); - unset($object->mode_reglement_id); - unset($object->cond_reglement_id); - unset($object->cond_reglement); - unset($object->fk_delivery_address); - unset($object->shipping_method_id); - unset($object->model_pdf); - unset($object->fk_account); - unset($object->note_public); - unset($object->note_private); - unset($object->fk_incoterms); - unset($object->label_incoterms); - unset($object->location_incoterms); - unset($object->name); - unset($object->lastname); - unset($object->firstname); - unset($object->civility_id); - unset($object->total_ht); - unset($object->total_tva); - unset($object->total_localtax1); - unset($object->total_localtax2); - unset($object->total_ttc); - - return $object; - } -} diff --git a/htdocs/modulebuilder/template/class/api_mymodule.class.php b/htdocs/modulebuilder/template/class/api_mymodule.class.php index 7ff746c21fb..d716869cfcc 100644 --- a/htdocs/modulebuilder/template/class/api_mymodule.class.php +++ b/htdocs/modulebuilder/template/class/api_mymodule.class.php @@ -54,6 +54,7 @@ class MyModuleApi extends DolibarrApi $this->myobject = new MyObject($this->db); } + /* BEGIN MODULEBUILDER API MYOBJECT */ /** @@ -64,7 +65,7 @@ class MyModuleApi extends DolibarrApi * @param int $id ID of myobject * @return Object Object with cleaned properties * - * @url GET mymodule/myobjects/{id} + * @url GET myobjects/{id} * * @throws RestException 403 Not allowed * @throws RestException 404 Not found @@ -103,7 +104,7 @@ class MyModuleApi extends DolibarrApi * @throws RestException 403 Not allowed * @throws RestException 503 System error * - * @url GET /mymodule/myobjects/ + * @url GET /myobjects/ */ public function index($sortfield = "t.rowid", $sortorder = 'ASC', $limit = 100, $page = 0, $sqlfilters = '', $properties = '') { @@ -191,7 +192,7 @@ class MyModuleApi extends DolibarrApi * @throws RestException 403 Not allowed * @throws RestException 500 System error * - * @url POST mymodule/myobjects/ + * @url POST myobjects/ */ public function post($request_data = null) { @@ -200,7 +201,7 @@ class MyModuleApi extends DolibarrApi } // Check mandatory fields - $result = $this->_validate($request_data); + $result = $this->_validateMyObject($request_data); foreach ($request_data as $field => $value) { if ($field === 'caller') { @@ -232,7 +233,7 @@ class MyModuleApi extends DolibarrApi * @throws RestException 404 Not found * @throws RestException 500 System error * - * @url PUT mymodule/myobjects/{id} + * @url PUT myobjects/{id} */ public function put($id, $request_data = null) { @@ -282,7 +283,7 @@ class MyModuleApi extends DolibarrApi * @throws RestException 409 Nothing to do * @throws RestException 500 System error * - * @url DELETE mymodule/myobjects/{id} + * @url DELETE myobjects/{id} */ public function delete($id) { @@ -321,7 +322,7 @@ class MyModuleApi extends DolibarrApi * * @throws RestException */ - private function _validate($data) + private function _validateMyObject($data) { $myobject = array(); foreach ($this->myobject->fields as $field => $propfield) {