Multiple Currencies in Organization
The multi-currency support in Zoho Vertical Solutions helps you to handle business and transactions in the global market effortlessly. With the multi-currency feature you can:
Estimate the value of a deal in your home currency as well as in your customer's local currency
Generate and view any report (with figures in other currencies) in your home currency
Import reports with figures in multiple currencies
Using Multiple Currencies
The Administrator of your organization's account must add the home currency and other currencies before other profile users start using them. The system stores the currency specified in input JSON as your home currency. Although you can edit the properties of your home currency, you cannot change it. To know how to update currencies refer to Update Currencies.
Purpose
To enable multiple currencies for your organization.
Endpoints
Request Details
Request URL
{api-domain}/crm/v2/org/currencies/actions/enable
Header
Authorization: Zoho-oauthtoken 100xx.d92d4xxxxxxxxxxxxx15f52
Scope
scope=ZohoCRM.settings.currencies.CREATE
Sample Request
Copiedcurl "https://zylkercorp.zohoplatform.com/crm/v2/org/currencies/actions/enable"
-X POST
-d "input.json"
-H "Authorization: Zoho-oauthtoken 100xx.8cb99dxxxxxxxxxxxxx9be93.9b8xxxxxxxxxxxxxxxf"Copied//Get instance of CurrenciesOperations Class
let currenciesOperations = new ZCRM.Currency.Operations();
//Get instance of BaseCurrencyWrapper Class that will contain the request body
let request = new ZCRM.Currency.Model.BaseCurrencyWrapper();
//Get instance of Currency Class
let currency = new ZCRM.Currency.Model.Currency();
//To set the position of the ISO code in the base currency.
//true: Display ISO code before the currency value.
//false: Display ISO code after the currency value.
currency.setPrefixSymbol(true);
//To set the name of the base currency.
currency.setName("Algerian Dinar-ADN");
//To set the ISO code of the base currency.
currency.setIsoCode("DZD");
//To set the symbol of the base currency.
currency.setSymbol("DA");
//To set the rate at which the currency has to be exchanged for home base currency.
currency.setExchangeRate("1.0000000");
//To set the status of the base currency.
//true: The currency is active.
//false: The currency is inactive.
currency.setIsActive(true);
let format = new ZCRM.Currency.Model.Format();
//It can be a Period or Comma, depending on the base currency.
format.setDecimalSeparator(new Choice("Period"));
//It can be a Period, Comma, or Space, depending on the base currency.
format.setThousandSeparator(new Choice("Comma"));
//To set the number of decimal places allowed for the base currency. It can be 0, 2, or 3.
format.setDecimalPlaces(new Choice("2"));
//To set the format of the base currency
currency.setFormat(format);
//Set the Currency in BodyWrapper instance
request.setBaseCurrency(currency);
//Call enableMultipleCurrencies method that takes BodyWrapper instance as parameter
let response = await currenciesOperations.enableMultipleCurrencies(request);Copiedvar listener = 0;
class MultipleCurrenciesinOrganization {
async multipleCurrenciesinOrganization() {
var url = "https://zylkercorp.zohoplatform.com/crm/v2/org/currencies/actions/enable"
var parameters = new Map()
var headers = new Map()
var token = {
clientId:"1000.NPY9M1V0XXXXXXXXXXXXXXXXXXXF7H",
redirectUrl:"http://127.0.0.1:5500/redirect.html",
scope:"ZohoCRM.settings.currencies.UPDATE,ZohoCRM.settings.currencies.Read,ZohoCRM.settings.currencies.CREATE,ZohoCRM.users.ALL,ZohoCRM.bulk.read,ZohoCRM.modules.ALL,ZohoCRM.settings.ALL,Aaaserver.profile.Read,ZohoCRM.org.ALL,profile.userphoto.READ,ZohoFiles.files.ALL,ZohoCRM.bulk.ALL,ZohoCRM.settings.variable_groups.ALL"
}
var accesstoken = await new MultipleCurrenciesinOrganization().getToken(token)
headers.set("Authorization", "Zoho-oauthtoken " + accesstoken)
var requestMethod = "POST"
var reqBody = {
"base_currency": {
"format": {
"decimal_separator": "Period",
"thousand_separator": "Comma",
"decimal_places": "2"
},
"prefix_symbol": true,
"name": "Algerian Dinar - DZD",
"iso_code": "DZD",
"symbol": "DA",
"exchange_rate": "1.0000000"
}
}
var params = "";
parameters.forEach(function(value, key) {
if (parameters.has(key)) {
if (params) {
params = params + key + '=' + value + '&';
}
else {
params = key + '=' + value + '&';
}
}
});
var apiHeaders = {};
if(headers) {
headers.forEach(function(value, key) {
apiHeaders[key] = value;
});
}
if (params.length > 0){
url = url + '?' + params.substring(0, params.length - 1);
}
var requestObj = {
uri : url,
method : requestMethod,
headers : apiHeaders,
body : JSON.stringify(reqBody),
encoding: "utf8",
allowGetBody : true,
throwHttpErrors : false
};
var result = await new MultipleCurrenciesinOrganization().makeAPICall(requestObj);
console.log(result.status)
console.log(result.response)
}
async getToken(token) {
if(listener == 0) {
window.addEventListener("storage", function(reponse) {
if(reponse.key === "access_token" && (reponse.oldValue != reponse.newValue || reponse.oldValue == null)){
location.reload();
}
if(reponse.key === "access_token"){
sessionStorage.removeItem("__auth_process");
}
}, false);
listener = 1;
if(sessionStorage.getItem("__auth_process")) {
sessionStorage.removeItem("__auth_process");
}
}
["granted_for_session", "access_token","expires_in","expires_in_sec","location","api_domain","state","__token_init","__auth_process"].forEach(function (k) {
var isKeyExists = localStorage.hasOwnProperty(k);
if(isKeyExists) {
sessionStorage.setItem(k, localStorage[k]);
}
localStorage.removeItem(k);
});
var valueInStore = sessionStorage.getItem("access_token");
var tokenInit = sessionStorage.getItem("__token_init");
if(tokenInit != null && valueInStore != null && Date.now() >= parseInt(tokenInit) + 59 * 60 * 1000){ // check after 59th minute
valueInStore = null;
sessionStorage.removeItem("access_token");
}
var auth_process = sessionStorage.getItem("__auth_process");
if ((valueInStore == null && auth_process == null) || (valueInStore == 'undefined' && (auth_process == null || auth_process == "true"))) {
var accountsUrl = "https://zylkercorp.zohoplatform.com/oauth/v2/auth"
var clientId;
var scope;
var redirectUrl;
if(token != null) {
clientId = token.clientId;
scope = token.scope;
redirectUrl = token.redirectUrl;
}
var fullGrant = sessionStorage.getItem("full_grant");
var grantedForSession = sessionStorage.getItem("granted_for_session");
if(sessionStorage.getItem("__token_init") != null && ((fullGrant != null && "true" == full_grant) || (grantedForSession != null && "true" == grantedForSession))) {
accountsUrl += '/refresh';
}
if (clientId && scope) {
sessionStorage.setItem("__token_init", Date.now());
sessionStorage.removeItem("access_token");
sessionStorage.setItem("__auth_process", "true");
window.open(accountsUrl + "?" + "scope" + "=" + scope + "&"+ "client_id" +"=" + clientId + "&response_type=token&state=zohocrmclient&redirect_uri=" + redirectUrl);
["granted_for_session", "access_token","expires_in","expires_in_sec","location","api_domain","state","__token_init","__auth_process"].forEach(function (k) {
var isKeyExists = localStorage.hasOwnProperty(k);
if(isKeyExists){
sessionStorage.setItem(k, localStorage[k]);
}
localStorage.removeItem(k);
});
valueInStore = sessionStorage.getItem("access_token");
}
}
if(token != null && valueInStore != 'undefined'){
token.accessToken = valueInStore;
}
return token.accessToken;
}
async makeAPICall(requestDetails) {
return new Promise(function (resolve, reject) {
var body, xhr, i;
body = requestDetails.body || null;
xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.open(requestDetails.method, requestDetails.uri, true);
for (i in requestDetails.headers) {
xhr.setRequestHeader(i, requestDetails.headers[i]);
}
xhr.send(body);
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) {
resolve(xhr);
}
}
})
}
}CopiedformatMap = Map();
formatMap.put("decimal_separator", "Period");
formatMap.put("thousand_separator", "Comma");
formatMap.put("decimal_places", "2");
currencyMap = Map();
currencyMap.put("format", formatMap);
currencyMap.put("prefix_symbol", true);
currencyMap.put("name", "Algerian Dinar-ADN");
currencyMap.put("iso_code", "DZD");
currencyMap.put("symbol", "DA");
currencyMap.put("exchange_rate", "1.0000000");
params = Map();
params.put("base_currency", currencyMap);
response = invokeurl
[
url :"https://zylkercorp.zohoplatform.com/crm/v2/org/currencies/actions/enable"
type :POST
parameters: params.toString()
connection:"crm_oauth_connection"
];
info response;In the request, "@input.json" contains the sample input data.
Request JSON Keys
- namestring, mandatory
Represents the name of the currency.
- iso_codestring, mandatory
Represents the ISO code of the currency.
- symbolstring, optional
Represents the symbol of the currency.
- exchange_ratestring, mandatory
Represents the rate at which the currency has to be exchanged for home currency.
- is_activeboolean, optional
Represents the status of the currency.
Possible Values:
true: The currency is active.
false: The currency is inactive. - formatJSON object, optional
Represents the format of the base currency with details like decimal_separator, thousand_separator, and decimal_places.
Keys to be specified in format JSON Object
- decimal_separatorstring, optional
The decimal separator separates the integer part of the currency from its fractional part. It can be a Period or Comma, depending on the currency.
- thousand_separatorstring, optional
The thousand separator separates groups of thousands in a currency. It can be a Period, Comma, or Space, depending on the currency.
- decimal_placesinteger, optional
Represents the number of decimal places allowed for the currency. It can be 0, 2, or 3.
Sample Input
Copied{
"base_currency": {
"format": {
"decimal_separator": "Period",
"thousand_separator": "Comma",
"decimal_places": "2"
},
"prefix_symbol": true,
"name": "Algerian Dinar - DZD",
"iso_code": "DZD",
"symbol": "DA",
"exchange_rate": "1.0000000"
}
}Possible Errors
- ALREADY_ENABLEDHTTP 400
The multi-currency is already enabled
Resolution: The multi-currency feature has already been enabled for your organization. You cannot enable it again. - INVALID_URL_PATTERNHTTP 404
Please check if the URL trying to access is a correct one
Resolution: The request URL has syntactical errors. - INVALID_DATAHTTP 400
Currency name is invalid
Resolution: You have specified an invalid currency name. Go to setup> Company Details> Under Currencies tab> Click Add> The Currency picklist will have valid currency names and ISO codes. - INVALID_DATAHTTP 400
ISO code is invalid
Resolution: You have specified an invalid ISO Code. Go to setup> Company Details> Under Currencies tab> Click Add> The Currency picklist will have valid currency names and ISO codes. - INVALID_DATAHTTP 400
Currency symbol is invalid
Resolution: You have specified an invalid currency symbol. - MANDATORY_NOT_FOUNDHTTP 400
Required field not found
Resolution: Refer to Request JSON section above and specify all the mandatory keys in the input - INVALID_REQUEST_METHODHTTP 400
The http request method type is not a valid one
Resolution: You have specified an invalid HTTP method to access the API URL. Specify a valid request method. Refer to endpoints section above. - OAUTH_SCOPE_MISMATCHHTTP 401
Unauthorized
Resolution: Client does not have ZohoCRM.settings.currencies.CREATE scope. Create a new client with valid scope. Refer to scope section above. - NO_PERMISSIONHTTP 403
Permission denied to read
Resolution: The user does not have permission to enable multi-currency. Contact your system administrator. - INTERNAL_ERRORHTTP 500
Internal Server Error
Resolution: Unexpected and unhandled exception in Server. Contact support team. - AUTHORIZATION_FAILEDHTTP 400
User does not have sufficient privilege to enable multi-currency.
Resolution: The user does not have the permission to enable multi-currency. Contact your system administrator.
Sample Response
Copied{
"base_currency": {
"code": "SUCCESS",
"details" {
"id": "111113000000038990"
},
"message": "The multi-currency feature is enabled and given currency is created as the base currency.",
"status": "success"
}
}