diff --git a/htdocs/adherents/class/api_members.class.php b/htdocs/adherents/class/api_members.class.php
new file mode 100644
index 00000000000..3d27dd30d5d
--- /dev/null
+++ b/htdocs/adherents/class/api_members.class.php
@@ -0,0 +1,369 @@
+
+ *
+ * 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.class.php';
+require_once DOL_DOCUMENT_ROOT.'/adherents/class/cotisation.class.php';
+
+/**
+ * API class for members
+ *
+ * @access protected
+ * @class DolibarrApiAccess {@requires user,external}
+ */
+class Members extends DolibarrApi
+{
+ /**
+ * @var array $FIELDS Mandatory fields, checked when create and update object
+ */
+ static $FIELDS = array(
+ 'morphy',
+ 'typeid'
+ );
+
+ /**
+ * Constructor
+ */
+ function __construct()
+ {
+ global $db, $conf;
+ $this->db = $db;
+ }
+
+ /**
+ * Get properties of a member object
+ *
+ * Return an array with member informations
+ *
+ * @param int $id ID of member
+ * @return array|mixed data without useless information
+ *
+ * @throws RestException
+ */
+ function get($id)
+ {
+ if(! DolibarrApiAccess::$user->rights->adherent->lire) {
+ throw new RestException(401);
+ }
+
+ $member = new Adherent($this->db);
+ $result = $member->fetch($id);
+ if( ! $result ) {
+ throw new RestException(404, 'member not found');
+ }
+
+ if( ! DolibarrApi::_checkAccessToResource('adherent',$member->id)) {
+ throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
+ }
+
+ return $this->_cleanObjectDatas($member);
+ }
+
+ /**
+ * List members
+ *
+ * Get a list of members
+ *
+ * @param string $typeid ID of the type of member
+ * @param string $login To filter the members by login
+ * @param string $name To filter the members by name (firstname, lastname or company name matching the filter)
+ * @param string $sortfield Sort field
+ * @param string $sortorder Sort order
+ * @param int $limit Limit for list
+ * @param int $page Page number
+ * @return array Array of member objects
+ *
+ * @throws RestException
+ */
+ function index($typeid = '', $login = '', $name = '', $sortfield = "a.rowid", $sortorder = 'ASC', $limit = 0, $page = 0) {
+ global $db, $conf;
+
+ $obj_ret = array();
+
+ if(! DolibarrApiAccess::$user->rights->adherent->lire) {
+ throw new RestException(401);
+ }
+
+ $sql = "SELECT a.rowid";
+ $sql.= " FROM ".MAIN_DB_PREFIX."adherent as a";
+ $sql.= ' WHERE a.entity IN ('.getEntity('adherent', 1).')';
+ if (!empty($typeid))
+ {
+ $sql.= ' AND a.fk_adherent_type='.$typeid;
+ }
+ if (!empty($login)) {
+ $sql .= " AND a.login LIKE '%".$login."%'";
+ }
+ if (!empty($name)) {
+ $sql .= " AND (a.firstname LIKE '%".$name."%' OR a.lastname LIKE '%".$name."%' OR a.societe LIKE '%".$name."%')";
+ }
+
+ $nbtotalofrecords = 0;
+ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
+ {
+ $result = $db->query($sql);
+ $nbtotalofrecords = $db->num_rows($result);
+ }
+
+ $sql.= $db->order($sortfield, $sortorder);
+ if ($limit) {
+ if ($page < 0)
+ {
+ $page = 0;
+ }
+ $offset = $limit * $page;
+
+ $sql.= $db->plimit($limit + 1, $offset);
+ }
+
+ $result = $db->query($sql);
+ if ($result)
+ {
+ $i=0;
+ $num = $db->num_rows($result);
+ while ($i < $num)
+ {
+ $obj = $db->fetch_object($result);
+ $member = new Adherent($this->db);
+ if($member->fetch($obj->rowid)) {
+ $obj_ret[] = $this->_cleanObjectDatas($member);
+ }
+ $i++;
+ }
+ }
+ else {
+ throw new RestException(503, 'Error when retrieve member list : '.$member->error);
+ }
+ if( ! count($obj_ret)) {
+ throw new RestException(404, 'No member found');
+ }
+
+ return $obj_ret;
+ }
+
+ /**
+ * Create member object
+ *
+ * @param array $request_data Request data
+ * @return int ID of member
+ */
+ function post($request_data = null)
+ {
+ if(! DolibarrApiAccess::$user->rights->adherent->creer) {
+ throw new RestException(401);
+ }
+ // Check mandatory fields
+ $result = $this->_validate($request_data);
+
+ $member = new Adherent($this->db);
+ foreach($request_data as $field => $value) {
+ $member->$field = $value;
+ }
+ if($member->create(DolibarrApiAccess::$user) < 0) {
+ throw new RestException(503, 'Error when create member : '.$member->error);
+ }
+ return $member->id;
+ }
+
+ /**
+ * Update member
+ *
+ * @param int $id ID of member to update
+ * @param array $request_data Datas
+ * @return int
+ */
+ function patch($id, $request_data = null)
+ {
+ if(! DolibarrApiAccess::$user->rights->adherent->creer) {
+ throw new RestException(401);
+ }
+
+ $member = new Adherent($this->db);
+ $result = $member->fetch($id);
+ if( ! $result ) {
+ throw new RestException(404, 'member not found');
+ }
+
+ if( ! DolibarrApi::_checkAccessToResource('member',$member->id)) {
+ throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
+ }
+
+ foreach($request_data as $field => $value) {
+ // Process the status separately because it must be updated using
+ // the validate() and resiliate() methods of the class Adherent.
+ if ($field == 'statut') {
+ if ($value == '0') {
+ $result = $member->resiliate(DolibarrApiAccess::$user);
+ if ($result < 0) {
+ throw new RestException(500, 'Error when resiliating member: '.$member->error);
+ }
+ } else if ($value == '1') {
+ $result = $member->validate(DolibarrApiAccess::$user);
+ if ($result < 0) {
+ throw new RestException(500, 'Error when validating member: '.$member->error);
+ }
+ }
+ } else {
+ $member->$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($member->update(DolibarrApiAccess::$user) >= 0)
+ return $this->get($id);
+
+ return false;
+ }
+
+ /**
+ * Delete member
+ *
+ * @param int $id member ID
+ * @return array
+ */
+ function delete($id)
+ {
+ if(! DolibarrApiAccess::$user->rights->adherent->supprimer) {
+ throw new RestException(401);
+ }
+ $member = new Adherent($this->db);
+ $result = $member->fetch($id);
+ if( ! $result ) {
+ throw new RestException(404, 'member not found');
+ }
+
+ if( ! DolibarrApi::_checkAccessToResource('member',$member->id)) {
+ throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
+ }
+
+ // The Adherent::delete() method uses the global variable $user.
+ global $user;
+ $user = DolibarrApiAccess::$user;
+
+ if (! $member->delete($member->id)) {
+ throw new RestException(401,'error when deleting member');
+ }
+
+ return array(
+ 'success' => array(
+ 'code' => 200,
+ 'message' => 'member deleted'
+ )
+ );
+ }
+
+ /**
+ * Validate fields before creating an object
+ *
+ * @param array $data Data to validate
+ * @return array
+ *
+ * @throws RestException
+ */
+ function _validate($data)
+ {
+ $member = array();
+ foreach (Members::$FIELDS as $field) {
+ if (!isset($data[$field]))
+ throw new RestException(400, "$field field missing");
+ $member[$field] = $data[$field];
+ }
+ return $member;
+ }
+
+ /**
+ * Clean sensible object datas
+ *
+ * @param object $object Object to clean
+ * @return array Array of cleaned object properties
+ *
+ * @todo use an array for properties to clean
+ *
+ */
+ function _cleanObjectDatas($object) {
+
+ $object = parent::_cleanObjectDatas($object);
+
+ // Remove the subscriptions because they are handled as a subresource.
+ unset($object->subscriptions);
+
+ return $object;
+ }
+
+ /**
+ * List subscriptions of a member
+ *
+ * Get a list of subscriptions
+ *
+ * @param int $id ID of member
+ * @return array Array of subscription objects
+ *
+ * @throws RestException
+ *
+ * @url GET {id}/subscriptions
+ */
+ function getSubscriptions($id)
+ {
+ $obj_ret = array();
+
+ if(! DolibarrApiAccess::$user->rights->adherent->cotisation->lire) {
+ throw new RestException(401);
+ }
+
+ $member = new Adherent($this->db);
+ $result = $member->fetch($id);
+ if( ! $result ) {
+ throw new RestException(404, 'member not found');
+ }
+
+ $obj_ret = array();
+ foreach ($member->subscriptions as $subscription) {
+ $obj_ret[] = $this->_cleanObjectDatas($subscription);
+ }
+ return $obj_ret;
+ }
+
+ /**
+ * Add a subscription for a member
+ *
+ * @param int $id ID of member
+ * @param int $start_date Start date {@from body} {@type timestamp}
+ * @param int $end_date End date {@from body} {@type timestamp}
+ * @param float $amount Amount (may be 0) {@from body}
+ * @param string $label Label {@from body}
+ * @return int ID of subscription
+ *
+ * @url POST {id}/subscriptions
+ */
+ function createSubscription($id, $start_date, $end_date, $amount, $label='')
+ {
+ if(! DolibarrApiAccess::$user->rights->adherent->cotisation->creer) {
+ throw new RestException(401);
+ }
+
+ $member = new Adherent($this->db);
+ $result = $member->fetch($id);
+ if( ! $result ) {
+ throw new RestException(404, 'member not found');
+ }
+
+ return $member->cotisation($start_date, $amount, 0, '', $label, '', '', '', $end_date);
+ }
+
+}
diff --git a/htdocs/adherents/class/api_subscriptions.class.php b/htdocs/adherents/class/api_subscriptions.class.php
new file mode 100644
index 00000000000..d79730959d2
--- /dev/null
+++ b/htdocs/adherents/class/api_subscriptions.class.php
@@ -0,0 +1,243 @@
+
+ *
+ * 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/cotisation.class.php';
+
+/**
+ * API class for subscriptions
+ *
+ * @access protected
+ * @class DolibarrApiAccess {@requires user,external}
+ */
+class Subscriptions extends DolibarrApi
+{
+ /**
+ * @var array $FIELDS Mandatory fields, checked when create and update object
+ */
+ static $FIELDS = array(
+ 'fk_adherent',
+ 'dateh',
+ 'datef',
+ 'amount'
+ );
+
+ /**
+ * Constructor
+ */
+ function __construct()
+ {
+ global $db, $conf;
+ $this->db = $db;
+ }
+
+ /**
+ * Get properties of a subscription object
+ *
+ * Return an array with subscription informations
+ *
+ * @param int $id ID of subscription
+ * @return array|mixed data without useless information
+ *
+ * @throws RestException
+ */
+ function get($id)
+ {
+ if(! DolibarrApiAccess::$user->rights->adherent->cotisation->lire) {
+ throw new RestException(401);
+ }
+
+ $subscription = new Cotisation($this->db);
+ $result = $subscription->fetch($id);
+ if( ! $result ) {
+ throw new RestException(404, 'subscription not found');
+ }
+
+ return $this->_cleanObjectDatas($subscription);
+ }
+
+ /**
+ * List subscriptions
+ *
+ * Get a list of subscriptions
+ *
+ * @param string $sortfield Sort field
+ * @param string $sortorder Sort order
+ * @param int $limit Limit for list
+ * @param int $page Page number
+ * @return array Array of subscription objects
+ *
+ * @throws RestException
+ */
+ function index($sortfield = "dateadh", $sortorder = 'ASC', $limit = 0, $page = 0) {
+ global $db, $conf;
+
+ $obj_ret = array();
+
+ if(! DolibarrApiAccess::$user->rights->adherent->cotisation->lire) {
+ throw new RestException(401);
+ }
+
+ $sql = "SELECT rowid";
+ $sql.= " FROM ".MAIN_DB_PREFIX."cotisation";
+
+ $nbtotalofrecords = 0;
+ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
+ {
+ $result = $db->query($sql);
+ $nbtotalofrecords = $db->num_rows($result);
+ }
+
+ $sql.= $db->order($sortfield, $sortorder);
+ if ($limit) {
+ if ($page < 0)
+ {
+ $page = 0;
+ }
+ $offset = $limit * $page;
+
+ $sql.= $db->plimit($limit + 1, $offset);
+ }
+
+ $result = $db->query($sql);
+ if ($result)
+ {
+ $i=0;
+ $num = $db->num_rows($result);
+ while ($i < $num)
+ {
+ $obj = $db->fetch_object($result);
+ $subscription = new Cotisation($this->db);
+ if($subscription->fetch($obj->rowid)) {
+ $obj_ret[] = $this->_cleanObjectDatas($subscription);
+ }
+ $i++;
+ }
+ }
+ else {
+ throw new RestException(503, 'Error when retrieve subscription list : '.$subscription->error);
+ }
+ if( ! count($obj_ret)) {
+ throw new RestException(404, 'No subscription found');
+ }
+
+ return $obj_ret;
+ }
+
+ /**
+ * Create subscription object
+ *
+ * @param array $request_data Request data
+ * @return int ID of subscription
+ */
+ function post($request_data = null)
+ {
+ if(! DolibarrApiAccess::$user->rights->adherent->cotisation->creer) {
+ throw new RestException(401);
+ }
+ // Check mandatory fields
+ $result = $this->_validate($request_data);
+
+ $subscription = new Cotisation($this->db);
+ foreach($request_data as $field => $value) {
+ $subscription->$field = $value;
+ }
+ if($subscription->create(DolibarrApiAccess::$user) < 0) {
+ throw new RestException(503, 'Error when create subscription : '.$subscription->error);
+ }
+ return $subscription->id;
+ }
+
+ /**
+ * Update subscription
+ *
+ * @param int $id ID of subscription to update
+ * @param array $request_data Datas
+ * @return int
+ */
+ function patch($id, $request_data = null)
+ {
+ if(! DolibarrApiAccess::$user->rights->adherent->creer) {
+ throw new RestException(401);
+ }
+
+ $subscription = new Cotisation($this->db);
+ $result = $subscription->fetch($id);
+ if( ! $result ) {
+ throw new RestException(404, 'subscription not found');
+ }
+
+ foreach($request_data as $field => $value) {
+ $subscription->$field = $value;
+ }
+
+ if($subscription->update(DolibarrApiAccess::$user) > 0)
+ return $this->get($id);
+
+ return false;
+ }
+
+ /**
+ * Delete subscription
+ *
+ * @param int $id ID of subscription to delete
+ * @return array
+ */
+ function delete($id)
+ {
+ // The right to delete a subscription comes with the right to create one.
+ if(! DolibarrApiAccess::$user->rights->adherent->cotisation->creer) {
+ throw new RestException(401);
+ }
+ $subscription = new Cotisation($this->db);
+ $result = $subscription->fetch($id);
+ if( ! $result ) {
+ throw new RestException(404, 'subscription not found');
+ }
+
+ if (! $subscription->delete(DolibarrApiAccess::$user)) {
+ throw new RestException(401,'error when deleting subscription');
+ }
+
+ return array(
+ 'success' => array(
+ 'code' => 200,
+ 'message' => 'subscription deleted'
+ )
+ );
+ }
+
+ /**
+ * Validate fields before creating an object
+ *
+ * @param array $data Data to validate
+ * @return array
+ *
+ * @throws RestException
+ */
+ function _validate($data)
+ {
+ $subscription = array();
+ foreach (Subscriptions::$FIELDS as $field) {
+ if (!isset($data[$field]))
+ throw new RestException(400, "$field field missing");
+ $subscription[$field] = $data[$field];
+ }
+ return $subscription;
+ }
+}
diff --git a/htdocs/adherents/class/cotisation.class.php b/htdocs/adherents/class/cotisation.class.php
index 9fe26727c25..dd8376b311a 100644
--- a/htdocs/adherents/class/cotisation.class.php
+++ b/htdocs/adherents/class/cotisation.class.php
@@ -82,7 +82,9 @@ class Cotisation extends CommonObject
$resql = $this->db->query($sql);
if ($resql)
{
- return $this->db->last_insert_id(MAIN_DB_PREFIX."cotisation");
+ $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."cotisation");
+ $this->db->commit();
+ return $this->id;
}
else
{
diff --git a/htdocs/api/index.php b/htdocs/api/index.php
index 549e164abde..0bf56be1899 100644
--- a/htdocs/api/index.php
+++ b/htdocs/api/index.php
@@ -89,16 +89,19 @@ foreach ($modulesdir as $dir)
if ($module == 'propale') {
$moduledirforclass = 'comm/propal';
$moduleforperm='propal';
- }
+ }
elseif ($module == 'agenda') {
$moduledirforclass = 'comm/action';
- }
+ }
+ elseif ($module == 'adherent') {
+ $moduledirforclass = 'adherents';
+ }
elseif ($module == 'categorie') {
$moduledirforclass = 'categories';
- }
+ }
elseif ($module == 'facture') {
$moduledirforclass = 'compta/facture';
- }
+ }
// Defined if module is enabled
$enabled=true;