diff --git a/htdocs/admin/multicurrency.php b/htdocs/admin/multicurrency.php index b77606a60ed048475bf128d73a967cbdac5b571b..bd49265436d27b9ded04835166fee580a4cbf2f0 100644 --- a/htdocs/admin/multicurrency.php +++ b/htdocs/admin/multicurrency.php @@ -31,6 +31,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/multicurrency.lib.php'; require_once DOL_DOCUMENT_ROOT.'/multicurrency/class/multicurrency.class.php'; + // Translations $langs->load("multicurrency"); @@ -41,10 +42,11 @@ if (! $user->admin) { // Parameters $action = GETPOST('action', 'alpha'); - /* * Actions */ + + if (preg_match('/set_(.*)/',$action,$reg)) { $code=$reg[1]; @@ -64,7 +66,7 @@ if (preg_match('/del_(.*)/',$action,$reg)) $code=$reg[1]; if (dolibarr_del_const($db, $code, 0) > 0) { - Header("Location: ".$_SERVER["PHP_SELF"]); + header("Location: ".$_SERVER["PHP_SELF"]); exit; } else @@ -117,6 +119,21 @@ elseif ($action == 'update_currency') } } } +elseif ($action == 'synchronize') +{ + $response = GETPOST('response'); + $response = json_decode($response); + + if ($response->success) + { + MultiCurrency::syncRates($response); + } + else + { + setEventMessages($langs->trans('multicurrency_syncronize_error', $reponse->error->info), null, 'errors'); + } +} + $TCurrency = array(); $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'multicurrency WHERE entity = '.$conf->entity; @@ -217,15 +234,32 @@ print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">' print '</form>'; print '</td></tr>'; +print '</table>'; +print '<br />'; + +$var=false; +print '<table class="noborder" width="100%">'; +print '<tr class="liste_titre">'; +print '<td>'.$langs->trans("CurrencyLayerAccount").'</td>'."\n"; +print '<td align="center" width="20"> </td>'; +print '<td align="right" width="100">'; +print '<form id="form_sync" action="" method="POST">'; +print '<input type="hidden" name="action" value="synchronize" />'; +print '<textarea id="response" class="hideobject" name="response"></textarea>'; +print $langs->trans("Value").' <input type="button" id="bt_sync" class="button" onclick="javascript:getRates();" value="'.$langs->trans('Synchronize').'" />'; +print '</form>'; +print '</td></tr>'; + + $var=!$var; print '<tr '.$bc[$var].'>'; -print '<td>'.$langs->transnoentitiesnoconv("multicurrency_appId").'</td>'; +print '<td><a target="_blank" href="https://currencylayer.com">'.$langs->transnoentitiesnoconv("multicurrency_appId").'</a></td>'; print '<td align="center" width="20"> </td>'; print '<td align="right" width="400">'; print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">'; print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">'; -print '<input type="hidden" name="action" value="set_CURRENCY_APP_ID">'; -print '<input type="text" name="CURRENCY_APP_ID" value="'.$conf->global->MULTICURRENCY_APP_ID.'" size="28" /> '; +print '<input type="hidden" name="action" value="set_MULTICURRENCY_APP_ID">'; +print '<input type="text" name="MULTICURRENCY_APP_ID" value="'.$conf->global->MULTICURRENCY_APP_ID.'" size="28" /> '; print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">'; print '</form>'; print '</td></tr>'; @@ -233,23 +267,34 @@ print '</td></tr>'; /* This property seems not used in code, so i comment it $var=!$var; print '<tr '.$bc[$var].'>'; -print '<td>'.$langs->transnoentitiesnoconv("multicurrency_currencyFromToRate").'</td>'; +print '<td>'.$langs->transnoentitiesnoconv("multicurrency_appCurrencySource").'</td>'; print '<td align="center" width="20"> </td>'; print '<td align="right" width="400">'; print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">'; print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">'; -print '<input type="hidden" name="action" value="set_MULTICURRENCY_FROM_TO_RATE">'; -print '<input type="text" name="MULTICURRENCY_FROM_TO_RATE" value="'.$conf->global->MULTICURRENCY_FROM_TO_RATE.'" size="10" placeholder="USD-EUR-1" /> '; // CURRENCY_BASE - CURRENCY_ENTITY - ID_ENTITY +print '<input type="hidden" name="action" value="set_MULTICURRENCY_APP_SOURCE">'; +print '<input type="text" name="MULTICURRENCY_APP_SOURCE" value="'.$conf->global->MULTICURRENCY_APP_SOURCE.'" size="10" placeholder="USD" /> '; // Default: USD print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">'; print '</form>'; print '</td></tr>'; -*/ - -print '</table>'; +$var=!$var; +print '<tr '.$bc[$var].'>'; +print '<td>'.$langs->transnoentitiesnoconv("multicurrency_alternateCurrencySource").'</td>'; +print '<td align="center" width="20"> </td>'; +print '<td align="right" width="400">'; +print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">'; +print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">'; +print '<input type="hidden" name="action" value="set_MULTICURRENCY_ALTERNATE_SOURCE">'; +print '<input type="text" name="MULTICURRENCY_ALTERNATE_SOURCE" value="'.$conf->global->MULTICURRENCY_ALTERNATE_SOURCE.'" size="10" placeholder="EUR" /> '; // Example: EUR +print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">'; print '</form>'; +print '</td></tr>'; +*/ +print '</table>'; print '<br />'; + print '<table class="noborder" width="100%">'; print '<tr class="liste_titre">'; @@ -289,6 +334,26 @@ foreach ($TCurrency as &$currency) print '</table>'; + + +print ' + <script type="text/javascript"> + function getRates() + { + $("#bt_sync").attr("disabled", true); + var url_sync = "http://apilayer.net/api/live?access_key='.$conf->global->MULTICURRENCY_APP_ID.'&format=1'.(!empty($conf->global->MULTICURRENCY_APP_SOURCE) ? '&source='.$conf->global->MULTICURRENCY_APP_SOURCE : '').'"; + + $.ajax({ + url: url_sync, + dataType: "jsonp" + }).done(function(response) { + $("#response").val(JSON.stringify(response)); + $("#form_sync").submit(); + }); + } + </script> +'; + llxFooter(); $db->close(); \ No newline at end of file diff --git a/htdocs/multicurrency/class/multicurrency.class.php b/htdocs/multicurrency/class/multicurrency.class.php index 834d5b38605d319995fb1dcf42d443d3681877e5..b4baa550ce7cdbdef1f881563b1871a4a03f4bfd 100644 --- a/htdocs/multicurrency/class/multicurrency.class.php +++ b/htdocs/multicurrency/class/multicurrency.class.php @@ -208,7 +208,7 @@ class MultiCurrency extends CommonObject $this->errors[] = 'Error ' . $this->db->lasterror(); dol_syslog('Currency::fetch ' . join(',', $this->errors), LOG_ERR); - return - 1; + return -1; } } @@ -383,7 +383,7 @@ class MultiCurrency extends CommonObject * * @param double $rate rate value * - * @return bool false if KO, true if OK + * @return int -1 if KO, 1 if OK */ public function addRate($rate) { @@ -402,6 +402,40 @@ class MultiCurrency extends CommonObject } } + /** + * 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 + */ + function addRateFromDolibarr($code, $rate) + { + global $db, $user; + + $currency = new MultiCurrency($db); + $currency->code = $code; + $currency->name = $code; + + $sql = 'SELECT label FROM '.MAIN_DB_PREFIX.'c_currencies WHERE code_iso = "'.$db->escape($code).'"'; + $resql = $db->query($sql); + if ($resql && ($line = $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; + } + /** * Update rate in database * @@ -522,6 +556,66 @@ class MultiCurrency extends CommonObject return false; } + + /** + * With free account we can't set source then recalcul all rates to force another source + * + * @param stdClass $TRate Object containing all currencies rates + * @return -1 if KO, 0 if nothing, 1 if OK + */ + public static function recalculRates(&$TRate) + { + global $conf; + + if (!empty($conf->global->MULTICURRENCY_ALTERNATE_SOURCE)) + { + $alternate_source = 'USD'.$conf->global->MULTICURRENCY_ALTERNATE_SOURCE; + 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 array $response array of reponse from api to sync dolibarr rates + */ + public static function syncRates($response) + { + global $db,$conf; + + $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); + } + else + { + self::addRateFromDolibarr($code, $rate); + } + } + } + } } /** @@ -715,7 +809,7 @@ class CurrencyRate extends CommonObjectLine if ($error) { $this->db->rollback(); - return - 1 * $error; + return -1 * $error; } else { $this->db->commit();