ServiceNowの開発者向けインスタンスは最初、マルチ通貨が有効化されており、またデフォルトの通貨はUSドルになっている。
今回はログインしているユーザによってデフォルトの通貨を切り替える設定を行う。
マルチ通貨は有効のまま、全ユーザのデフォルト通貨を日本円にしたい場合はこちらの記事を参照して下さい。
マルチ通貨を無効にし、日本円のみ利用可能にしたい場合はこちらの記事を参照してください。
インスタンスのビルドタイプはJakarta。
今回行う通貨コード設定の仕組み
いろいろと調べてみたところ、ServiceNowではユーザごとに通貨コードを変える仕組みが用意されていないらしい。
(サービスカタログ製品の価格(price)のみ自動で変換されるらしい)
ServiceNow Community - How do I modify the default currency symbol? -
https://community.servicenow.com/thread/172803
そこで今回はスクリプトを自作し、強制的にデフォルト通貨を書き換えることにする。
内容
- ログインしているユーザの言語、国コードを取得
- 1で取得した内容を元に、ロケールテーブル(sys_locale)の設定を取得
- 2で取得したロケールから通貨コードを取り出し、クライアントスクリプトからデフォルト通貨を設定する
ロケールテーブルレコードの読み込み
アプリケーションナビゲータの検索欄に、「sys_locale.list」と入力しEnterキーを押下する。
ロケールレコード一覧画面が表示されるが、何もレコードが無いことを確認する。
※ レコードがある場合はこのセクションまで作業をスキップしてください。
アプリケーションナビゲータの中から、システム定義 → モジュールを選択(赤枠)。
モジュールをアクティブにしたことで、モジュールが表示されるようになった。
アプリケーションナビゲータの中から、システムローカライズ → 変換 → ロケールのロードを選択(赤枠)。
※モジュールをクリックした時点でJavascriptが動作し、レコードが作成されます
再度ロケールテーブルを見るとレコードが追加されたことを確認できる。
補足:「ロケールのロード」モジュールは以降使わないので非アクティブに戻しても構いません
日本ユーザのデフォルト通貨を設定する
アプリケーションナビゲータの検索欄に、「sys_locale.list」と入力しEnterキーを押下する。
アクティブ列を見るとわかるが、まだ日本のロケールは非アクティブとなっているので有効化が必要。
補足:デフォルトでアクティブとなっているロケール
通貨コードをJPYで検索するなどして、「Japanese(Japan)」が名前のレコードを探して開く。
※もう一つは日付形式が異なるので見送り。こちらを有効化しても問題はない。
スクリプトインクルードの作成
アプリケーションナビゲータの中から、システム UI → スクリプトインクルードを選択(赤枠)。
以下の内容を設定して保存。
項目 | 値 |
---|---|
名前 | GetCurrencyTypeByUserLocale |
クライアントコール可能 | チェックあり |
説明 | 任意(または:ログインしているユーザの通貨コードを取得するサーバサイドスクリプト) |
アクセス可能 | すべてのアプリケーションスコープ |
アクティブ | チェックあり |
スクリプト
var GetCurrencyTypeByUserLocale = Class.create();
GetCurrencyTypeByUserLocale.prototype = Object.extendsObject(AbstractAjaxProcessor, {
getCurrencyType: function() {
var logginUser = gs.getUser();
var locale = new GlideRecord('sys_locale');
locale.addQuery('key', 'STARTSWITH', logginUser.getLanguage() + '.' + logginUser.getCountry());
locale.addQuery('active', 'true');
locale.setLimit(1);
locale.query();
if(locale.next()){
return locale.currency_code;
}
return void 0;
}
});
クライアントスクリプトの作成
今回はマーケティングイベントアプリケーションのマーケティングイベントテーブルに対して、新規レコード作成時に「予算」(budget)項目の通貨種類をユーザによって切り替える、簡単なスクリプトを作成する。
※ 全ページに対して、全通貨項目を動的に取得し更新するスクリプトも作成できましたが、動作が重くなってしまい諦めました。もし高速に動くスクリプトができた方はコメントください!
アプリケーションナビゲータの中から、システム定義 → クライアントスクリプトを選択(赤枠)。
以下の内容を設定して保存。
項目 | 値 |
---|---|
名前 | 任意 |
テーブル | マーケティングイベント |
UIタイプ | デスクトップ |
タイプ | onLoad |
アクティブ | チェックあり |
グローバル | チェックあり |
スクリプト
function onLoad() {
// This script is running only a new record
if(g_form.isNewRecord()){
var ga = new GlideAjax('global.GetCurrencyTypeByUserLocale');
ga.addParam('sysparm_name','getCurrencyType');
ga.getXML(CurrencyInit);
}
}
// Ajax callback function
function CurrencyInit(response) {
// `answer` equals return value
var answer = response.responseXML.documentElement.getAttribute("answer");
if(answer) {
g_form.setValue('budget', answer + ';0', answer + ';0');
}
}
動作確認
再ログインし、マーケティングイベントの新規作成画面を開くと日本円がデフォルト選択になったことを確認できます。
さいごに
今回作ったスクリプトは金額も強制的に0円で初期化しています。新規のレコードなので基本的に問題ありませんが、デフォルト金額を他のスクリプトで設定しているなどした場合には、競合しないように書き換える必要があります。
また、今回のスクリプトはモバイル非対応です。理由がわかっていないのでどなたかご指摘いただけますと助かります。
参考サイト
ServiceNow Community - How do I modify the default currency symbol? -
https://community.servicenow.com/thread/172803
ServiceNow Wiki - Script Includes -
http://wiki.servicenow.com/index.php?title=Script_Includes
ServiceNow Wiki - GlideAjax -
http://wiki.servicenow.com/index.php?title=GlideAjax