123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966 |
- <?php
- /* Copyright (C) 2007-2020 Laurent Destailleur <eldy@users.sourceforge.net>
- * Copyright (C) 2014 Juanjo Menent <jmenent@2byte.es>
- * Copyright (C) 2015 Florian Henry <florian.henry@open-concept.pro>
- * Copyright (C) 2015 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
- * Copyright (C) 2016 Pierre-Henry Favre <phf@atm-consulting.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 <https://www.gnu.org/licenses/>.
- */
- /**
- * \file htdocs/multicurrency/class/multicurrency.class.php
- * \ingroup multicurrency
- * \brief This file is a CRUD class file (Create/Read/Update/Delete) for multicurrency
- */
- // Put here all includes required by your class file
- require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
- require_once DOL_DOCUMENT_ROOT.'/core/class/commonobjectline.class.php';
- /**
- * Class Currency
- *
- * Put here description of your class
- * @see CommonObject
- */
- class MultiCurrency extends CommonObject
- {
- /**
- * @var string Id to identify managed objects
- */
- public $element = 'multicurrency';
- /**
- * @var string Name of table without prefix where object is stored
- */
- public $table_element = 'multicurrency';
- /**
- * @var string Name of table without prefix where object is stored
- */
- public $table_element_line = "multicurrency_rate";
- /**
- * @var CurrencyRate[] rates
- */
- public $rates = array();
- /**
- * @var mixed Sample property 1
- */
- public $id;
- /**
- * @var mixed Sample property 1
- */
- public $code;
- /**
- * @var mixed Sample property 2
- */
- public $name;
- /**
- * @var int Entity
- */
- public $entity;
- /**
- * @var mixed Sample property 2
- */
- public $date_create;
- /**
- * @var mixed Sample property 2
- */
- public $fk_user;
- /**
- * @var mixed Sample property 2
- */
- public $rate;
- /**
- * Constructor
- *
- * @param DoliDb $db Database handler
- */
- public function __construct(DoliDB $db)
- {
- $this->db = $db;
- return 1;
- }
- /**
- * Create object into database
- *
- * @param User $user User that creates
- * @param bool $trigger true=launch triggers after, false=disable triggers
- * @return int <0 if KO, Id of created object if OK
- */
- public function create(User $user, $trigger = true)
- {
- global $conf, $langs;
- dol_syslog('MultiCurrency::create', LOG_DEBUG);
- $error = 0;
- if (self::checkCodeAlreadyExists($this->code)) {
- $error++;
- $this->errors[] = $langs->trans('multicurrency_code_already_added');
- return -1;
- }
- if (empty($this->entity) || $this->entity <= 0) {
- $this->entity = $conf->entity;
- }
- $now = dol_now();
- // Insert request
- $sql = "INSERT INTO ".MAIN_DB_PREFIX.$this->table_element."(";
- $sql .= ' code,';
- $sql .= ' name,';
- $sql .= ' entity,';
- $sql .= ' date_create,';
- $sql .= ' fk_user';
- $sql .= ') VALUES (';
- $sql .= " '".$this->db->escape($this->code)."',";
- $sql .= " '".$this->db->escape($this->name)."',";
- $sql .= " ".((int) $this->entity).",";
- $sql .= " '".$this->db->idate($now)."',";
- $sql .= " ".((int) $user->id);
- $sql .= ')';
- $this->db->begin();
- dol_syslog(__METHOD__, LOG_DEBUG);
- $resql = $this->db->query($sql);
- if (!$resql) {
- $error++;
- $this->errors[] = 'Error '.$this->db->lasterror();
- dol_syslog('MultiCurrency::create '.join(',', $this->errors), LOG_ERR);
- }
- if (!$error) {
- $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.$this->table_element);
- $this->date_create = $now;
- $this->fk_user = $user->id;
- if ($trigger) {
- $result = $this->call_trigger('CURRENCY_CREATE', $user);
- if ($result < 0) {
- $error++;
- }
- }
- }
- if ($error) {
- $this->db->rollback();
- return -1 * $error;
- } else {
- $this->db->commit();
- return $this->id;
- }
- }
- /**
- * Load object in memory from the database
- *
- * @param int $id Id object
- * @param string $code code
- * @return int <0 if KO, 0 if not found, >0 if OK
- */
- public function fetch($id, $code = null)
- {
- dol_syslog('MultiCurrency::fetch', LOG_DEBUG);
- global $conf;
- $sql = "SELECT";
- $sql .= ' c.rowid, c.name, c.code, c.entity, c.date_create, c.fk_user';
- $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' AS c';
- if (!empty($code)) {
- $sql .= ' WHERE c.code = \''.$this->db->escape($code).'\' AND c.entity = '.$conf->entity;
- } else {
- $sql .= ' WHERE c.rowid = '.((int) $id);
- }
- dol_syslog(__METHOD__, LOG_DEBUG);
- $resql = $this->db->query($sql);
- if ($resql) {
- $numrows = $this->db->num_rows($resql);
- if ($numrows) {
- $obj = $this->db->fetch_object($resql);
- $this->id = $obj->rowid;
- $this->name = $obj->name;
- $this->code = $obj->code;
- $this->entity = $obj->entity;
- $this->date_create = $obj->date_create;
- $this->fk_user = $obj->fk_user;
- $this->fetchAllCurrencyRate();
- $this->getRate();
- }
- $this->db->free($resql);
- if ($numrows) {
- return 1;
- } else {
- return 0;
- }
- } else {
- $this->errors[] = 'Error '.$this->db->lasterror();
- dol_syslog('MultiCurrency::fetch '.join(',', $this->errors), LOG_ERR);
- return -1;
- }
- }
- /**
- * Load all rates in object from the database
- *
- * @return int <0 if KO, >=0 if OK
- */
- public function fetchAllCurrencyRate()
- {
- $sql = "SELECT cr.rowid";
- $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element_line.' as cr';
- $sql .= ' WHERE cr.fk_multicurrency = '.((int) $this->id);
- $sql .= ' ORDER BY cr.date_sync DESC';
- $this->rates = array();
- dol_syslog(__METHOD__, LOG_DEBUG);
- $resql = $this->db->query($sql);
- if ($resql) {
- $num = $this->db->num_rows($resql);
- while ($obj = $this->db->fetch_object($resql)) {
- $rate = new CurrencyRate($this->db);
- $rate->fetch($obj->rowid);
- $this->rates[] = $rate;
- }
- $this->db->free($resql);
- return $num;
- } else {
- $this->errors[] = 'Error '.$this->db->lasterror();
- dol_syslog('MultiCurrency::fetchAllCurrencyRate '.join(',', $this->errors), LOG_ERR);
- return -1;
- }
- }
- /**
- * Update object into database
- *
- * @param User $user User that modifies
- * @param bool $trigger true=launch triggers after, false=disable triggers
- * @return int <0 if KO, >0 if OK
- */
- public function update(User $user, $trigger = true)
- {
- $error = 0;
- dol_syslog('MultiCurrency::update', LOG_DEBUG);
- // Clean parameters
- $this->name = trim($this->name);
- $this->code = trim($this->code);
- // Check parameters
- if (empty($this->code)) {
- $error++;
- dol_syslog('MultiCurrency::update $this->code can not be empty', LOG_ERR);
- return -1;
- }
- // Update request
- $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET";
- $sql .= " name = '".$this->db->escape($this->name)."'";
- $sql .= " code = '".$this->db->escape($this->code)."'";
- $sql .= " WHERE rowid = ".((int) $this->id);
- $this->db->begin();
- $resql = $this->db->query($sql);
- if (!$resql) {
- $error++;
- $this->errors[] = 'Error '.$this->db->lasterror();
- dol_syslog('MultiCurrency::update '.join(',', $this->errors), LOG_ERR);
- }
- if (!$error && $trigger) {
- $result = $this->call_trigger('CURRENCY_MODIFY', $user);
- if ($result < 0) {
- $error++;
- }
- }
- // Commit or rollback
- if ($error) {
- $this->db->rollback();
- return -1 * $error;
- } else {
- $this->db->commit();
- return 1;
- }
- }
- /**
- * Delete object in database
- *
- * @param bool $trigger true=launch triggers after, false=disable triggers
- * @return int <0 if KO, >0 if OK
- */
- public function delete($trigger = true)
- {
- global $user;
- dol_syslog('MultiCurrency::delete', LOG_DEBUG);
- $error = 0;
- $this->db->begin();
- if ($trigger) {
- $result = $this->call_trigger('CURRENCY_DELETE', $user);
- if ($result < 0) {
- $error++;
- }
- }
- if (!$error) {
- // Delete all rates before
- if (!$this->deleteRates()) {
- $error++;
- $this->errors[] = 'Error '.$this->db->lasterror();
- dol_syslog('Currency::delete '.join(',', $this->errors), LOG_ERR);
- }
- $sql = "DELETE FROM ".MAIN_DB_PREFIX.$this->table_element;
- $sql .= " WHERE rowid = ".((int) $this->id);
- dol_syslog(__METHOD__, LOG_DEBUG);
- $resql = $this->db->query($sql);
- if (!$resql) {
- $error++;
- $this->errors[] = 'Error '.$this->db->lasterror();
- dol_syslog('MultiCurrency::delete '.join(',', $this->errors), LOG_ERR);
- }
- }
- // Commit or rollback
- if ($error) {
- $this->db->rollback();
- return -1 * $error;
- } else {
- $this->db->commit();
- return 1;
- }
- }
- /**
- * Delete rates in database
- *
- * @return bool false if KO, true if OK
- */
- public function deleteRates()
- {
- foreach ($this->rates as &$rate) {
- if ($rate->delete() <= 0) {
- return false;
- }
- }
- return true;
- }
- /**
- * Add a Rate into database
- *
- * @param double $rate rate value
- * @return int -1 if KO, 1 if OK
- */
- public function addRate($rate)
- {
- $currencyRate = new CurrencyRate($this->db);
- $currencyRate->rate = price2num($rate);
- if ($currencyRate->create($this->id) > 0) {
- $this->rate = $currencyRate;
- return 1;
- } else {
- $this->rate = null;
- $this->errors = $currencyRate->errors;
- return -1;
- }
- }
- /**
- * Try get label of code in llx_currency then add rate.
- *
- * @param string $code currency code
- * @param double $rate new rate
- * @return int -1 if KO, 1 if OK, 2 if label found and OK
- */
- public function addRateFromDolibarr($code, $rate)
- {
- global $user;
- $currency = new MultiCurrency($this->db);
- $currency->code = $code;
- $currency->name = $code;
- $sql = "SELECT label FROM ".MAIN_DB_PREFIX."c_currencies WHERE code_iso = '".$this->db->escape($code)."'";
- dol_syslog(__METHOD__, LOG_DEBUG);
- $resql = $this->db->query($sql);
- if ($resql && ($line = $this->db->fetch_object($resql))) {
- $currency->name = $line->label;
- }
- if ($currency->create($user) > 0) {
- $currency->addRate($rate);
- if (!empty($line)) {
- return 2;
- } else {
- return 1;
- }
- }
- return -1;
- }
- /**
- * Add new entry into llx_multicurrency_rate
- *
- * @param double $rate rate value
- * @return int <0 if KO, >0 if OK
- */
- public function updateRate($rate)
- {
- return $this->addRate($rate);
- }
- /**
- * Fetch CurrencyRate object in $this->rate
- *
- * @return int <0 if KO, 0 if not found, >0 if OK
- */
- public function getRate()
- {
- $sql = "SELECT cr.rowid";
- $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element_line." as cr";
- $sql .= " WHERE cr.fk_multicurrency = ".((int) $this->id);
- $sql .= " AND cr.date_sync = (SELECT MAX(cr2.date_sync) FROM ".MAIN_DB_PREFIX.$this->table_element_line." AS cr2 WHERE cr2.fk_multicurrency = ".((int) $this->id).")";
- dol_syslog(__METHOD__, LOG_DEBUG);
- $resql = $this->db->query($sql);
- if ($resql && ($obj = $this->db->fetch_object($resql))) {
- $this->rate = new CurrencyRate($this->db);
- return $this->rate->fetch($obj->rowid);
- }
- }
- /**
- * Get id of currency from code
- *
- * @param DoliDB $dbs object db
- * @param string $code code value search
- *
- * @return int 0 if not found, >0 if OK
- */
- public static function getIdFromCode($dbs, $code)
- {
- global $conf;
- $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."multicurrency WHERE code = '".$dbs->escape($code)."' AND entity = ".((int) $conf->entity);
- dol_syslog(__METHOD__, LOG_DEBUG);
- $resql = $dbs->query($sql);
- if ($resql && $obj = $dbs->fetch_object($resql)) {
- return $obj->rowid;
- } else {
- return 0;
- }
- }
- /**
- * Get id and rate of currency from code
- *
- * @param DoliDB $dbs Object db
- * @param string $code Code value search
- * @param integer $date_document Date from document (propal, order, invoice, ...)
- *
- * @return array [0] => id currency
- * [1] => rate
- */
- public static function getIdAndTxFromCode($dbs, $code, $date_document = '')
- {
- global $conf;
- $sql1 = "SELECT m.rowid, mc.rate FROM ".MAIN_DB_PREFIX."multicurrency m";
- $sql1 .= ' LEFT JOIN '.MAIN_DB_PREFIX.'multicurrency_rate mc ON (m.rowid = mc.fk_multicurrency)';
- $sql1 .= " WHERE m.code = '".$dbs->escape($code)."'";
- $sql1 .= " AND m.entity IN (".getEntity('multicurrency').")";
- $sql2 = '';
- if (!empty($conf->global->MULTICURRENCY_USE_RATE_ON_DOCUMENT_DATE) && !empty($date_document)) { // Use last known rate compared to document date
- $tmparray = dol_getdate($date_document);
- $sql2 .= " AND mc.date_sync <= '".$dbs->idate(dol_mktime(23, 59, 59, $tmparray['mon'], $tmparray['mday'], $tmparray['year'], true))."'";
- }
- $sql3 = " ORDER BY mc.date_sync DESC LIMIT 1";
- dol_syslog(__METHOD__, LOG_DEBUG);
- $resql = $dbs->query($sql1.$sql2.$sql3);
- if ($resql && $obj = $dbs->fetch_object($resql)) {
- return array($obj->rowid, $obj->rate);
- } else {
- if (!empty($conf->global->MULTICURRENCY_USE_RATE_ON_DOCUMENT_DATE)) {
- $resql = $dbs->query($sql1.$sql3);
- if ($resql && $obj = $dbs->fetch_object($resql)) {
- return array($obj->rowid, $obj->rate);
- }
- }
- return array(0, 1);
- }
- }
- /**
- * Get the conversion of amount with invoice rate
- *
- * @param int $fk_facture id of facture
- * @param double $amount amount to convert
- * @param string $way 'dolibarr' mean the amount is in dolibarr currency
- * @param string $table facture or facture_fourn
- * @return double|boolean amount converted or false if conversion fails
- */
- public static function getAmountConversionFromInvoiceRate($fk_facture, $amount, $way = 'dolibarr', $table = 'facture')
- {
- $multicurrency_tx = self::getInvoiceRate($fk_facture, $table);
- if ($multicurrency_tx) {
- if ($way == 'dolibarr') {
- return price2num($amount * $multicurrency_tx, 'MU');
- } else {
- return price2num($amount / $multicurrency_tx, 'MU');
- }
- } else {
- return false;
- }
- }
- /**
- * Get current invoite rate
- *
- * @param int $fk_facture id of facture
- * @param string $table facture or facture_fourn
- * @return float|bool Rate of currency or false if error
- */
- public static function getInvoiceRate($fk_facture, $table = 'facture')
- {
- global $db;
- $sql = "SELECT multicurrency_tx FROM ".MAIN_DB_PREFIX.$table." WHERE rowid = ".((int) $fk_facture);
- dol_syslog(__METHOD__, LOG_DEBUG);
- $resql = $db->query($sql);
- if ($resql && ($line = $db->fetch_object($resql))) {
- return $line->multicurrency_tx;
- }
- return false;
- }
- /**
- * With free account we can't set source then recalcul all rates to force another source.
- * This modify the array &$TRate.
- *
- * @param stdClass $TRate Object containing all currencies rates
- * @return int -1 if KO, 0 if nothing, 1 if OK
- */
- public static function recalculRates(&$TRate)
- {
- global $conf;
- if ($conf->currency != $conf->global->MULTICURRENCY_APP_SOURCE) {
- $alternate_source = 'USD'.$conf->currency;
- if (!empty($TRate->{$alternate_source})) {
- $coef = $TRate->USDUSD / $TRate->{$alternate_source};
- foreach ($TRate as $attr => &$rate) {
- $rate *= $coef;
- }
- return 1;
- }
- return -1; // Alternate souce not found
- }
- return 0; // Nothing to do
- }
- /**
- * Sync rates from API
- *
- * @param string $key Key to use. Come from $conf->global->MULTICURRENCY_APP_ID.
- * @param int $addifnotfound Add if not found
- * @return int <0 if KO, >0 if OK
- */
- public static function syncRates($key, $addifnotfound = 0)
- {
- global $conf, $db, $langs;
- include_once DOL_DOCUMENT_ROOT.'/core/lib/geturl.lib.php';
- $urlendpoint = 'http://api.currencylayer.com/live?access_key='.$key;
- $urlendpoint .= '&source=' . (empty($conf->global->MULTICURRENCY_APP_SOURCE) ? 'USD' : $conf->global->MULTICURRENCY_APP_SOURCE);
- dol_syslog("Call url endpoint ".$urlendpoint);
- $resget = getURLContent($urlendpoint);
- if ($resget['content']) {
- $response = $resget['content'];
- $response = json_decode($response);
- if ($response->success) {
- $TRate = $response->quotes;
- $timestamp = $response->timestamp;
- if (self::recalculRates($TRate) >= 0) {
- foreach ($TRate as $currency_code => $rate) {
- $code = substr($currency_code, 3, 3);
- $obj = new MultiCurrency($db);
- if ($obj->fetch(null, $code) > 0) {
- $obj->updateRate($rate);
- } elseif ($addifnotfound) {
- self::addRateFromDolibarr($code, $rate);
- }
- }
- }
- return 1;
- } else {
- dol_syslog("Failed to call endpoint ".$response->error->info, LOG_WARNING);
- setEventMessages($langs->trans('multicurrency_syncronize_error', $response->error->info), null, 'errors');
- return -1;
- }
- }
- }
- /**
- * Check in database if the current code already exists
- *
- * @param string $code current code to search
- * @return boolean True if exists, false if not exists
- */
- public function checkCodeAlreadyExists($code)
- {
- $currencytmp = new MultiCurrency($this->db);
- if ($currencytmp->fetch('', $code) > 0) {
- return true;
- } else {
- return false;
- }
- }
- }
- /**
- * Class CurrencyRate
- */
- class CurrencyRate extends CommonObjectLine
- {
- /**
- * @var string Id to identify managed objects
- */
- public $element = 'multicurrency_rate';
- /**
- * @var string Name of table without prefix where object is stored
- */
- public $table_element = 'multicurrency_rate';
- /**
- * @var int ID
- */
- public $id;
- /**
- * @var double Rate
- */
- public $rate;
- /**
- * @var integer Date synchronisation
- */
- public $date_sync;
- /**
- * @var int Id of currency
- */
- public $fk_multicurrency;
- /**
- * @var int Id of entity
- */
- public $entity;
- /**
- * Constructor
- *
- * @param DoliDb $db Database handler
- */
- public function __construct(DoliDB $db)
- {
- $this->db = $db;
- return 1;
- }
- /**
- * Create object into database
- *
- * @param int $fk_multicurrency Id of currency
- * @param bool $trigger true=launch triggers after, false=disable triggers
- * @return int <0 if KO, Id of created object if OK
- */
- public function create($fk_multicurrency, $trigger = true)
- {
- global $conf, $user;
- dol_syslog('CurrencyRate::create', LOG_DEBUG);
- $error = 0;
- $this->rate = price2num($this->rate);
- if (empty($this->entity) || $this->entity <= 0) {
- $this->entity = $conf->entity;
- }
- $now = empty($this->date_sync) ? dol_now() : $this->date_sync;
- // Insert request
- $sql = "INSERT INTO ".MAIN_DB_PREFIX.$this->table_element."(";
- $sql .= ' rate,';
- $sql .= ' date_sync,';
- $sql .= ' fk_multicurrency,';
- $sql .= ' entity';
- $sql .= ') VALUES (';
- $sql .= ' '.((float) $this->rate).',';
- $sql .= " '".$this->db->idate($now)."',";
- $sql .= " ".((int) $fk_multicurrency).",";
- $sql .= " ".((int) $this->entity);
- $sql .= ')';
- $this->db->begin();
- dol_syslog(__METHOD__, LOG_DEBUG);
- $resql = $this->db->query($sql);
- if (!$resql) {
- $error++;
- $this->errors[] = 'Error '.$this->db->lasterror();
- dol_syslog('CurrencyRate::create '.join(',', $this->errors), LOG_ERR);
- }
- if (!$error) {
- $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.$this->table_element);
- $this->fk_multicurrency = $fk_multicurrency;
- $this->date_sync = $now;
- if ($trigger) {
- $result = $this->call_trigger('CURRENCYRATE_CREATE', $user);
- if ($result < 0) {
- $error++;
- }
- }
- }
- if ($error) {
- $this->db->rollback();
- return -1 * $error;
- } else {
- $this->db->commit();
- return $this->id;
- }
- }
- /**
- * Load object in memory from the database
- *
- * @param int $id Id object
- * @return int <0 if KO, 0 if not found, >0 if OK
- */
- public function fetch($id)
- {
- dol_syslog('CurrencyRate::fetch', LOG_DEBUG);
- $sql = "SELECT cr.rowid, cr.rate, cr.date_sync, cr.fk_multicurrency, cr.entity";
- $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element." AS cr";
- $sql .= " WHERE cr.rowid = ".((int) $id);
- dol_syslog(__METHOD__, LOG_DEBUG);
- $resql = $this->db->query($sql);
- if ($resql) {
- $numrows = $this->db->num_rows($resql);
- if ($numrows) {
- $obj = $this->db->fetch_object($resql);
- $this->id = $obj->rowid;
- $this->rate = $obj->rate;
- $this->date_sync = $this->db->jdate($obj->date_sync);
- $this->fk_multicurrency = $obj->fk_multicurrency;
- $this->entity = $obj->entity;
- }
- $this->db->free($resql);
- if ($numrows) {
- return 1;
- } else {
- return 0;
- }
- } else {
- $this->errors[] = 'Error '.$this->db->lasterror();
- dol_syslog('CurrencyRate::fetch '.join(',', $this->errors), LOG_ERR);
- return -1;
- }
- }
- /**
- * Update object into database
- *
- * @param bool $trigger true=launch triggers after, false=disable triggers
- * @return int <0 if KO, >0 if OK
- */
- public function update($trigger = true)
- {
- global $user;
- $error = 0;
- dol_syslog('CurrencyRate::update', LOG_DEBUG);
- $this->rate = price2num($this->rate);
- // Update request
- $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
- $sql .= "SET rate = ".((float) $this->rate);
- if (!empty($this->date_sync)) {
- $sql .= ", date_sync = '".$this->db->idate($this->date_sync)."'";
- }
- if (!empty($this->fk_multicurrency)) {
- $sql .= ', fk_multicurrency = '.((int) $this->fk_multicurrency);
- }
- $sql .= " WHERE rowid =".((int) $this->id);
- $this->db->begin();
- dol_syslog(__METHOD__, LOG_DEBUG);
- $resql = $this->db->query($sql);
- if (!$resql) {
- $error++;
- $this->errors[] = 'Error '.$this->db->lasterror();
- dol_syslog('CurrencyRate::update '.join(',', $this->errors), LOG_ERR);
- }
- if (!$error && $trigger) {
- $result = $this->call_trigger('CURRENCYRATE_MODIFY', $user);
- if ($result < 0) {
- $error++;
- }
- }
- // Commit or rollback
- if ($error) {
- $this->db->rollback();
- return -1 * $error;
- } else {
- $this->db->commit();
- return 1;
- }
- }
- /**
- * Delete object in database
- *
- * @param bool $trigger true=launch triggers after, false=disable triggers
- * @return int <0 if KO, >0 if OK
- */
- public function delete($trigger = true)
- {
- global $user;
- dol_syslog('CurrencyRate::delete', LOG_DEBUG);
- $error = 0;
- $this->db->begin();
- if ($trigger) {
- $result = $this->call_trigger('CURRENCYRATE_DELETE', $user);
- if ($result < 0) {
- $error++;
- }
- }
- if (!$error) {
- $sql = 'DELETE FROM '.MAIN_DB_PREFIX.$this->table_element;
- $sql .= ' WHERE rowid='.((int) $this->id);
- dol_syslog(__METHOD__, LOG_DEBUG);
- $resql = $this->db->query($sql);
- if (!$resql) {
- $error++;
- $this->errors[] = 'Error '.$this->db->lasterror();
- dol_syslog('CurrencyRate::delete '.join(',', $this->errors), LOG_ERR);
- }
- }
- // Commit or rollback
- if ($error) {
- $this->db->rollback();
- return -1 * $error;
- } else {
- $this->db->commit();
- return 1;
- }
- }
- }
|