Merge pull request #24560 from AuTEAMation/multicurrency-api

NEW: Multicurrency REST API to create, update, delete, update rate...
This commit is contained in:
Laurent Destailleur 2023-04-24 16:18:06 +02:00 committed by GitHub
commit 0f65dbe5a7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 284 additions and 4 deletions

View File

@ -156,6 +156,30 @@ class modMultiCurrency extends DolibarrModules
// $this->rights[$r][5] = 'level2'; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2)
// $r++;
$this->rights[$r][0] = 40001;
$this->rights[$r][1] = 'Read currencies and their rates';
$this->rights[$r][2] = 'r';
$this->rights[$r][3] = 1;
$this->rights[$r][4] = 'currency';
$this->rights[$r][5] = 'read';
$r++;
$this->rights[$r][0] = 40002;
$this->rights[$r][1] = 'Create/Update currencies and their rates';
$this->rights[$r][2] = 'w';
$this->rights[$r][3] = 0;
$this->rights[$r][4] = 'currency';
$this->rights[$r][5] = 'write';
$r++;
$this->rights[$r][0] = 40003;
$this->rights[$r][1] = 'Delete currencies and their rates';
$this->rights[$r][2] = 'w';
$this->rights[$r][3] = 0;
$this->rights[$r][4] = 'currency';
$this->rights[$r][5] = 'delete';
$r++;
// Main menu entries
$this->menu = array(); // List of menus to add
$r = 0;

View File

@ -1007,6 +1007,9 @@ Permission23001=Read Scheduled job
Permission23002=Create/update Scheduled job
Permission23003=Delete Scheduled job
Permission23004=Execute Scheduled job
Permission40001=Read currencies and their rates
Permission40002=Create/Update currencies and their rates
Permission40003=Delete currencies and their rates
Permission50101=Use Point of Sale (SimplePOS)
Permission50151=Use Point of Sale (TakePOS)
Permission50152=Edit sales lines

View File

@ -1004,6 +1004,9 @@ Permission23001=Voir les travaux planifiés
Permission23002=Créer/Modifier des travaux planifiées
Permission23003=Effacer travail planifié
Permission23004=Exécuter travail planifié
Permission40001=Consulter les devises et leurs taux de change
Permission40002=Créer/modifier les devises et leurs taux de change
Permission40003=Supprimer les devises et leurs taux de change
Permission50101=Utiliser le Point De Vente (SimplePOS)
Permission50151=Utiliser le Point de Vente (TakePOS)
Permission50152=Modifier les lignes de vente

View File

@ -39,7 +39,9 @@ class MultiCurrencies extends DolibarrApi
}
/**
* Get a list of currencies
* List Currencies
*
* Get a list of Currencies
*
* @param string $sortfield Sort field
* @param string $sortorder Sort order
@ -100,6 +102,232 @@ class MultiCurrencies extends DolibarrApi
return $obj_ret;
}
/**
* Get properties of a Currency object
*
* Return an array with Currency informations
*
* @param int $id ID of Currency
* @return array|mixed Data without useless information
*
* @throws RestException
*/
public function get($id)
{
$multicurrency = new MultiCurrency($this->db);
if (!$multicurrency->fetch($id)) {
throw new RestException(404, 'Currency not found');
}
if (!DolibarrApiAccess::$user->rights->multicurrency->currency->read) {
throw new RestException(401, "Insufficient rights to read currency");
}
return $this->_cleanObjectDatas($multicurrency);
}
/**
* Get properties of a Currency object by code
*
* Return an array with Currency informations
* @url GET /bycode/{code}
*
* @param string $code Code of Currency (ex: EUR)
* @return array|mixed Data without useless information
*
* @throws RestException
*/
public function getByCode($code)
{
$multicurrency = new MultiCurrency($this->db);
if (!$multicurrency->fetch('', $code)) {
throw new RestException(404, 'Currency not found');
}
if (!DolibarrApiAccess::$user->rights->multicurrency->currency->read) {
throw new RestException(401, "Insufficient rights to read currency");
}
return $this->_cleanObjectDatas($multicurrency);
}
/**
* List Currency rates
*
* Get a list of Currency rates
*
* @url GET {id}/rates
* @param int $id ID of Currency
* @return array|mixed Data without useless information
*
* @throws RestException
*/
public function getRates($id)
{
$multicurrency = new MultiCurrency($this->db);
if (!$multicurrency->fetch($id)) {
throw new RestException(404, 'Currency not found');
}
if (!DolibarrApiAccess::$user->rights->multicurrency->currency->read) {
throw new RestException(401, "Insufficient rights to read currency rates");
}
if ($multicurrency->fetchAllCurrencyRate() < 0) {
throw new RestException(500, "Error when fetching currency rates");
}
// Clean object datas
foreach ($multicurrency->rates as $key => $obj) {
$multicurrency->rates[$key] = $this->_cleanObjectDatasRate($obj);
}
return $multicurrency->rates;
}
/**
* Create Currency object
*
* @param array $request_data Request data
* @return int ID of Currency
*
* @throws RestException
*/
public function post($request_data = null)
{
if (!DolibarrApiAccess::$user->rights->multicurrency->currency->create) {
throw new RestException(401, "Insufficient rights to create currency");
}
// Check parameters
if (!isset($request_data['code'])) {
throw new RestException(400, "code field missing");
}
if (!isset($request_data['name'])) {
throw new RestException(400, "name field missing");
}
$multicurrency = new MultiCurrency($this->db);
$multicurrency->code = $request_data['code'];
$multicurrency->name = $request_data['name'];
// Create Currency
if ($multicurrency->create(DolibarrApiAccess::$user) < 0) {
throw new RestException(500, "Error creating currency", array_merge(array($multicurrency->error), $multicurrency->errors));
}
// Add default rate if defined
if (isset($request_data['rate']) && $request_data['rate'] > 0) {
if ($multicurrency->addRate(DolibarrApiAccess::$user, $request_data['rate']) < 0) {
throw new RestException(500, "Error adding currency rate", array_merge(array($multicurrency->error), $multicurrency->errors));
}
return $multicurrency->id;
}
return $multicurrency->id;
}
/**
* Update Currency
*
* @param int $id Id of Currency to update
* @param array $request_data Datas
* @return array The updated Currency
*
* @throws RestException
*/
public function put($id, $request_data = null)
{
if (!DolibarrApiAccess::$user->rights->multicurrency->currency->create) {
throw new RestException(401, "Insufficient rights to update currency");
}
$multicurrency = new MultiCurrency($this->db);
if (!$multicurrency->fetch($id)) {
throw new RestException(404, 'Currency not found');
}
foreach ($request_data as $field => $value) {
if ($field == 'id') {
continue;
}
$multicurrency->$field = $value;
}
if ($multicurrency->update(DolibarrApiAccess::$user) < 0) {
throw new RestException(500, "Error updating currency", array_merge(array($multicurrency->error), $multicurrency->errors));
}
return $this->get($id);
}
/**
* Delete Currency
*
* @param int $id Currency ID
* @return array
*
* @throws RestException
*/
public function delete($id)
{
if (!DolibarrApiAccess::$user->rights->multicurrency->currency->delete) {
throw new RestException(401, "Insufficient rights to delete currency");
}
$multicurrency = new MultiCurrency($this->db);
if (!$multicurrency->fetch($id)) {
throw new RestException(404, 'Currency not found');
}
if (!$multicurrency->delete(DolibarrApiAccess::$user)) {
throw new RestException(500, "Error deleting currency", array_merge(array($multicurrency->error), $multicurrency->errors));
}
return array(
'success' => array(
'code' => 200,
'message' => 'Currency deleted'
)
);
}
/**
* Update Currency rate
* @url PUT {id}/rates
*
* @param int $id Currency ID
* @param array $request_data Request data
* @return array The currency with the new rate
*
* @throws RestException
*/
public function updateRate($id, $request_data = null)
{
if (!DolibarrApiAccess::$user->rights->multicurrency->currency->create) {
throw new RestException(401, "Insufficient rights to update currency rate");
}
// Check parameters
if (!isset($request_data['rate'])) {
throw new RestException(400, "rate field missing");
}
$multicurrency = new MultiCurrency($this->db);
if (!$multicurrency->fetch($id)) {
throw new RestException(404, 'Currency not found');
}
// Add rate
if ($multicurrency->addRate($request_data['rate']) < 0) {
throw new RestException(500, "Error updating currency rate", array_merge(array($multicurrency->error), $multicurrency->errors));
}
return $this->_cleanObjectDatas($multicurrency);
}
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
/**
* Clean sensible object datas
@ -114,8 +342,30 @@ class MultiCurrencies extends DolibarrApi
// Clear all fields out of interrest
foreach ($object as $key => $value) {
if ($key == "rate") $object->$key = $this->_cleanObjectDatas($object->$key);
if ($key == "id" || $key == "code" || $key == "rate" || $key == "date_sync")
if ($key == "rate") $object->$key = $this->_cleanObjectDatasRate($object->$key);
if ($key == "id" || $key == "code" || $key == "rate" || $key == "name")
continue;
unset($object->$key);
}
return $object;
}
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
/**
* Clean sensible MultiCurrencyRate object datas
*
* @param MultiCurrencyRate $object Object to clean
* @return Object Object with cleaned properties
*/
protected function _cleanObjectDatasRate($object)
{
// phpcs:enable
$object = parent::_cleanObjectDatas($object);
// Clear all fields out of interrest
foreach ($object as $key => $value) {
if ($key == "id" || $key == "rate" || $key == "date_sync")
continue;
unset($object->$key);
}

View File

@ -299,7 +299,7 @@ class MultiCurrency extends CommonObject
// Update request
$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET";
$sql .= " name = '".$this->db->escape($this->name)."'";
$sql .= " name = '".$this->db->escape($this->name)."',";
$sql .= " code = '".$this->db->escape($this->code)."'";
$sql .= " WHERE rowid = ".((int) $this->id);