当記事では]project-open[5.0のRESTインターフェースの紹介として、RESTインターフェースの概要と簡単な動作確認を行います。
]project-open[ RESTインターフェースとは
]project-open[(以下POと略記)は、オープンシステムのERPシステムです。POには外部アプリケーションと連携する仕組みとして、RESTインターフェース(intranet-restパッケージ)が実装されています。
RESTインターフェースでPOの全機能を使用できるわけではありませんが、RESTインターフェースを使用することで、オブジェクトの読取り・書き込みをWEBサービスで公開する事ができます。(POでは、プロジェクト・ユーザー・請求書などをPOオブジェクトとして表現しています。)
POユーザーが実行可能な権限のみRESTインターフェースで操作することができ、POユーザー毎の権限はPOのGUI上で設定可能です。
↓POのRESTインターフェース公式ドキュメントは以下となります。
http://www.project-open.com/en/package-intranet-rest
RESTインターフェースのメリット
RESTインターフェースには以下のメリットがあります。
- 一般的なWEBサービスに近い設計であり、外部アプリケーションとの連携ができる。
- POユーザー毎に見せたい情報・見せたくない情報を管理できる。
- POが管理している情報を不整合なく安全に更新できる。
これらの特徴を利用して、外部アプリケーションとの連携を比較的容易にでき、業務効率化・見える化が進められます。
RESTインターフェースの動作確認を行う
実際にRESTインターフェースの動作確認を行ってみます。以下の環境で動作を確認しました。
- ]project-open[:Ver5.0 (VMWareアプライアンス版、CentOS7.4)
- RESTインターフェース:Ver3.0
- 実行結果のデータフォーマット:JSON
- 認証:Basic認証
- Python:3.8.1
今回動作確認を行うPO Ver5.0では、RESTインターフェースVerは3.0となっており、Ver1.0に対して仕様が一部変更になっています。
Ver3.0での大きな変更点として、実行結果として返却されるデータフォーマットの変更があります。
Ver1.X系では【XMLとHTML】でしたが、Ver3.0では【JSONとHMTL】に変更されています。
今回の動作確認はJSONデータフォーマットを使用します。
なお、POのRESTインターフェース公式ドキュメントでは、RESTインターフェースVer1.0について説明されており、Ver3.0のドキュメントは存在しません。
REST V1.0 Interface Details
http://www.project-open.com/en/package-intranet-rest
RESTインターフェースでPO勤怠管理機能を操作する
]project-open[には、POユーザーの勤怠(稼働状況)を管理する機能として、absence(不在)機能があります。
absence(不在)機能では、休暇の申請・更新・閲覧など休暇予定管理を行う事ができ、弊社アイティードゥでは勤怠管理として、こちらの機能を使用しています。
今回は、デフォルトのシステム管理者のID/パスワードを使用して認証を行い、absence(不在)機能の情報をRESTインターフェースで取得・更新・作成します。
※実際に運用する場合は、システム管理者のID/パスワードは変更してください。
動作確認はPythonスクリプトで実施します。
不在情報一覧を取得する(LIST)
以下、Pythonスクリプトで不在情報を一覧で取得します。
・queryパラメータを付加することにより、取得対象の絞り込みが可能となります。
(今回は、limit句で2件のみ取得しています。)
import requests
from requests.auth import HTTPBasicAuth
import json
# ユーザー名、パスワード(POのデフォルト システム管理者のユーザー名、パスワード)
user = 'sysadmin@tigerpond.com'
password = 'system'
obj_name = 'im_user_absence'
# 不在情報の一覧を取得する。
url = 'http://【POサーバのドメイン名】/intranet-rest/{}?format=json&limit=2'.format(obj_name)
print(url)
response = requests.get(url, auth=HTTPBasicAuth(user, password))
print(json.loads(response.text))
実行結果
・【success】で実行結果、【total】で取得件数、【data】で取得したプロジェクト詳細情報が返却されます。
{
"success": true,
"total": 2,
"message": "im_rest_get_object_type: Data loaded",
"data": [
{
"id": "41844",
"object_name": "Summer Vacation",
"title": "f",
"end_date": "2020-06-13 00:00:00-04",
"object_type": "im_user_absence",
"object_id": "41844",
"creation_date": "2018-10-29 00:00:00-04",
"start_date": "2020-06-09 00:00:00-04",
"modifying_ip": "192.168.0.24",
"description": "",
"package_id": "",
"owner_id": "624",
"vacation_replacement_id": "8887",
"receive_email_p": "t",
"modifying_user": "624",
"last_modified": "",
"last_audit_id": "2701",
"duration_days": "5.0",
"creation_user": "624",
"group_id": "",
"security_inherit_p": "t",
"contact_info": "",
"creation_ip": "127.0.0.1",
"context_id": "",
"absence_type_id": "5000",
"absence_id": "41844",
"absence_status_id": "16004",
"absence_name": "Summer Vacation"
},
{
"id": "53107",
"object_name": "不在テスト",
"title": "f",
"end_date": "2021-04-07 00:00:00-04",
"object_type": "im_user_absence",
"object_id": "53107",
"creation_date": "2021-04-05 03:15:39.152324-04",
"start_date": "2021-04-06 00:00:00-04",
"modifying_ip": "192.168.207.110",
"description": "不在テスト",
"package_id": "",
"owner_id": "624",
"vacation_replacement_id": "",
"receive_email_p": "t",
"modifying_user": "0",
"last_modified": "",
"last_audit_id": "17058",
"duration_days": "2.0",
"creation_user": "624",
"group_id": "",
"security_inherit_p": "t",
"contact_info": "",
"creation_ip": "127.0.0.1",
"context_id": "",
"absence_type_id": "5000",
"absence_id": "53107",
"absence_status_id": "16004",
"absence_name": "不在テスト"
}
]
}
不在情報IDを指定して詳細情報を取得する(READ)
以下Pythonスクリプトで、不在情報のID【53108】を指定し、不在情報を取得します。
import requests
from requests.auth import HTTPBasicAuth
import json
user = 'sysadmin@tigerpond.com'
password = 'system'
obj_name = 'im_user_absence'
obj_id = 53108
url = 'http://【POサーバのドメイン名】/intranet-rest/{}/{}?format=json'.format(obj_name, obj_id)
print(url)
response = requests.get(url, auth=HTTPBasicAuth(user, password))
print(json.loads(response.text))
実行結果
【success】で実行結果、【data】で取得したプロジェクト詳細情報が返却されます。
{
"success": true,
"total": 1,
"message": "im_rest_get_object_type: Data loaded",
"data": [
{
"id": "53108",
"object_name": "不在テスト",
"title": "f",
"end_date": "2021-03-07 00:00:00-05",
"object_type": "im_user_absence",
"object_id": "53108",
"creation_date": "2021-04-05 03:40:00.79023-04",
"start_date": "2021-03-06 00:00:00-05",
"modifying_ip": "192.168.207.110",
"description": "不在テスト",
"package_id": "",
"owner_id": "624",
"vacation_replacement_id": "",
"receive_email_p": "t",
"modifying_user": "0",
"last_modified": "",
"last_audit_id": "17059",
"duration_days": "2.0",
"creation_user": "624",
"group_id": "",
"security_inherit_p": "t",
"contact_info": "",
"creation_ip": "127.0.0.1",
"context_id": "",
"absence_type_id": "5000",
"absence_id": "53108",
"absence_status_id": "16004",
"absence_name": "不在テスト"
}
]
}
POの不在情報を更新する(UPDATE)
以下Pythonスクリプトで、不在情報IDを指定し、不在期間(duration_days)を更新します。
import requests
from requests.auth import HTTPBasicAuth
import json
user = 'sysadmin@tigerpond.com'
password = 'system'
obj_name = 'im_user_absence'
obj_no = 53108
url = "http://【POサーバのドメイン名】/intranet-rest/{}/{}?format=json".format(obj_name, obj_no)
print(url)
# 対象オブジェクトの【属性値と値】をセットにして、辞書型を文字列に変換する
item = {'duration_days': 2.0 }
print(item)
item_json = json.dumps(item)
print(item_json)
response = requests.post(
url,
item_json,
auth=HTTPBasicAuth(user, password))
print(json.loads(response.text))
実行結果
【success】で実行結果、【message】で操作(updated)、【data】で更新を行ったプロジェクト詳細情報が返却されます。
{
"success": "true",
"message": "Object updated",
"data": [
{
"duration_days": "2.0"
}
]
}
POの不在情報を新規作成する(CREATE)
POオブジェクトをRESTインターフェースで作成する場合、リクエストBODYに必須情報を付加する必要があります。
POの不在情報を作成する上での必須情報は、【absence_name, owner_id, duration_days, absence_type_id, absence_status_id, start_date, end_date, description】となります。
以下Pyhthonスクリプトで、不在情報を新規作成します。
import requests
from requests.auth import HTTPBasicAuth
import json
user = 'sysadmin@tigerpond.com'
password = 'system'
obj_name = 'im_user_absence'
url = "http://【POサーバのドメイン名】/intranet-rest/{}".format(obj_name)
print(url)
# 対象オブジェクトの【属性値と値】をセットにして、辞書型を文字列に変換する
item = {
'absence_name' : '不在テスト',
'owner_id' : '624',
'duration_days' : '2.0',
'absence_type_id' : '5000',
'absence_status_id' : '16004',
'start_date' : '2021-03-08',
'end_date' : '2021-03-09',
'description' : '不在テスト'
}
print(item)
item_json = json.dumps(item)
print(item_json)
response = requests.post(
url,
item_json,
auth=HTTPBasicAuth(user, password))
print(json.loads(response.text))
実行結果
【success】で実行結果、【message】で操作(create)、【data】で新規作成した不在情報が返却されます。
{
"success": "true",
"message": "Object created",
"data": [
{
"description": "不在テスト",
"end_date": "2021-03-09",
"absence_status_id": "16004",
"absence_name": "不在テスト",
"rest_oid": "53127",
"absence_id": "53127",
"absence_type_id": "5000",
"duration_days": "2.0",
"object_id": "53127",
"start_date": "2021-03-08",
"owner_id": "624"
}
]
}
※POオブジェクト新規作成時の必須パラメータ
RESTインターフェースでPOオブジェクトを新規作成する際には、リクエスト時の必須パラメータをリクエストURLに含める必要があります。
例えば、POプロジェクト(im_project)を新規作成する場合は、【project_nameとproject_nr】をリクエストURLに付加します。
以下にPOオブジェクトのRESTインターフェース対応状況、新規作成時リクエスト時の必須パラメータを以下の表にまとめました。
POオブジェクト | リスト取得(LIST) 情報取得(READ) 更新(UPDATE) | 新規作成 (CREATE) | 新規作成リクエスト時の 必須パラメータ |
group | ○ | × | |
im_biz_object_member | ○ | ○ | object_id_one, object_id_two |
im_company | ○ | ○ | company_name |
im_company_employee_rel | ○ | ○ | object_id_one, object_id_two |
im_conf_item | ○ | × | |
im_conf_item_project_rel | ○ | × | |
im_cost_center | ○ | × | |
im_expense | ○ | × | |
im_expense_bundle | ○ | × | |
im_forum_topic | ○ | × | |
im_fs_file | ○ | × | |
im_invoice | ○ | ○ | invoice_nr, customer_id, provider_id, cost_status_id, cost_type_id |
im_key_account_rel | ○ | ○ | object_id_one, object_id_two |
im_material | ○ | × | |
im_office | ○ | × | |
im_profile | ○ | × | |
im_project | ○ | ○ | project_name, project_nr |
im_release_item | ○ | × | |
im_rest_object_type | ○ | × | |
im_ticket | ○ | ○ | project_name, project_nr |
im_ticket_queue | ○ | × | |
im_ticket_ticket_rel | ○ | ○ | object_id_one, object_id_two |
im_timesheet_invoice | ○ | × | |
im_timesheet_task | ○ | ○ | project_name, project_nr, parent_id, project_status_id, project_type_id, uom_id, material_id |
im_trans_invoice | ○ | × | |
im_trans_task | ○ | ○ | task_name, project_id, task_type_id, task_status_id, source_language_id, target_language_id, task_uom_id |
im_user_absence | ○ | ○ | absence_name, owner_id, duration_days, adsence_type_id, absence_status_id, start_date, end_date, description |
membership_rel | ○ | ○ | object_id_one, object_id_two |
party | ○ | × | |
person | ○ | × | |
relationship | ○ | × | |
user | ○ | ○ | first_names, last_name |
まとめ
RESTインターフェースを使用する事で、外部アプリケーションから]project-open[の情報取得・更新・作成を行うことが可能です。]project-open[上の全ての操作に対応していないので何ができるか確認が必要ですが。
例えば、SlackやChatworkなどクラウドチャットシステムと連携する活用事例は以下です。
- 今週のPO休暇情報を自動的にチャットに投稿する。
- POプロジェクトの進捗率が予定通り進んでない場合、アラートを飛ばす。
- 未処理のPO請求書があったらリマインドする。
上記一例ですが、アイデア次第で]project-open[をもっと便利にすることができます。
弊社では、]project-open[の情報を発信しています。
↓ ]project-open[に興味がありましたら、弊社]project-open[の紹介記事をご覧下さい。
]project-open[の紹介