ServiceNow初期設定 ユーザによってデフォルトの通貨を切り替える

ServiceNowの開発者向けインスタンスは最初、マルチ通貨が有効化されており、またデフォルトの通貨はUSドルになっている。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/c761d151-f6ee-344f-b013-dcb73c22feea.png)

今回はログインしているユーザによってデフォルトの通貨を切り替える設定を行う。

マルチ通貨は有効のまま、全ユーザのデフォルト通貨を日本円にしたい場合は[こちらの記事](http://qiita.com/Kisaragi13/items/d0ab1a0bf622b0803591)を参照して下さい。
マルチ通貨を無効にし、日本円のみ利用可能にしたい場合は[こちらの記事](http://qiita.com/Kisaragi13/items/ba211ac6a5334f8c5d60)を参照してください。

インスタンスのビルドタイプはJakarta。

# 今回行う通貨コード設定の仕組み
いろいろと調べてみたところ、ServiceNowではユーザごとに通貨コードを変える仕組みが用意されていないらしい。
（サービスカタログ製品の価格（price）のみ自動で変換されるらしい）

> ServiceNow Community - How do I modify the default currency symbol? -
https://community.servicenow.com/thread/172803

そこで今回はスクリプトを自作し、強制的にデフォルト通貨を書き換えることにする。
**内容**
1. ログインしているユーザの言語、国コードを取得
2. 1で取得した内容を元に、ロケールテーブル（sys_locale）の設定を取得
3. 2で取得したロケールから通貨コードを取り出し、クライアントスクリプトからデフォルト通貨を設定する

# ロケールテーブルレコードの読み込み

インスタンスにログイン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/3f5b1f4f-f158-35e5-8456-1ef466299c53.png)

アプリケーションナビゲータの<font color="red">**検索欄**</font>に、「<font color="red">**sys_locale.list**</font>」と入力しEnterキーを押下する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/1bcdd3a0-534d-3bf0-2bb9-37df62c789fa.png)

ロケールレコード一覧画面が表示されるが、何もレコードが無いことを確認する。
※ レコードがある場合は[このセクション](http://qiita.com/Kisaragi13/items/19c3b20ff20772f75188#%E6%97%A5%E6%9C%AC%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%AE%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E9%80%9A%E8%B2%A8%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)まで作業をスキップしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/48f1f3f3-d79c-12ef-d75d-659e2dbf89dc.png)

アプリケーションナビゲータの中から、システム定義 → モジュールを選択（<font color="red">赤枠</font>）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/5748b1af-3ceb-7a66-a79a-e90bc0a7d7f3.png)

タイトルが「ロケールのロード」のモジュールを開く。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/ab94af5e-6e83-c61f-17a8-dd94c901774f.png)

モジュールをアクティブにし、更新ボタンをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/e139eef8-a102-eeb1-00c1-fbc32dfe28ea.png)

モジュールをアクティブにしたことで、モジュールが表示されるようになった。
アプリケーションナビゲータの中から、システムローカライズ → 変換 → ロケールのロードを選択（<font color="red">赤枠</font>）。
<font color="red">※モジュールをクリックした時点でJavascriptが動作し、レコードが作成されます</font>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/e022a787-9379-0878-bfcb-e90aa25f0f3d.png)

**Script completed**と表示されていれば成功。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/f4b6c0ab-851d-36a0-75ab-516d5785da9d.png)

再度ロケールテーブルを見るとレコードが追加されたことを確認できる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/1b0e8e7a-6b79-1819-e88e-e79a0fab06d5.png)

補足：「ロケールのロード」モジュールは以降使わないので非アクティブに戻しても構いません

# 日本ユーザのデフォルト通貨を設定する
アプリケーションナビゲータの<font color="red">**検索欄**</font>に、「<font color="red">**sys_locale.list**</font>」と入力しEnterキーを押下する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/1bcdd3a0-534d-3bf0-2bb9-37df62c789fa.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/1b0e8e7a-6b79-1819-e88e-e79a0fab06d5.png)

アクティブ列を見るとわかるが、まだ日本のロケールは非アクティブとなっているので有効化が必要。
<details><summary>補足：デフォルトでアクティブとなっているロケール</summary>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/0cf14c93-4bf4-177e-46b1-22a240f07f28.png)
</details>

通貨コードをJPYで検索するなどして、「**Japanese(Japan)**」が名前のレコードを探して開く。
※もう一つは日付形式が異なるので見送り。こちらを有効化しても問題はない。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/b9b8f4f5-de66-0c72-38a9-c385ca917cf4.png)

アクティブにチェックを入れ、更新ボタンをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/1c3aab6f-4f72-ec80-566b-013772ea3039.png)

# スクリプトインクルードの作成
アプリケーションナビゲータの中から、システム UI → スクリプトインクルードを選択（<font color="red">赤枠</font>）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/6a2d1f79-2b91-c4bc-0327-fb16a3a45668.png)

「**新規**」ボタンをクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/1c075449-7870-15df-5159-c5de5e1142dd.png)

以下の内容を設定して保存。

| 項目 | 値 |
|:-:|:-:|
| 名前 | GetCurrencyTypeByUserLocale |
| クライアントコール可能 | チェックあり |
| 説明 | 任意（または：ログインしているユーザの通貨コードを取得するサーバサイドスクリプト） |
| アクセス可能 | すべてのアプリケーションスコープ |
| アクティブ | チェックあり |

スクリプト

```js:
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;
	}
});
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/03d7c01d-b642-9e05-9b96-801072606f88.png)

# クライアントスクリプトの作成
今回は[マーケティングイベントアプリケーション](http://qiita.com/Kisaragi13/items/cd2eb97100c103a675ef)のマーケティングイベントテーブルに対して、新規レコード作成時に「予算」（budget）項目の通貨種類をユーザによって切り替える、簡単なスクリプトを作成する。
※ 全ページに対して、全通貨項目を動的に取得し更新するスクリプトも作成できましたが、動作が重くなってしまい諦めました。もし高速に動くスクリプトができた方はコメントください！

アプリケーションナビゲータの中から、システム定義 → クライアントスクリプトを選択（<font color="red">赤枠</font>）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/cc8a2a81-a5bd-3cec-3a17-128bacada210.png)

「**新規**」ボタンをクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/873e330e-c204-6353-6e10-406d8d16f11e.png)

以下の内容を設定して保存。

| 項目 | 値 |
|:-:|:-:|
| 名前 | 任意 |
| テーブル | マーケティングイベント |
| UIタイプ | デスクトップ |
| タイプ | onLoad |
| アクティブ | チェックあり |
| グローバル | チェックあり |

スクリプト

```js:
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');
	}
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/924e9e39-417a-4553-9299-95997d646986.png)

# 動作確認
ユーザ情報の「言語」、「国コード」を設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/9c3c387b-fc2e-e3ba-7e8b-9ac4df3e137b.png)

再ログインし、マーケティングイベントの新規作成画面を開くと日本円がデフォルト選択になったことを確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/e2fb848e-1efd-fe9d-31dd-7b0a0d786e12.png)

# さいごに
今回作ったスクリプトは金額も強制的に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

# 関連記事
> - [ServiceNow初期設定 インスタンスのデフォルトの通貨を日本円にする](http://qiita.com/Kisaragi13/items/d0ab1a0bf622b0803591)
> - [ServiceNow初期設定 インスタンスの通貨を日本円で固定化する（単一通貨モデルの設定）](http://qiita.com/Kisaragi13/items/ba211ac6a5334f8c5d60)