1<?php 2/* <one line to give the program's name and a brief idea of what it does.> 3 * Copyright (C) 2015 ATM Consulting <support@atm-consulting.fr> 4 * 5 * This program is free software: you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation, either version 3 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program. If not, see <https://www.gnu.org/licenses/>. 17 */ 18 19/** 20 * \file admin/multicurrency.php 21 * \ingroup multicurrency 22 * \brief Page to setup multicurrency module 23 */ 24 25// Dolibarr environment 26require '../main.inc.php'; 27require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; 28require_once DOL_DOCUMENT_ROOT.'/core/lib/multicurrency.lib.php'; 29require_once DOL_DOCUMENT_ROOT.'/multicurrency/class/multicurrency.class.php'; 30 31 32// Load translation files required by the page 33$langs->loadLangs(array('admin', 'multicurrency')); 34 35// Access control 36if (!$user->admin) { 37 accessforbidden(); 38} 39 40// Parameters 41$action = GETPOST('action', 'aZ09'); 42 43 44/* 45 * Actions 46 */ 47 48 49if (preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) 50{ 51 $code = $reg[1]; 52 $value = GETPOST($code, 'alpha'); 53 if (dolibarr_set_const($db, $code, $value, 'chaine', 0, '', $conf->entity) > 0) 54 { 55 setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); 56 } else { 57 setEventMessages($langs->trans("Error"), null, 'errors'); 58 } 59} 60 61if (preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) 62{ 63 $code = $reg[1]; 64 if (dolibarr_del_const($db, $code, 0) > 0) 65 { 66 setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); 67 } else { 68 setEventMessages($langs->trans("Error"), null, 'errors'); 69 } 70} 71 72if ($action == 'add_currency') 73{ 74 $error = 0; 75 76 $langs->loadCacheCurrencies(''); 77 78 $code = GETPOST('code', 'alpha'); 79 $rate = price2num(GETPOST('rate', 'alpha')); 80 $currency = new MultiCurrency($db); 81 $currency->code = $code; 82 $currency->name = !empty($langs->cache_currencies[$code]['label']) ? $langs->cache_currencies[$code]['label'].' ('.$langs->getCurrencySymbol($code).')' : $code; 83 84 if (empty($rate)) 85 { 86 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("Rate")), null, 'errors'); 87 $error++; 88 } 89 if (!$error) 90 { 91 if ($currency->create($user) > 0) 92 { 93 if ($currency->addRate($rate)) setEventMessages($langs->trans('RecordSaved'), array()); 94 else setEventMessages($langs->trans('ErrorAddRateFail'), array(), 'errors'); 95 } else setEventMessages($langs->trans('ErrorAddCurrencyFail'), $currency->errors, 'errors'); 96 } 97} elseif ($action == 'update_currency') 98{ 99 $error = 0; 100 101 if (GETPOST('updatecurrency', 'alpha')) 102 { 103 $fk_multicurrency = GETPOST('fk_multicurrency', 'int'); 104 $rate = price2num(GETPOST('rate', 'alpha')); 105 $currency = new MultiCurrency($db); 106 107 if (empty($rate)) 108 { 109 setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("Rate")), null, 'errors'); 110 $error++; 111 } 112 if (!$error) 113 { 114 if ($currency->fetch($fk_multicurrency) > 0) 115 { 116 $result = $currency->updateRate($rate); 117 if ($result < 0) { 118 setEventMessages(null, $currency->errors, 'errors'); 119 } 120 } 121 } 122 } elseif (GETPOST('deletecurrency', 'alpha')) 123 { 124 $fk_multicurrency = GETPOST('fk_multicurrency', 'int'); 125 $currency = new MultiCurrency($db); 126 127 if ($currency->fetch($fk_multicurrency) > 0) 128 { 129 if ($currency->delete() > 0) setEventMessages($langs->trans('RecordDeleted'), array()); 130 else setEventMessages($langs->trans('ErrorDeleteCurrencyFail'), array(), 'errors'); 131 } 132 } 133} elseif ($action == 'setapilayer') 134{ 135 if (GETPOSTISSET('modify_apilayer')) 136 { 137 dolibarr_set_const($db, 'MULTICURRENCY_APP_ID', GETPOST('MULTICURRENCY_APP_ID', 'alpha')); 138 dolibarr_set_const($db, 'MULTICURRENCY_APP_SOURCE', GETPOST('MULTICURRENCY_APP_SOURCE', 'alpha')); 139 //dolibarr_set_const($db, 'MULTICURRENCY_ALTERNATE_SOURCE', GETPOST('MULTICURRENCY_ALTERNATE_SOURCE', 'alpha')); 140 } else { 141 $result = MultiCurrency::syncRates($conf->global->MULTICURRENCY_APP_ID); 142 if ($result > 0) { 143 setEventMessages($langs->trans("CurrencyRateSyncSucceed"), null, "mesgs"); 144 } 145 } 146} 147 148 149$TCurrency = array(); 150$sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'multicurrency WHERE entity = '.$conf->entity; 151$resql = $db->query($sql); 152if ($resql) 153{ 154 while ($obj = $db->fetch_object($resql)) 155 { 156 $currency = new MultiCurrency($db); 157 $currency->fetch($obj->rowid); 158 $TCurrency[] = $currency; 159 } 160} 161 162 163/* 164 * View 165 */ 166 167$form = new Form($db); 168 169$page_name = "MultiCurrencySetup"; 170 171llxHeader('', $langs->trans($page_name)); 172 173// Subheader 174$linkback = '<a href="'.DOL_URL_ROOT.'/admin/modules.php?restore_lastsearch_values=1">'.$langs->trans("BackToModuleList").'</a>'; 175print load_fiche_titre($langs->trans($page_name), $linkback); 176 177// Configuration header 178$head = multicurrencyAdminPrepareHead(); 179print dol_get_fiche_head($head, 'settings', $langs->trans("ModuleSetup"), -1, "multicurrency"); 180 181 182print '<table class="noborder centpercent">'; 183print '<tr class="liste_titre">'; 184print '<td>'.$langs->trans("Parameters").'</td>'."\n"; 185print '<td class="center">'.$langs->trans("Status").'</td>'."\n"; 186print '</tr>'; 187 188print '<tr class="oddeven">'; 189print '<td>'.$langs->transnoentitiesnoconv("MULTICURRENCY_USE_RATE_ON_DOCUMENT_DATE").'</td>'; 190print '<td class="center">'; 191if ($conf->use_javascript_ajax) { 192 print ajax_constantonoff('MULTICURRENCY_USE_RATE_ON_DOCUMENT_DATE'); 193} else { 194 $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes")); 195 print $form->selectarray("MULTICURRENCY_USE_RATE_ON_DOCUMENT_DATE", $arrval, $conf->global->MULTICURRENCY_USE_RATE_ON_DOCUMENT_DATE); 196} 197print '</td></tr>'; 198 199 200print '<tr class="oddeven">'; 201print '<td>'.$langs->transnoentitiesnoconv("multicurrency_useOriginTx").'</td>'; 202print '<td class="center">'; 203if ($conf->use_javascript_ajax) { 204 print ajax_constantonoff('MULTICURRENCY_USE_ORIGIN_TX'); 205} else { 206 $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes")); 207 print $form->selectarray("MULTICURRENCY_USE_ORIGIN_TX", $arrval, $conf->global->MULTICURRENCY_USE_ORIGIN_TX); 208} 209print '</td></tr>'; 210 211// Online payment with currency on document. This option should be on by default. 212if ($conf->global->MAIN_FEATURES_LEVEL >= 2) 213{ 214 print '<tr class="oddeven">'; 215 print '<td>'.$langs->transnoentitiesnoconv("MULTICURRENCY_USE_CURRENCY_ON_DOCUMENT").'</td>'; 216 print '<td class="center">'; 217 if ($conf->use_javascript_ajax) { 218 print ajax_constantonoff('MULTICURRENCY_USE_CURRENCY_ON_DOCUMENT'); 219 } else { 220 $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes")); 221 print $form->selectarray("MULTICURRENCY_USE_CURRENCY_ON_DOCUMENT", $arrval, $conf->global->MULTICURRENCY_USE_CURRENCY_ON_DOCUMENT); 222 } 223 print '</td></tr>'; 224} 225 226/* TODO uncomment when the functionality will integrated 227 228print '<tr class="oddeven">'; 229print '<td>'.$langs->transnoentitiesnoconv("multicurrency_buyPriceInCurrency").'</td>'; 230print '<td class="right">'; 231print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">'; 232print '<input type="hidden" name="token" value="'.newToken().'">'; 233print '<input type="hidden" name="action" value="set_MULTICURRENCY_BUY_PRICE_IN_CURRENCY">'; 234print $form->selectyesno("MULTICURRENCY_BUY_PRICE_IN_CURRENCY",$conf->global->MULTICURRENCY_BUY_PRICE_IN_CURRENCY,1); 235print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">'; 236print '</form>'; 237print '</td></tr>'; 238*/ 239 240/* TODO uncomment when the functionality will integrated 241 242print '<tr class="oddeven">'; 243print '<td>'.$langs->transnoentitiesnoconv("multicurrency_modifyRateApplication").'</td>'; 244print '<td class="right">'; 245print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">'; 246print '<input type="hidden" name="token" value="'.newToken().'">'; 247print '<input type="hidden" name="action" value="set_MULTICURRENCY_MODIFY_RATE_APPLICATION">'; 248print $form->selectarray('MULTICURRENCY_MODIFY_RATE_APPLICATION', array('PU_DOLIBARR' => 'PU_DOLIBARR', 'PU_CURRENCY' => 'PU_CURRENCY'), $conf->global->MULTICURRENCY_MODIFY_RATE_APPLICATION); 249print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">'; 250print '</form>'; 251print '</td></tr>'; 252 253*/ 254 255print '</table>'; 256 257print '<br>'; 258 259if (!empty($conf->global->MAIN_MULTICURRENCY_ALLOW_SYNCHRONIZATION)) 260{ 261 print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'" id="form_sync">'; 262 print '<input type="hidden" name="token" value="'.newToken().'">'; 263 print '<input type="hidden" name="action" value="setapilayer">'; 264 265 print '<div class="div-table-responsive-no-min">'; 266 print '<table class="noborder centpercent">'; 267 268 $urlforapilayer = 'https://currencylayer.com'; //https://apilayer.net 269 270 print '<tr class="liste_titre">'; 271 print '<td>'.$form->textwithpicto($langs->trans("CurrencyLayerAccount"), $langs->trans("CurrencyLayerAccount_help_to_synchronize", $urlforapilayer)).'</td>'."\n"; 272 print '<td class="right">'; 273 print '<textarea id="response" class="hideobject" name="response"></textarea>'; 274 print '<input type="submit" name="modify_apilayer" class="button buttongen" value="'.$langs->trans("Modify").'">'; 275 print '<input type="submit" id="bt_sync" name="bt_sync_apilayer" class="button buttongen" value="'.$langs->trans('Synchronize').'" />'; 276 print '</td></tr>'; 277 278 print '<tr class="oddeven">'; 279 print '<td class="fieldrequired"><a target="_blank" href="'.$urlforapilayer.'">'.$langs->transnoentitiesnoconv("multicurrency_appId").'</a></td>'; 280 print '<td class="right">'; 281 print '<input type="text" name="MULTICURRENCY_APP_ID" value="'.$conf->global->MULTICURRENCY_APP_ID.'" size="28" /> '; 282 print '</td></tr>'; 283 284 print '<tr class="oddeven">'; 285 print '<td>'.$langs->transnoentitiesnoconv("multicurrency_appCurrencySource").'</td>'; 286 print '<td class="right">'; 287 print '<input type="text" name="MULTICURRENCY_APP_SOURCE" value="'.$conf->global->MULTICURRENCY_APP_SOURCE.'" size="10" placeholder="USD" /> '; // Default: USD 288 print '</form>'; 289 print '</td></tr>'; 290 291 /*print '<tr class="oddeven">'; 292 print '<td>'.$langs->transnoentitiesnoconv("multicurrency_alternateCurrencySource").'</td>'; 293 print '<td class="right">'; 294 print '<input type="text" name="MULTICURRENCY_ALTERNATE_SOURCE" value="'.$conf->global->MULTICURRENCY_ALTERNATE_SOURCE.'" size="10" placeholder="EUR" /> '; // Example: EUR 295 print '</td></tr>';*/ 296 297 print '</table>'; 298 print '</div>'; 299 print '<br>'; 300 301 print '</form>'; 302} 303 304print '<div class="div-table-responsive-no-min">'; 305print '<table class="noborder centpercent">'; 306 307print '<tr class="liste_titre">'; 308print '<td>'.$form->textwithpicto($langs->trans("CurrenciesUsed"), $langs->transnoentitiesnoconv("CurrenciesUsed_help_to_add")).'</td>'."\n"; 309print '<td class="center">'.$langs->trans("Rate").'</td>'."\n"; 310print '</tr>'; 311 312print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">'; 313print '<input type="hidden" name="token" value="'.newToken().'">'; 314print '<input type="hidden" name="action" value="add_currency">'; 315 316print '<tr class="oddeven">'; 317print '<td>'.$form->selectCurrency('', 'code', 1).'</td>'; 318print '<td class="right">'; 319print '<input type="text" name="rate" value="" size="13" placeholder="'.$langs->trans('Rate').'" /> '; 320print '<input type="submit" class="button" value="'.$langs->trans("Add").'">'; 321print '</td>'; 322print '</tr>'; 323 324print '</form>'; 325 326print '<tr class="oddeven">'; 327print '<td>'.$conf->currency.$form->textwithpicto(' ', $langs->trans("BaseCurrency")).'</td>'; 328print '<td class="right">1</td>'; 329print '</tr>'; 330 331foreach ($TCurrency as &$currency) 332{ 333 if ($currency->code == $conf->currency) continue; 334 335 print '<tr class="oddeven">'; 336 print '<td>'.$currency->code.' - '.$currency->name.'</td>'; 337 print '<td class="right">'; 338 print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">'; 339 print '<input type="hidden" name="token" value="'.newToken().'">'; 340 print '<input type="hidden" name="action" value="update_currency">'; 341 print '<input type="hidden" name="fk_multicurrency" value="'.$currency->id.'">'; 342 print '1 '.$conf->currency.' = '; 343 print '<input type="text" name="rate" value="'.($currency->rate->rate ? $currency->rate->rate : '').'" size="13" /> '.$currency->code.' '; 344 print '<input type="submit" name="updatecurrency" class="button" value="'.$langs->trans("Modify").'"> '; 345 print '<input type="submit" name="deletecurrency" class="button" value="'.$langs->trans("Delete").'">'; 346 print '</form>'; 347 print '</td></tr>'; 348} 349 350print '</table>'; 351print '</div>'; 352 353print ' 354 <script type="text/javascript"> 355 function getRates() 356 { 357 $("#bt_sync").attr("disabled", true); 358 return true; 359 } 360 </script> 361'; 362 363// End of page 364llxFooter(); 365$db->close(); 366