diff --git a/htdocs/api/class/api.class.php b/htdocs/api/class/api.class.php index 27acf03dbe12d393ec16f726c1ce6f3372358f53..a1660be133d38d190c1fcdab6447b7e21c5e07af 100644 --- a/htdocs/api/class/api.class.php +++ b/htdocs/api/class/api.class.php @@ -1,5 +1,6 @@ <?php /* Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr> + * Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net> * * 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 diff --git a/htdocs/api/class/api_access.class.php b/htdocs/api/class/api_access.class.php index bebf9a6667bffe78912262d54ed521403c4ddad7..68ec526ec7e0e4f0156104810ea13ee7f0ca6fd4 100644 --- a/htdocs/api/class/api_access.class.php +++ b/htdocs/api/class/api_access.class.php @@ -1,5 +1,6 @@ <?php /* Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr> + * Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net> * * 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 diff --git a/htdocs/api/class/api_dictionnarycountries.class.php b/htdocs/api/class/api_dictionnarycountries.class.php index 77e8f63f2588dc9e4bdb64eddebd2a349db1a471..0243d27c81b635444cce6023d30d6096e815e0b2 100644 --- a/htdocs/api/class/api_dictionnarycountries.class.php +++ b/htdocs/api/class/api_dictionnarycountries.class.php @@ -1,6 +1,6 @@ <?php -/* - * Copyright (C) 2016 Xebax Christy <xebax@wanadoo.fr> +/* Copyright (C) 2016 Xebax Christy <xebax@wanadoo.fr> + * Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net> * * 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 @@ -89,7 +89,7 @@ class DictionnaryCountries extends DolibarrApi if ($result) { $num = $this->db->num_rows($result); - for ($i = 0; $i < $num; $i++) { + for ($i = 0; $i < min($num, ($limit <= 0 ? $num : $limit)); $i++) { $obj = $this->db->fetch_object($result); $country = new Ccountry($this->db); if ($country->fetch($obj->rowid) > 0) { diff --git a/htdocs/api/class/api_dictionnarytowns.class.php b/htdocs/api/class/api_dictionnarytowns.class.php index a08d4387edce908a6f65624638cbfa39be457b98..b028ff4af0396b37444228fcd653ef4b47a97555 100644 --- a/htdocs/api/class/api_dictionnarytowns.class.php +++ b/htdocs/api/class/api_dictionnarytowns.class.php @@ -1,6 +1,6 @@ <?php -/* - * Copyright (C) 2016 Xebax Christy <xebax@wanadoo.fr> +/* Copyright (C) 2016 Xebax Christy <xebax@wanadoo.fr> + * Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net> * * 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 @@ -83,7 +83,7 @@ class DictionnaryTowns extends DolibarrApi if ($result) { $num = $this->db->num_rows($result); - for ($i = 0; $i < $num; $i++) { + for ($i = 0; $i < min($num, ($limit <= 0 ? $num : $limit)); $i++) { $list[] = $this->db->fetch_object($result); } } else { diff --git a/htdocs/api/class/api_login.class.php b/htdocs/api/class/api_login.class.php index 4748416cb3c8e118193e13a7dfa6fe79b170b636..3617eb899b1aec1674e5fc2cb98ce7b2a843acae 100644 --- a/htdocs/api/class/api_login.class.php +++ b/htdocs/api/class/api_login.class.php @@ -1,5 +1,6 @@ <?php /* Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr> + * Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net> * * 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 diff --git a/htdocs/api/index.php b/htdocs/api/index.php index 0bf56be1899721ed5a0df4cbd1e87e8b1597e665..80cfb5485df80275a7a1ac07cca61819abc932ca 100644 --- a/htdocs/api/index.php +++ b/htdocs/api/index.php @@ -1,5 +1,6 @@ <?php /* Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr> + * Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net> * * 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 @@ -96,6 +97,9 @@ foreach ($modulesdir as $dir) elseif ($module == 'adherent') { $moduledirforclass = 'adherents'; } + elseif ($module == 'banque') { + $moduledirforclass = 'compta/bank'; + } elseif ($module == 'categorie') { $moduledirforclass = 'categories'; } diff --git a/htdocs/commande/class/api_orders.class.php b/htdocs/commande/class/api_orders.class.php index 07cf9f8febed925dba9ff1bbbc4511c9d65daf8c..5e000165bed1f5884872996b2a9dd1d507ebde56 100644 --- a/htdocs/commande/class/api_orders.class.php +++ b/htdocs/commande/class/api_orders.class.php @@ -1,5 +1,6 @@ <?php /* Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr> + * Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net> * * 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 @@ -142,7 +143,7 @@ class Orders extends DolibarrApi if ($result) { $num = $db->num_rows($result); - while ($i < min($limit, $num)) + while ($i < min($num, ($limit <= 0 ? $num : $limit))) { $obj = $db->fetch_object($result); $commande_static = new Commande($db); @@ -442,7 +443,7 @@ class Orders extends DolibarrApi * @param int $id Order ID * @param int $idwarehouse Warehouse ID * @param int $notrigger 1=Does not execute triggers, 0= execute triggers - * + * * @url POST {id}/validate * * @return array diff --git a/htdocs/compta/bank/class/api_bankaccounts.class.php b/htdocs/compta/bank/class/api_bankaccounts.class.php new file mode 100644 index 0000000000000000000000000000000000000000..250faea5a5d3f5c4b8622d16e05bd25a2716d394 --- /dev/null +++ b/htdocs/compta/bank/class/api_bankaccounts.class.php @@ -0,0 +1,373 @@ +<?php +/* + * Copyright (C) 2016 Xebax Christy <xebax@wanadoo.fr> + * + * 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 <http://www.gnu.org/licenses/>. + */ + +use Luracast\Restler\RestException; + +require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; + +/** + * API class for accounts + * + * @access protected + * @class DolibarrApiAccess {@requires user,external} + */ +class BankAccounts extends DolibarrApi +{ + + /** + * array $FIELDS Mandatory fields, checked when creating an object + */ + static $FIELDS = array( + 'ref', + 'label', + 'type', + 'currency_code', + 'country_id' + ); + + /** + * Constructor + */ + function __construct() + { + global $db; + $this->db = $db; + } + + /** + * Get the list of accounts. + * + * @param string $sortfield Sort field + * @param string $sortorder Sort order + * @param int $limit Limit for list + * @param int $page Page number + * @return array List of account objects + * + * @throws RestException + */ + function index($sortfield = "rowid", $sortorder = 'ASC', $limit = 0, $page = 0) + { + $list = array(); + + if(! DolibarrApiAccess::$user->rights->banque->lire) { + throw new RestException(401); + } + + $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."bank_account"; + + $nbtotalofrecords = 0; + if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) + { + $result = $this->db->query($sql); + $nbtotalofrecords = $this->db->num_rows($result); + } + + $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) { + $num = $this->db->num_rows($result); + for ($i = 0; $i < min($num, ($limit <= 0 ? $num : $limit)); $i++) { + $obj = $this->db->fetch_object($result); + $account = new Account($this->db); + if ($account->fetch($obj->rowid) > 0) { + $list[] = $this->_cleanObjectDatas($account); + } + } + } else { + throw new RestException(503, 'Error when retrieving list of accounts: ' . $account->error); + } + + return $list; + } + + /** + * Get account by ID. + * + * @param int $id ID of account + * @return array Account object + * + * @throws RestException + */ + function get($id) + { + if (! DolibarrApiAccess::$user->rights->banque->lire) { + throw new RestException(401); + } + + $account = new Account($this->db); + $result = $account->fetch($id); + if (! $result) { + throw new RestException(404, 'account not found'); + } + + return $this->_cleanObjectDatas($account); + } + + /** + * Create account object + * + * @param array $request_data Request data + * @return int ID of account + */ + function post($request_data = null) + { + if (! DolibarrApiAccess::$user->rights->banque->configurer) { + throw new RestException(401); + } + // Check mandatory fields + $result = $this->_validate($request_data); + + $account = new Account($this->db); + foreach ($request_data as $field => $value) { + $account->$field = $value; + } + // Date of the initial balance (required to create an account). + $account->date_solde = time(); + // courant and type are the same thing but the one used when + // creating an account is courant + $account->courant = $account->type; + + if ($account->create(DolibarrApiAccess::$user) < 0) { + throw new RestException(503, 'Error when creating account: ' . $account->error); + } + return $account->id; + } + + /** + * Update account + * + * @param int $id ID of account + * @param array $request_data data + * @return int + */ + function put($id, $request_data = null) + { + if (! DolibarrApiAccess::$user->rights->banque->configurer) { + throw new RestException(401); + } + + $account = new Account($this->db); + $result = $account->fetch($id); + if (! $result) { + throw new RestException(404, 'account not found'); + } + + foreach ($request_data as $field => $value) { + $account->$field = $value; + } + + if ($account->update(DolibarrApiAccess::$user) > 0) + return $this->get($id); + + return false; + } + + /** + * Delete account + * + * @param int $id ID of account + * @return array + */ + function delete($id) + { + if (! DolibarrApiAccess::$user->rights->banque->configurer) { + throw new RestException(401); + } + $account = new Account($this->db); + $result = $account->fetch($id); + if (! $result) { + throw new RestException(404, 'account not found'); + } + + if ($account->delete(DolibarrApiAccess::$user) < 0) { + throw new RestException(401, 'error when deleting account'); + } + + return array( + 'success' => array( + 'code' => 200, + 'message' => 'account deleted' + ) + ); + } + + /** + * Validate fields before creating an object + * + * @param array $data Data to validate + * @return array + * + * @throws RestException + */ + function _validate($data) + { + $account = array(); + foreach (Accounts::$FIELDS as $field) { + if (! isset($data[$field])) + throw new RestException(400, "$field field missing"); + $account[$field] = $data[$field]; + } + return $account; + } + + /** + * Clean sensible object datas + * + * @param object $object Object to clean + * @return array Array of cleaned object properties + */ + function _cleanObjectDatas($object) + { + $object = parent::_cleanObjectDatas($object); + + unset($object->rowid); + + return $object; + } + + /** + * Get the list of lines of the account. + * + * @param int $id ID of account + * @return array Array of AccountLine objects + * + * @throws RestException + * + * @url GET {id}/lines + */ + function getLines($id) + { + $list = array(); + + if (! DolibarrApiAccess::$user->rights->banque->lire) { + throw new RestException(401); + } + + $account = new Account($this->db); + $result = $account->fetch($id); + if (! $result) { + throw new RestException(404, 'account not found'); + } + + $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."bank "; + $sql .= " WHERE fk_account = ".$id; + $sql .= " ORDER BY rowid"; + + $result = $this->db->query($sql); + + if ($result) { + $num = $this->db->num_rows($result); + for ($i = 0; $i < $num; $i++) { + $obj = $this->db->fetch_object($result); + $accountLine = new AccountLine($this->db); + if ($accountLine->fetch($obj->rowid) > 0) { + $list[] = $this->_cleanObjectDatas($accountLine); + } + } + } else { + throw new RestException(503, 'Error when retrieving list of account lines: ' . $accountLine->error); + } + + return $list; + } + + /** + * Add a line to an account + * + * @param int $id ID of account + * @param int $date Payment date (timestamp) {@from body} {@type timestamp} + * @param string $type Payment mode (TYP,VIR,PRE,LIQ,VAD,CB,CHQ...) {@from body} + * @param string $label Label {@from body} + * @param float $amount Amount (may be 0) {@from body} + * @param int $category Category + * @param string $cheque_number Cheque numberl {@from body} + * @param string $cheque_writer Name of cheque writer {@from body} + * @param string $cheque_bank Bank of cheque writer {@from body} + * @return int ID of line + * + * @url POST {id}/lines + */ + function addLine($id, $date, $type, $label, $amount, $category=0, $cheque_number='', $cheque_writer='', $cheque_bank='') + { + if (! DolibarrApiAccess::$user->rights->banque->modifier) { + throw new RestException(401); + } + + $account = new Account($this->db); + $result = $account->fetch($id); + if (! $result) { + throw new RestException(404, 'account not found'); + } + + $result = $account->addline($date, $type, $label, $amount, $cheque_number, $category, + DolibarrApiAccess::$user, $cheque_writer, $cheque_bank); + if ($result < 0) { + throw new RestException(503, 'Error when adding line to account: ' . $account->error); + } + return $result; + } + + /** + * Add a link to an account line + * + * @param int $account_id ID of account + * @param int $line_id ID of account line + * @param int $url_id ID to set in the URL {@from body} + * @param string $url URL of the link {@from body} + * @param string $label Label {@from body} + * @param string $type Type of link ('payment', 'company', 'member', ...) {@from body} + * @return int ID of link + * + * @url POST {account_id}/lines/{line_id}/links + */ + function addLink($account_id, $line_id, $url_id, $url, $label, $type) + { + if (! DolibarrApiAccess::$user->rights->banque->modifier) { + throw new RestException(401); + } + + $account = new Account($this->db); + $result = $account->fetch($account_id); + if (! $result) { + throw new RestException(404, 'account not found'); + } + + $accountLine = new AccountLine($this->db); + $result = $accountLine->fetch($line_id); + if (! $result) { + throw new RestException(404, 'account line not found'); + } + + $result = $account->add_url_line($line_id, $url_id, $url, $label, $type); + if ($result < 0) { + throw new RestException(503, 'Error when adding link to account line: ' . $account->error); + } + return $result; + } +}