# Trading and Finance (ERP)

Version: 1.1 | Release Date: 7/12/2018

# Basic Web Services

# Get Business Rules of a Module

Get business rules' keys of a module under a specific Business Entity.


HTTP Request

GET http://[server]/jsf/rfws/erp/bsrule/getBsRules/{module}/{beId}


Parameters

Name Type Description
module string(Path) Required. Module type. Can be found in data dictionary.
beId int(Path) Required. Business entity ID

Result (In JSON Array)

Name Type Description
mess string messCode of the business rule
key string Key of the business rule

Sample request:

OkHttpClient client = new OkHttpClient();

String module = "oldso";
int beId = "1";

String url = "http://" + server + "/jsf/rfws/erp/bsrule/getBsRules/"
  + module + "/" + beId;

Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", clientID)
  .addHeader("authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .build();

Response response = client.newCall(request).execute();

Sample response:

[
	{"mess":"ce01_core.bsrule_blcus","key":"core_blCus_0"},
	{"mess":"ce01_core.bsrule_blven","key":"core_blVen_0"},
	{"mess":"ce01_core.bsrule_overship(sosi)","key":"oldso_overShip(si)_0"},
	{"mess":"ce01_core.bsrule_underPrice","key":"oldso_underPrice_0"},
	{"mess":"ce01_core.bsrule_overship(so)","key":"oldso_overShip_0"}
]



# Check Business Rules for a Transaction

Check a transaction record for all configured business rules.


HTTP Request

GET http://[server]/jsf/rfws/erp/bsrule/chkBsRules/{module}/{id}


Parameters

Name Type Description
module string(Path) Required. Module type
id int(Path) Required. ID of the record

Result (In JSON Array)

Name Type Description
key string Key of the business rule
canSave boolean true if M18 will allow saving
status boolean true if business checking passed

Sample request:

OkHttpClient client = new OkHttpClient();

String module = "oldso";
int id = "4";	// SO id , get by getIdByCode

String url = "http://" + server + "/jsf/rfws/erp/bsrule/chkBsRules/"
  + module + "/" + id;

Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", clientID)
  .addHeader("authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .build();

Response response = client.newCall(request).execute();

Sample response:

[
	{"canSave":false,"key":"oldso_overShip(si)_0","status":false},
	{"canSave":false,"key":"oldso_underPrice_0","status":false},
	{"canSave":false,"key":"oldso_overShip_0","status":false}
]



# Check a Specific Business Rule for a Transaction

Check a transaction record for a specified business rule. The key of the business rule can be retrieved by the get business rules web service.


HTTP Request

GET http://[server]/jsf/rfws/erp/bsrule/chkBsRules/{module}/{id}/{key}


Parameters

Name Type Description
module string(Path) Required. Module type
id int(Path) Required. ID of the record
key string(Path) Required. Key of the business rule

Result

Name Type Description
canSave boolean true if M18 will allow saving
status boolean true if business checking passed

Sample request:

OkHttpClient client = new OkHttpClient();

String module = "oldso";
int id = "4";	// SO id , get by getIdByCode
String key = "oldso_overShip(si)_0";	// key of business rule

String url = "http://" + server + "/jsf/rfws/erp/bsrule/chkBsRules/"
  + module + "/"
  + id + "/"
  + key;

Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", clientID)
  .addHeader("authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .build();

Response response = client.newCall(request).execute();

Sample response:

{"canSave":false,"status":false}



# Get Blacklist Status of a Customer/Vendor

Determine if the customer/vendor is blacklisted.


HTTP Request

GET http://[server]/jsf/rfws/erp/query/blackstatus/{searchName}


Parameters

Name Type Description
searchName string(Path) Required. cus for customer or ven for vendor
id int(Query) Required. Customer or vendor ID

Result

Name Type Description
blacklisted boolean true if blacklisted

Sample request:

OkHttpClient client = new OkHttpClient();

String searchName = "cus";
int id = "28";	// customer id

String url = "http://" + server + "/jsf/rfws/erp/query/blackstatus/"
  + searchName + "?id=" + id;

Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", clientID)
  .addHeader("authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .build();

Response response = client.newCall(request).execute();

Sample response:

{blacklisted: true}



# Get Exchange Rate of a Currency

Get exchange rate of a currency, relative to entity currency, as at a given date.


HTTP Request

GET http://[server]/jsf/rfws/erp/query/getRate


Parameters

Name Type Description
curId int(Header) Required. Currency ID
domCurId int(Header) Required. Entity Currency ID
tDate date(Header) Required. Transaction Date

Result (in JSON Array: "values")

Name Type Description
openRate decimal Average Exchange Rate
closeRate decimal Closing Exchange Rate

Sample request:

OkHttpClient client = new OkHttpClient();

String url = "http://" + server + "/jsf/rfws/erp/query/getRate/";

Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", clientID)
  .addHeader("authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .addHeader("curId", "1")
  .addHeader("domCurId", "2")
  .addHeader("tDate", "2017-03-01")
  .build();

Response response = client.newCall(request).execute();

Sample response:

{
	"size":1,
	"values":[{"openRate":1.1,"closeRate":1.1}],
	"name":"",
	"fields":[{"fieldClassName":"Double","name":"openRate","fieldClass":"java.lang.Double","classType":10},{"fieldClassName":"Double","name":"closeRate","fieldClass":"java.lang.Double","classType":10}]
}



# Get Child Companies of a Group Customer/Vendor

Get a list of customers'/vendors' IDs of all child companies from a group company customer / vendor.


HTTP Request

GET http://[server]/jsf/rfws/erp/query/getGroupCli


Parameters

Name Type Description
cliType string(Header) Required. cus for customer or ven for vendor
cliId int(Header) Required. ID of customer or vendor
loadGpCoData int(Header) Required. Please always input 1

Result (in JSON Array: "values")

Name Type Description
cliId string , separated ID list of child companies (customer/vendor)

Sample request:

OkHttpClient client = new OkHttpClient();

String url = "http://" + server + "/jsf/rfws/erp/query/getGroupCli/";

Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", clientID)
  .addHeader("authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .addHeader("cliType", "cus")
  .addHeader("cliId", "119")
  .addHeader("loadGpCoData", "1")
  .build();

Response response = client.newCall(request).execute();

Sample response:

{
	"size":1,
	"values":[{"cliId":"119,120"}],
	"name":"",
	"fields":[{"fieldClassName":"String","name":"cliId","fieldClass":"java.lang.String","classType":0}]
}



# Update Frozen Period Date

Update frozen date for a specified frozen period type.


HTTP Request

PUT http://[server]/jsf/rfws/erp/frozen/saveDate/{beId}/{frozenTypeId}/{frozenDate}


Parameters

Name Type Description
beId int(Path) Required. Business entity ID
frozenTypeId int(Path) Required. Frozen period type ID
frozenDate date(Path) Required. Frozen date

Result

Name Type Description
status string Field only exists if update failed.
message string Field only exists if update failed.

Sample request:

OkHttpClient client = new OkHttpClient();

int beId = 1;
int frozenTypeId = 18;
String frozenDate = "2017-10-23";

String url = "http://" + server + "/jsf/rfws/erp/frozen/saveDate/"
  + beId + "/"
  + frozenTypeId + "/"
  + frozenDate;

Request request = new Request.Builder()
  .url(url)
  .put(reqruestBody)
  .addHeader("client_id", clientID)
  .addHeader("authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .build();

Response response = client.newCall(request).execute();

Sample response:

{
	"size":0,
	"values":[],
	"name":"",
	"fields":[{"fieldClassName":"String","name":"status","fieldClass":"java.lang.String","classType":0},{"fieldClassName":"String","name":"message","fieldClass":"java.lang.String","classType":0}]
}



# Get Latest Frozen Period of an Editor

Get the latest frozen period and its date of an editor for a business entity.


HTTP Request

GET http://[server]/jsf/rfws/erp/frozen/getLatestFrozenPeriod/{beId}/{menuCode}


Parameters

Name Type Description
beId int(Path) Required. Business entity ID
menuCode string(Path) Required. Menu code of the editor. Can be found in data dictionary.

Result (in JSON Array: "values")

Name Type Description
frozenDate date Frozen date
frozenTypeId int Frozen period type's ID
modifyUid int Modify user ID
modifyDate date Modified date

Sample request:

OkHttpClient client = new OkHttpClient();

int beId = 3;
String menuCode = "k";

String url = "http://" + server + "/jsf/rfws/erp/frozen/getLatestFrozenPeriod/"
  + beId + "/"
  + menuCode;

Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", clientID)
  .addHeader("authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .build();

Response response = client.newCall(request).execute();

Sample response:

{
	"size":1,
	"values":[{"beId":3,"frozenDate":"2017-06-12 00:00:00","modifyUid":8,"modifyDate":"2017-10-12 09:10:47","frozenTypeId":19,"id":40}],
	"name":"",
	"fields":[{"fieldClassName":"Long","name":"id","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"Long","name":"beId","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"Long","name":"frozenTypeId","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"Date","name":"frozenDate","fieldClass":"java.util.Date","classType":21},{"fieldClassName":"Date","name":"modifyDate","fieldClass":"java.util.Date","classType":21},{"fieldClassName":"Long","name":"modifyUid","fieldClass":"java.lang.Long","classType":10}]
}



# Search Lookup Data

Search lookup data using data filter's conditions.


HTTP Request

GET http://[server]/jsf/rfws/erp/search/searchData/{beId}/{searchName}


Parameters

Name Type Description
beId int(Path) Required. Business entity ID
searchName string(Path) Required. Lookup code. Can be found in data dictionary.
conds string(Header) Data filter's conditions, if not input, all data will be selected. Format please refer to the sample request
field string(Header) Extra fields needed. Format please refer to the sample request
params string(Header) Parameters to control the number of rows returned

Result

Name Type Description
size int Number of records returned
values array JSON Array of returned data
fields array JSON Array of returned fields' detail

Sample request:

OkHttpClient client = new OkHttpClient();

String beId = "24";
String searchName = "cusbank";
String fields = "[\"iRev\"]";
String conds = "[{\"leftField\":\"bkopAc\",\"operator\":\"=\",\"rightField\":\"135791011\"}]";
String params = "{\"startRow\":0,\"endRow\":0}";

String url = "http://" + server + "/jsf/rfws/erp/search/searchData/"
  + beId + "/"
  + searchName;

Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", clientID)
  .addHeader("authorization", "Bearer " + token)
  .addHeader("field", fields)
  .addHeader("conds", conds)
  .addHeader("params", params)
  .addHeader("cache-control", "no-cache")
  .build();

Response response = client.newCall(request).execute();

Sample response:

{
	"size":3,
	"values":[{"bkopName":"Hang Seng Bank","bkopNo":"HS","iRev":92,"id":4,"bkopAc":"135791011"},{"bkopName":"Hang Seng Bank","bkopNo":"HS","iRev":1,"id":9,"bkopAc":"135791011"},{"bkopName":"Hang Seng Bank","bkopNo":"HS","iRev":4,"id":11,"bkopAc":"135791011"}],
	"name":"",
	"fields":[{"fieldClassName":"String","name":"bkopNo","fieldClass":"java.lang.String","classType":0},{"fieldClassName":"String","name":"bkopAc","fieldClass":"java.lang.String","classType":0},{"fieldClassName":"String","name":"bkopName","fieldClass":"java.lang.String","classType":0},{"fieldClassName":"Integer","name":"iRev","fieldClass":"java.lang.Integer","classType":10},{"fieldClassName":"Long","name":"id","fieldClass":"java.lang.Long","classType":10}]
}



# Search Table Data by Code

Search data in a table using code.


HTTP Request

GET http://[server]/jsf/rfws/erp/search/code/{tableName}/{code}


Parameters

Name Type Description
tableName string(Path) Required. Table name. Can be found in data dictionary
code string(Path) Required. Code

Result (in JSON Array)

Name Type Description
size int Number of records returned
values string JSON Array of returned data
fields string JSON Array of returned fields' detail

Sample request:

OkHttpClient client = new OkHttpClient();

String tableName = "cus";
String code = "C0001";

String url = "http://" + server + "/jsf/rfws/erp/search/code/"
  + tableName + "/"
  + code;

Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", clientID)
  .addHeader("authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .build();

Response response = client.newCall(request).execute();

Sample response:

{
	"size":1,
	"values":[{"cDate":"2016-08-05 17:10:44","lastModifyUid":4,"code":"C0001","expiredDate":"1900-01-01 00:00:00","iRev":14,"i18nField":"{\"desc_en\": \"Test Customer\"}","regionId":1,"udfPJPtestDate":"1900-01-01 00:00:00","id":1,"statusModifyDate":"2016-08-05 17:10:44","lastModifyDate":"2016-08-17 16:44:44","createUid":7,"createDate":"2016-08-05 17:10:44","status":"Y","desc":"Test Customer"}],
	"name":"",
	"fields":[{"fieldClassName":"Long","name":"id","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"Integer","name":"iRev","fieldClass":"java.lang.Integer","classType":10},
...              {"fieldClassName":"String","name":"udfPJPstring1","fieldClass":"java.lang.String","classType":0},{"fieldClassName":"String","name":"i18nField","fieldClass":"java.lang.String","classType":0}]
}



# Search Table Data By ID

Search data in a table using ID.


HTTP Request

GET http://[server]/jsf/rfws/erp/search/id/{tableName}/{id}


Parameters

Name Type Description
tableName string(Path) Required. Table name. Can be found in data dictionary
id int(Path) Required. Record's ID

Result (in JSON Array)

Name Type Description
size int Number of records returned
values string JSON Array of returned data
fields string JSON Array of returned fields' detail

Sample request:

OkHttpClient client = new OkHttpClient();

String tableName = "cus";
int id = 12;

String url = "http://" + server + "/jsf/rfws/erp/search/id/"
  + tableName + "/"
  + id;

Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", clientID)
  .addHeader("authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .build();

Response response = client.newCall(request).execute();

Sample response:

{
	"size":1,
	"values":[{"cDate":"2016-10-04 15:34:59","lastModifyUid":12,"code":"WL-001CUS","expiredDate":"1900-01-01 00:00:00","iRev":17,"ad2":"5678","telCountry":"852","ad1":"1234","i18nField":"{\"ad1_en\": \"1234\", \"ad2_en\": \"5678\", \"desc_en\": \"Wilson Lau\", \"country_en\": \"\"}","regionId":2,"udfPJPtestDate":"1900-01-01 00:00:00","id":12,"statusModifyDate":"2016-10-04 15:34:59","lastModifyDate":"2017-04-20 15:21:33","createUid":12,"createDate":"2016-10-04 15:34:59","status":"Y","desc":"Wilson Lau"}],
	"name":"",
	"fields":[{"fieldClassName":"Long","name":"id","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"Integer","name":"iRev","fieldClass":"java.lang.Integer","classType":10},
...              {"fieldClassName":"String","name":"udfPJPstring1","fieldClass":"java.lang.String","classType":0},{"fieldClassName":"String","name":"i18nField","fieldClass":"java.lang.String","classType":0}]
}



# Search Table Data by SQL Conditions

Search table data using SQL's WHERE conditions.


HTTP Request

GET http://[server]/jsf/rfws/erp/search/cond/{tableName}


Parameters

Name Type Description
tableName string(Path) Required. Table name. Can be found in data dictionary
cond string(Header) SQL's WHERE conditions. If empty, all data will be selected.
rowLimit int(Header) Row limit of returned result

Result (in JSON Array)

Name Type Description
size int Number of records returned
values string JSON Array of returned data
fields string JSON Array of returned fields' detail

Sample request:

OkHttpClient client = new OkHttpClient();

String tableName = "cus";
String cond = "iRev=14";

String url = "http://" + server + "/jsf/rfws/erp/search/cond/"
  + tableName;

Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", clientID)
  .addHeader("authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .addHeader("cond", cond)
  .addHeader("rowLimit", "5").build();
  .build();

Response response = client.newCall(request).execute();

Sample response:

{
	"size":3,
	"values":[{"cDate":"2016-08-05 17:10:44","lastModifyUid":4,"code":"C0001","expiredDate":"1900-01-01 00:00:00","iRev":14,"i18nField":"{\"desc_en\": \"Test Customer\"}","regionId":1,"udfPJPtestDate":"1900-01-01 00:00:00","id":1,"statusModifyDate":"2016-08-05 17:10:44","lastModifyDate":"2016-08-17 16:44:44","createUid":7,"createDate":"2016-08-05 17:10:44","status":"Y","desc":"Test Customer"},{"cDate":"2016-08-05 17:30:55","lastModifyUid":20,"code":"P001-1","expiredDate":"1900-01-01 00:00:00","iRev":14,"i18nField":"{\"desc_en\": \"Doduo 1\"}","groupCoId":2,"regionId":1,"udfPJPtestDate":"1900-01-01 00:00:00","id":3,"statusModifyDate":"2016-08-05 17:30:55","lastModifyDate":"2017-07-12 18:03:37","createUid":4,"createDate":"2016-08-05 17:30:55","status":"Y","desc":"Doduo 1"},{"cDate":"2016-10-13 00:00:00","lastModifyUid":17,"code":"cus-021","expiredDate":"1900-01-01 00:00:00","iRev":14,"ad2":"地址第二行","ad1":"地址第一行","ad4":"地址第四行","webSite":"wwww.multiable.com","ad3":"地址第三行","i18nField":"{\"ad1_en\": \"地址第一行\", \"ad2_en\": \"地址第二行\", \"ad3_en\": \"地址第三行\", \"ad4_en\": \"地址第四行\", \"desc_en\": \"Phone Test Customer\", \"ad1_zh-CN\": \"地址第一行\", \"ad2_zh-CN\": \"地址第二行\", \"ad3_zh-CN\": \"地址第三行\", \"ad4_zh-CN\": \"地址第四行\", \"country_en\": \"\", \"desc_zh-CN\": \"手机测试客户\"}","regionId":10,"udfPJPtestDate":"1900-01-01 00:00:00","id":34,"statusModifyDate":"2016-10-13 10:37:23","lastModifyDate":"2017-09-13 11:17:58","createUid":12,"email":"multiable@mac.sz","createDate":"2016-10-13 11:31:29","status":"Y","desc":"Phone Test Customer"}],
	"name":"",
	"fields":[{"fieldClassName":"Long","name":"id","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"Integer","name":"iRev","fieldClass":"java.lang.Integer","classType":10},{"fieldClassName":"Long","name":"beId","fieldClass":"java.lang.Long","classType":10},
              ...]
}



# Upload Product's Photo

Update a single product photo to an existing product.


HTTP Request

POST http://[server]/jsf/rfws/erp/pro/proPhoto/{id}


Parameters

Name Type Description
id int(Path) Required. Product ID
img file(Entity) Required. The photo's file. Please refer to the request sample.
photoInfo string(Query) Required. A JSON string of photo info.

photoInfo (in JSON Object)

Name Type Description
photoCode string Photo's code. If empty, it implies adding new photo, otherwise it implies updating photo.
photoDesc string Photo description
print int Print. 1 implies true. 0 implies false. Default as 0.
expired int Expired. 1 implies true. 0 implies false. Default as 0.

Result

Name Type Description
message string success

Sample request:

OkHttpClient client = new OkHttpClient();

String path = "C:\\Users\\Public\\Pictures\\Sample Pictures\\Sample.jpg";
File file = new File(path);
int id = 3920;	// product id
JsonObject photoInfo = new JsonObject();
photoInfo.addProperty("photoCode", "003");
photoInfo.addProperty("photoDesc", "003 photo");
photoInfo.addProperty("print", 0);
photoInfo.addProperty("expired", 0);

String url = "http://" + server + "/jsf/rfws/erp/pro/proPhoto/"
  + id + "?photoInfo="
  + URLEncoder.encode(photoInfo.toString(), "UTF-8");

RequestBody requestBody = new MultipartBody
  .Builder()
  .setType(MultipartBody.FORM)
  .addFormDataPart("img", null,
                   RequestBody.create(MediaType.parse("application/jpg"), file))
  .build();

Request request = new Request.Builder()
  .post(requestBody)
  .url(url)
  .addHeader("client_id", MyValue.clientID)
  .addHeader("Authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .build();

Response response = client.newCall(request).execute();

Sample response:

{"message":"success"}



# Close/Unclose Transactions

Transactions closed status maintenance.


HTTP Request

GET http://[server]/jsf/rfws/erp/closedSetting/updateData


Parameters

Name Type Description
module String(Query) Required. Module type. Can be found in data dictionary.
beCode int(Query) Required. Business Entity Code.
isClosing boolean(Query) Required. true if the transaction need to be closed.
tranInfo json(Query) Required. JSON String of transactions info.

tranInfo (in JSON Array) (Trading App)

Name Type Description
tranCode String Required. Transaction Code
proCode String Required. Product Code
lot string Required. Lot

tranInfo (in JSON Array) (Finance App)

Name Type Description
tranCode String Required. Transaction Code

Result

Name Type Description
message String success

Sample request:

OkHttpClient client = new OkHttpClient();

JSONArray array = new JSONArray();
JSONObject obj = new JSONObject();
obj.put("tranCode", "SO0170356");
obj.put("proCode", "NOTE1");
obj.put("lot", "A");
array.put(obj);

obj = new JSONObject();
obj.put("tranCode", "SO0170356");
obj.put("proCode", "NOTE1");
obj.put("lot", "B");
array.put(obj);

HttpUrl url = HttpUrl.parse("http://" + server + "/jsf/rfws/erp/closedSetting/updateData");
url = url.newBuilder()
  .addQueryParameter("module", "oldso")
  .addQueryParameter("beCode", "SM")
  .addQueryParameter("isclosing", "true")
  .addQueryParameter("tranInfo", URLEncoder.encode(array.toString(), "UTF-8"));
  
Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", MyValue.clientID)
  .addHeader("Authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .build();

Response response = client.newCall(request).execute();

Sample response:

{"message":"success"}




# Update Module Header UDF Fields

Module Header UDF Fields maintenance.


HTTP Request

POST http://[server]/jsf/rfws/erp/dataSync/updateHeaderUdfFields/[menuCode]


Parameters

Name Type Description
menuCode String(Path) Required. Menu Code in navmenu.xml.
tranInfo json(Entity) Required. JSON String of transactions info.

tranInfo (in JSON Object)

Name Type Description
updateTableName String Required. Table name of need to update
code String Required. Transaction Code
beId long Required. BE (or you can input 'beCode')
udfxxxx Object Update field name. (if lookup field, you also can input 'xxxxCode')

Result

Name Type Description
status Boolean Show update success or failed
message String Show update message

Sample request:

OkHttpClient client = new OkHttpClient();

JSONObject obj = new JSONObject();
obj.put("updateTableName", "mainup");
obj.put("code", "UPL180011");
obj.put("beId", "142");// or obj.put("beCode", "MX3");
obj.put("udfmxstr", "aaaa");
obj.put("udfmxnum", "1");
obj.put("udfmxdate", "2021-07-21 00:00:00");
obj.put("udfmxlookup", "17"); // or obj.put("udfmxlookupCode", "040");

RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), obj.toString());

HttpUrl url = HttpUrl.parse("http://" + server + "/jsf/rfws/erp/dataSync/updateHeaderUdfFields/uplist");
url = url.newBuilder()
  .addQueryParameter("tranInfo", URLEncoder.encode(array.toString(), "UTF-8"));
  
Request request = new Request.Builder()
  .url(url)
  .addHeader("client_id", MyValue.clientID)
  .addHeader("Authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .post(requestBody)
  .build();

Response response = client.newCall(request).execute();

Sample response:

{"message":"success"}



#

# Trading Web Services

# Get Remark Data of Transactions

Get remark data of transactions.


HTTP Request

GET http://[server]/jsf/rfws/erp/trdg/common/getRemTable/{mainTable}/{remTable}


Parameters

Name Type Description
mainTable string(Path) Required. Main table name
remTable string(Path) Required. Remark table name
tranIds string(Header) Required. List of transaction IDs. , separated.

Result (in JSON Array: "values")

Name Type Description
serialNo string Transaction code
remarks string Remarks
ce01Module string Module type
i18nField string JSON Array contains remarks in different languages

Sample request:

OkHttpClient client = new OkHttpClient();

String mainTable = "maink";
String remTable = "remk";

String url = "http://" + server + "/jsf/rfws/erp/trdg/common/getRemTable/"
  + mainTable + "/"
  + remTable;

Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", clientID)
  .addHeader("authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .addHeader("tranIds", "71")
  .build();

Response response = client.newCall(request).execute();

Sample response:

{
	"size":1,
	"values":[{"hId":71,"i18nField":"{\"remarks_en\": \"\"}","iRev":1,"id":71,"serialNo":"K00160089","ce01Module":"st"}],
	"name":"",
	"fields":[{"fieldClassName":"String","name":"serialNo","fieldClass":"java.lang.String","classType":0},{"fieldClassName":"Long","name":"id","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"Long","name":"hId","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"String","name":"remarks","fieldClass":"java.lang.String","classType":0},{"fieldClassName":"String","name":"ce01Module","fieldClass":"java.lang.String","classType":0},{"fieldClassName":"Integer","name":"iRev","fieldClass":"java.lang.Integer","classType":10},{"fieldClassName":"String","name":"i18nField","fieldClass":"java.lang.String","classType":0}]
}



# Get Product Packing Information

Get product packing information by product ID , unit ID and packing unit ID.


HTTP Request

GET http://[server]/jsf/rfws/erp/trdg/price/propack/


Parameters

Name Type Description
proInfo string(Header) Required. Product information. Format please refer to the sample request

Result (in JSON Array: "values")

Name Type Description
hId int Product / Material ID
innerQty decimal Inner Qty
perCtn decimal Qty / Packing Unit
packingUnitCode string Packing Unit Code
heightCm decimal Height (cm)
bmctn decimal CBM / CTN
innerUnitCode string Inner Unit Code
packingUnitId int Packing Unit ID
nwkg decimal N.W. / CTN (kg)
proId int Product ID
outQty decimal Qty / Packing Unit
innerUnitId int Inner Unit ID
widthCm decimal Width (cm)
unitId int Base Unit ID
lengthCm decimal Length (cm)
gwkg decimal G.W. / CTN (kg)
outUnitId int Unit ID

OkHttpClient client = new OkHttpClient();

String url = "http://" + server + "/jsf/rfws/erp/trdg/price/propack"
String proInfo = "(proId, unitId, packingUnitId) values (3,2,4)";

Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", MyValue.clientID)
  .addHeader("authorization", "Bearer " + access_token)
  .addHeader("cache-control", "no-cache")
  .addHeader("proInfo", proInfo)
  .build();

Response response = client.newCall(request).execute();

Sample response:

{
	"size":2,
	"values":[{"hId":3,"innerQty":3.0,"perCtn":5.0,"packingUnitCode":"BOX","heightCm":12.0,"bmctn":0.001,"iRev":22,"itemNo":"     1","innerUnitCode":"个","packingUnitId":4,"nwkg":4.0,"proId":3,"outQty":5.0,"innerUnitId":1,"widthCm":11.0,"unitId":2,"id":1,"lengthCm":10.0,"gwkg":5.0,"outUnitId":1},{"hId":3,"innerQty":6.0,"perCtn":10.0,"packingUnitCode":"BOX","heightCm":24.0,"bmctn":0.011,"iRev":22,"itemNo":"     2","innerUnitCode":"个","packingUnitId":4,"nwkg":8.0,"proId":3,"outQty":10.0,"innerUnitId":1,"widthCm":22.0,"unitId":2,"id":2,"lengthCm":20.0,"gwkg":10.0,"outUnitId":1}],
	"name":"",
	"fields":[{"fieldClassName":"Long","name":"id","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"Double","name":"lengthIn","fieldClass":"java.lang.Double","classType":10},
              ...    {"fieldClassName":"String","name":"innerUnitCode","fieldClass":"java.lang.String","classType":0},{"fieldClassName":"Double","name":"perCtn","fieldClass":"java.lang.Double","classType":10}]
}



# Get Inventory Level per Product

Get the inventory level of a product in different locations in a business entity, the results can be grouped by lot number and location.


HTTP Request

GET http://[server]/jsf/rfws/erp/trdg/stock/viewLocLvl/{beId}/{proId}


Parameters

Name Type Description
beId int(Path) Required. Business entity ID
proId int(Path) Required. Product ID (0 means all)
unitId int(Query) Unit ID (in Product's unit table). If provided, result will return quantity in this unit. By default, result will return in base unit.
tranId int(Query) Skip transaction ID. If provided, this transaction will be excluded from the calculation of the result.
tranType string(Query) The transaction type of tranId.
locTypeId int(Query) Location Type ID. If provided, result will be filtered by this location type.
asAt date(Query) As at date. The date stock level calculated up to.
showLoc boolean(Query) If true, result will be grouped by location.
showLotno boolean(Query) If true, result will be grouped by Lot number.
includeNonApv boolean(Query) If true, result will include non-approved records.
excludeExpiredLoc boolean(Query) If true, result will be exclude expired location.
locId int(Query) Location ID. If provided, result will be filtered by this location
includeUc boolean(Query) If true, result will be include AVG uc (Entity Currency)

Result (in JSON Array)

Name Type Description
proId int Product ID
locId int Location ID
locCode string Location code
locType int Location type ID
lotNoId int Lot No. ID
lotno string Lot No. code
lotnoLot string Lot No. lot
qty decimal Quantity
unitId int Unit ID (in Product's unit table)
unitCode string Unit code
basicQty decimal Quantity (Base Unit)
basicUnitId int Base Unit ID
basicCode string Base Unit code
uc decimal Unit Cost (Entity Currency)

Sample request:

OkHttpClient client = new OkHttpClient();

String beId = "14";
String proId = "3081";

HttpUrl url = HttpUrl.parse("http://" + server + "/jsf/rfws/erp/trdg/stock/viewLocLvl/"
  + beId + "/"
  + proId);

url = url.newBuilder()
  .addQueryParameter("showLoc", "true")
  .addQueryParameter("showLotno", "true")
  .addQueryParameter("includeNonApv", "true")

Request request = new Request.Builder()
  .url(url)
  .get()				
  .addHeader("client_id", clientID)
  .addHeader("authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .build();

Response response = client.newCall(request).execute();

The response has structure like this:

[
	{"basicUnitId":52,"basicQty":7000.0,"basicCode":"RTUNIT","locCode":"L0001-A","lotno":"RT01_OPENINGS-002","proId":3081,"qty":7000.0,"unitCode":"RTUNIT","unitId":3791,"lotnoLot":"A","locType":31,"locId":40.0,"lotNoId":1681.0},
	{"basicUnitId":52,"basicQty":1640.0,"basicCode":"RTUNIT","locCode":"RT01_LOC","lotno":"RT01_OPENINGS-002","proId":3081,"qty":1640.0,"unitCode":"RTUNIT","unitId":3791,"lotnoLot":"A","locType":33,"locId":42.0,"lotNoId":1681.0},
	{"basicUnitId":52,"basicQty":98948.0,"basicCode":"RTUNIT","locCode":"RT01_LOC","lotno":"RT01_OPENINGS-003","proId":3081,"qty":98948.0,"unitCode":"RTUNIT","unitId":3791,"lotnoLot":"A","locType":33,"locId":42.0,"lotNoId":1696.0},
	{"basicUnitId":52,"basicQty":10020.0,"basicCode":"RTUNIT","locCode":"RT01_LOC_B","lotno":"RT01_OPENINGS-001","proId":3081,"qty":10020.0,"unitCode":"RTUNIT","unitId":3791,"lotnoLot":"A","locType":33,"locId":43.0,"lotNoId":1680.0},
	{"basicUnitId":52,"basicQty":150.0,"basicCode":"RTUNIT","locCode":"RT01_LOC_B","lotno":"RT01_OPENINGS-002","proId":3081,"qty":150.0,"unitCode":"RTUNIT","unitId":3791,"lotnoLot":"A","locType":33,"locId":43.0,"lotNoId":1681.0}
]



# Get Available Quantities of Multiple Products

Get the quantities of different available quantity types of multiple products in multiple business entities.


HTTP Request

GET http://[server]/jsf/rfws/erp/trdg/stock/jviewLvl/{asAt}


Parameters

Name Type Description
asAt date(Path) **Required. **As At Date
beList string(Query) **Required. **List of business entity's ID. , separated.
proList string(Query) **Required. **List of product's ID. , separated.
seriesList string(Query) List of series ID. If provided, result will be filtered by these series.
apv int(Query) 1 means load all data, 2 means approved data only, 3 means non-approved data only. Default: 1.

Result Set 1 JSON

Name Type Description
beId int Business entity ID
proId int Product ID
locTypeId int Location type ID
locId int Location ID
qty decimal Quantity
locCode string Location code
locTypeCode string Location Type code

Result Set 2 JSON

Name Type Description
beId int Business entity ID
proId int Product ID
qtyTypeId int Quantity Type ID
qty decimal Quantity

Result Set 3 JSON

Name Type Description
proId int Product ID
proCode string Product Code
proBDesc string Brief Description
proDDesc string Detailed Description
seriesId int Series ID
seriesCode string Series Code
seriesDesc string Series Description
unitId int Unit ID (in Product's unit table)
unitCode string Unit Code
maxAvail decimal Max Available Qty
rol decimal Safety Stock

Result Set 4 JSON

Name Type Description
id int Key ID
code string Code
desc string Description
qtyDeci int Quantity (Sales/Purchase)

Result Set 5 JSON

Name Type Description
beId int Business entity ID
proId int Product ID
availTypeId int Available Type ID

Sample request:

OkHttpClient client = new OkHttpClient();

String uId = "4";
String asAt = "2016-01-01";
String beList = "28,33";
String proList = "1,2";
String seriesList = "";

String link = "http://" + server + "/jsf/rfws/erp/trdg/stock/jviewLvl/" + asAt;

HttpUrl url = HttpUrl.parse(link).newBuilder()
  .addQueryParameter("beList", beList)
  .addQueryParameter("proList", proList)
  .addQueryParameter("seriesList", seriesList)
  .build();

Request request = new Request.Builder()
	.url(url)
	.get()		
    .addHeader("client_id", clientID)
    .addHeader("authorization", "Bearer " + token)
    .addHeader("cache-control", "no-cache")
    .build();

Response response = client.newCall(request).execute();

Sample response:

{
	"size":0,
	"values":[],
	"name":"",
	"fields":[{"fieldClassName":"Long","name":"beId","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"Long","name":"proId","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"Long","name":"locTypeId","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"Long","name":"locId","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"Double","name":"qty","fieldClass":"java.lang.Double","classType":10},{"fieldClassName":"String","name":"locCode","fieldClass":"java.lang.String","classType":0},{"fieldClassName":"String","name":"locTypeCode","fieldClass":"java.lang.String","classType":0}]
},{
	"size":0,
	"values":[],
	"name":"",
	"fields":[{"fieldClassName":"Long","name":"beId","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"Long","name":"proId","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"Long","name":"qtyTypeId","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"Double","name":"qty","fieldClass":"java.lang.Double","classType":10}]
},{
	"size":2,
	"values":[{"proBDesc":"SM-BOM-PROA","proCode":"SM-BOM-PROA","seriesCode":"SM-SERIES","proId":1,"unitCode":"个","seriesDesc":"电脑","unitId":1,"seriesId":1},{"proBDesc":"SM-BOM-PROB","proCode":"SM-BOM-PROB","seriesCode":"SM-SERIES","proId":2,"unitCode":"个","seriesDesc":"电脑","unitId":2,"seriesId":1}],
	"name":"",
	"fields":[{"fieldClassName":"Long","name":"proId","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"String","name":"proCode","fieldClass":"java.lang.String","classType":0},{"fieldClassName":"String","name":"proBDesc","fieldClass":"java.lang.String","classType":0},{"fieldClassName":"String","name":"proDDesc","fieldClass":"java.lang.String","classType":0},{"fieldClassName":"Long","name":"seriesId","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"String","name":"seriesCode","fieldClass":"java.lang.String","classType":0},{"fieldClassName":"String","name":"seriesDesc","fieldClass":"java.lang.String","classType":0},{"fieldClassName":"Long","name":"unitId","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"String","name":"unitCode","fieldClass":"java.lang.String","classType":0},{"fieldClassName":"Double","name":"maxAvail","fieldClass":"java.lang.Double","classType":10},{"fieldClassName":"Double","name":"rol","fieldClass":"java.lang.Double","classType":10}]
},{
	"size":1,
	"values":[{"code":"CSIL","qtyDeci":4,"id":28,"desc":"CSIL TESTING (9.49)"}],
	"name":"",
	"fields":[{"fieldClassName":"Long","name":"id","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"String","name":"code","fieldClass":"java.lang.String","classType":0},{"fieldClassName":"String","name":"desc","fieldClass":"java.lang.String","classType":0},{"fieldClassName":"Integer","name":"qtyDeci","fieldClass":"java.lang.Integer","classType":10}]
},{
	"size":0,
	"values":[],
	"name":"",
	"fields":[{"fieldClassName":"Long","name":"beId","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"Long","name":"proId","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"Long","name":"availTypeId","fieldClass":"java.lang.Long","classType":10}]
}



# Get Customer/Vendor Part No. by Product Code

Get customer/vendor part no. from customer/vendor code and product code.


HTTP Request

GET http://[server]/jsf/rfws/erp/trdg/refCode/getRefCode


Parameters

Name Type Description
module String(Query) Required. Module type. Can be found in data dictionary.
beCode String(Query) Required. Business entity code.
cliCode String(Query) Required. Customer/Vendor code.
proInfo json(Query) Required. JSON String of product info.

proInfo (in JSON Array)

Name Type Description
proCode String Required. Product code
unitCode String Required. Unit code
qty double Quantity

Result (in JSON Array)

Name Type Description
proId int Product ID
proCode String Product code
refcode String Customer/Vendor Part No.

Sample request:

OkHttpClient client = new OkHttpClient();

JSONArray array = new JSONArray();
JSONObject obj = new JSONObject();
obj.put("proCode", "NOTE1");
obj.put("unitCode", "盒");
obj.put("qty", 1);
array.put(obj);

obj = new JSONObject();
obj.put("proCode", "NOTEBOOK_01");
obj.put("unitCode", "个");
obj.put("qty", 1);
array.put(obj);

HttpUrl url = HttpUrl.parse("http://" + server + "/jsf/rfws/erp/trdg/refCode/getRefCode");
url = url.newBuilder()
  .addQueryParameter("module", "oldso")
  .addQueryParameter("beCode", "SM")
  .addQueryParameter("cliCode", "SM-CUS")
  .addQueryParameter("proInfo", URLEncoder.encode(array.toString(), "UTF-8"));
  
Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", MyValue.clientID)
  .addHeader("Authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .build();

Response response = client.newCall(request).execute();

Sample response:

[{"proCode":"NOTEBOOK_01","proId":3881,"refCode":"NOTE_01_CUS"},{"proCode":"NOTE1","proId":3919,"refCode":"cusref01"}]



# Get Product Code By Customer/Vendor Part No.

Get product code from customer/vendor code and customer/vendor part no.


HTTP Request

GET http://[server]/jsf/rfws/erp/trdg/refCode/getProCode


Parameters

Name Type Description
module String(Query) Required. Module type. Can be found in data dictionary.
beCode String(Query) Required. Business entity Code.
cliCode String(Query) Required. Customer/Vendor Code.
refCode String(Query) Required. Customer/Vendor Part No.

Result (in JSON Array)

Name Type Description
proId int Product ID
proCode String Product Code
proDesc String Product Description

Sample request:

OkHttpClient client = new OkHttpClient();

HttpUrl url = HttpUrl.parse("http://" + server + "/jsf/rfws/erp/trdg/refCode/getProCode");
url = url.newBuilder()
  .addQueryParameter("module", "oldso")
  .addQueryParameter("beCode", "SM")
  .addQueryParameter("cliCode", "SM-CUS")
  .addQueryParameter("refCode", "cus");
  
Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", MyValue.clientID)
  .addHeader("Authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .build();

Response response = client.newCall(request).execute();

Sample response:

[{"proDesc":"笔记本电脑01(Simon)SC","proCode":"NOTEBOOK_01","proId":3881},{"proDesc":"NOTE1","proCode":"NOTE1","proId":3919}]



# Get Product Price

Get product UP/desc.


HTTP Request

GET http://[server]/jsf/rfws/erp/trdg/price/multiPro


Parameters

Name Type Description
module String(Query) Required. Module type. Can be found in data dictionary.
beCode String(Query) Required. Business entity code.
cliCode String(Query) Required. Customer/Vendor code.
virDeptCode String(Query) Required. Business unit code.
date String(Query) Date(Default: current date).
upOrigin String(Query) Unit price origin. Define the source where the unit price should be retrieved. Please find a list of possible values below.
descOrigin String(Query) Description origin. Define the source where the description should be retrieved. Please find a list of possible values below.
proInfo JSON(Query) Required. A JSON string of transactions info.

upOrigin (Defined in origin.xml)

Name Description
PRO Product / Material File
UPLIST Price List
OLDQU Sales Quotation
SOLAST Latest Transaction (Sales)
VQU Purchase Quotation
GRN Goods Receipt Note
PI Purchase Invoice
POLAST Latest Transaction (Purchase)

descOrigin (Defined in origin.xml)

Name Description
PRO Product / Material File
UPLIST Price List
OLDQU Sales Quotation
SOLAST Latest Transaction (Sales)
VENREF Vendor Part No.
CUSREF Customer Part No.
VQU Purchase Quotation
GRN Goods Receipt Note
PI Purchase Invoice
POLAST Latest Transaction (Purchase)

proInfo (in JSON Array)

Name Type Description
proCode String Required. Product code
unitCode String Required. Unit code
qty double Quantity

Result (in JSON Array)

Name Type Description
proId int Product ID
proCode String Product code
unitId int Unit ID
unitCode String Unit code
qty double Quantity
upCurId int Unit price currency ID
upRate double Unit price rate
up double Unit price
ucCurId int Unit cost currency ID
ucRate double UC rate
uc double Unit cost
disc double Discount(%)
measUnit String Measurement unit
weightUnit String Weight unit
lengthCm double Length (Measurement unit = CBM)
widthCm double Width (Measurement unit = CBM)
heightCm double Height (Measurement unit = CBM)
bmctn double Volume (Measurement unit = CBM)
lengthIn double Length (Measurement unit = CUFT)
widthIn double Width (Measurement unit = CUFT)
heightIn double Height (Measurement unit = CUFT)
cuftctn double Volume (Measurement unit = CUFT)
gwkg double G.W. (Weight Unit = KG)
nwkg double N.W. (Weight Unit = KG)
gwlb double G.W. (Weight Unit = LB)
nwlb double N.W. (Weight Unit = LB)
packingUnitId int Packing unit ID
packingUnitCode String Packing Unit Code
innerQty int Inner quantity
innerUnitId int Inner unit ID
perCtn int Quantity / Packing unit
packingDesc String Packing description
shipMark String Shipping marks
bDesc String Brief description
dDesc String Detailed description
upOrigin String Price origin
descOrigin String Description origin

Sample request:

OkHttpClient client = new OkHttpClient();

JSONArray array = new JSONArray();
JSONObject obj = new JSONObject();
obj.put("proCode", "NOTE1");
obj.put("unitCode", "盒");
obj.put("qty", 1);
array.put(obj);

obj = new JSONObject();
obj.put("proCode", "NOTEBOOK_01");
obj.put("unitCode", "个");
obj.put("qty", 1);
array.put(obj);

HttpUrl url = HttpUrl.parse("http://" + server + "/jsf/rfws/erp/trdg/price/multiPro");
url = url.newBuilder()
  .addQueryParameter("module", "oldso")
  .addQueryParameter("beCode", "SM")
  .addQueryParameter("cliCode", "SM-CUS")
  .addQueryParameter("virDeptCode", "SM_VIRDEPT")
  .addQueryParameter("upOrigin", "PRO")
  .addQueryParameter("descOrigin", "PRO")
  .addQueryParameter("proInfo", URLEncoder.encode(array.toString(), "UTF-8"));
  
Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", MyValue.clientID)
  .addHeader("Authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .build();

Response response = client.newCall(request).execute();

Sample response:

[{"lengthIn":40,"ucCurId":1,"innerQty":4,"proCode":"个","upOrigin":"PRO","nwlb":450,"ucRate":1,"uc":10,"packingUnitId":4,"nwkg":10,"gwlb":500,"bDesc":"笔记本电脑01(Simon)E","unitId":38726,"innerUnitId":17,"up":12,"lengthCm":70,"upCurId":1,"cuftctn":13.889,"widthIn":30,"perCtn":5,"upRate":1,"packingUnitCode":"BOX","heightCm":50,"bmctn":0.21,"descOrigin":"","heightIn":20,"dDesc":"haha","proId":3881,"widthCm":60,"gwkg":12,"packingDesc":"haha"},{"lengthIn":39.37,"ucCurId":1,"innerQty":0,"proCode":"盒","upOrigin":"PRO","nwlb":44,"ucRate":1,"uc":120,"packingUnitId":14,"nwkg":20,"gwlb":22,"bDesc":"NOTE1","unitId":38914,"innerUnitId":0,"up":160,"lengthCm":100,"upCurId":1,"cuftctn":211.887,"widthIn":78.74,"perCtn":2,"upRate":1,"packingUnitCode":"0.3兩","heightCm":300,"bmctn":6,"descOrigin":"","heightIn":118.11,"dDesc":"<p style=\"margin: 0px;\"><img src=\"/jsf/imageServlet?thumbnail=true&amp;code=68O31317220596O15\" style=\"width: 255px;\"><br><\/p>","proId":3919,"widthCm":200,"gwkg":10,"packingDesc":""}]


# Get Outstanding Product Quantity

Get outstanding product quantity.


HTTP Request

GET http://[server]/jsf/rfws/erp/trdg/common/getOSTranPro


Parameters

Name Type Description
beId Long(Header) Required. Business Entity.
tDate String(Header) Required. Date(Default: current date).
sourceType String(Header) Required.
tranType String(Header) Required.
param JSON(Header) Extract source header fields.(cusId \ venId \ curId \ virDeptId)
addFields String(Header) Additional returned fields.(Source module header & footer fields only)


Result (in JSON Array)

Name Type Description
footerId int Source footer table ID
orderId int Source transaction ID
proId int Product ID
unitId int Unit ID
lot string Product Lot
orgQty double Product Quantity
outQty double Product Outstanding Quantity

Sample request:

OkHttpClient client = new OkHttpClient();

JSONObject param = new JSONObject();
param.put("venId", "1");

JSONArray addFields = new JSONArray();
addFields.add("pot.bDesc");
addFields.add("mainpo.venId");

HttpUrl url = HttpUrl.parse("http://" + server + "/jsf/rfws/erp/trdg/common/getOSTranPro");
url = url.newBuilder()
  .addHeaderParameter("beId", "304")
  .addHeaderParameter("tDate", "2023-12-01")
  .addHeaderParameter("sourceType", "po")
  .addHeaderParameter("tranType", "an")
  .addHeaderParameter("param", URLEncoder.encode(param.toString(), "UTF-8"))
  .addHeaderParameter("addFields", URLEncoder.encode(addFields.toString(), "UTF-8"));
  
Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", MyValue.clientID)
  .addHeader("Authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .build();

Response response = client.newCall(request).execute();

Sample response:

{"size":1,"values":[{"footerId":1096,"orderId":640,"proId":4775,"lot":"A","outQty":1.0,"orgQty":1.0,"unitId":39867,"bDesc":"Product Brief Description(EN)","venId":1}]}



# Finance Web Services

# Get Outstanding AP Invoices

Get a list of outstanding account payable invoices in a specific business entity.


HTTP Request

GET http://[server]/jsf/rfws/erp/ac/ap/getOsInvoice/{beId}/{uId}/{AIId}/{payRegId}/{multiPayId}/


Parameters

Name Type Description
beId int(Path) Required. Business entity ID
uId int(Path) Required. User ID
payRegId int(Path) Required. Must input 0.
multiPayId int(Path) Required. Must input 0.
AIId int(Path) Required. Creditor ID. ID of the creditor type's records, if creditor type = ven, this field represent the ID of vendor FM.
AIType string(Header) Required. Type of creditor. Format please refer to request sample, built-in support these types: ven, cus, staff, cnDept, virDept
sDate date(Header) Required. Transaction Date (From)
eDate date(Header) **Required. **Transaction Date (To)
sDDate date(Header) Required. Due Date (From)
eDDate date(Header) Required. Due Date (To)
sStaff string(Header) Staff Code (From)
eStaff string(Header) Staff Code (To)
sTranType string(Header) Invoice's transaction types. Format please refer to request sample, support types: apIni, apTran and pi.
loadDbNote int(Header) Default is 0. If 1, result will include negative AP transactions.
loadGroupCo boolean(Header) Default is false. If true, the result will consider group company data of the vendor.

Result (in JSON Array: "values")

Name Type Description
id int Invoice ID
code string Invoice No.
tDate date Invoice Date
sTranType string Invoice's Transaction Type
sTranTypeMess string Invoice's Transaction Type Desc.
AIType string Creditor Type
AIId int Creditor ID
curId int Currency ID
curCode string Currency Code
rate decimal Ex. rate
amt decimal Invoice Amount
bal decimal Paid Amount
balAmt decimal Outstanding Amount
cpDate date Due Date
accDesc string Account Brief Description
eDiscRate decimal Early Payment Discount
eDiscAmt decimal Early Payment Discount Amount
virDeptId int Business Unit ID
virDeptCode string Business Unit Code
virDeptDesc string Business Unit Description
AI1 - AI30 int Analysis Code 1 - 30
invDomAmt decimal Invoice Amount (Entity Currency)
usedInvDomAmt decimal Paid Amount (Entity Currency)
balInvDomAmt decimal Outstanding Amount (Entity Currency)

Sample request:

OkHttpClient client = new OkHttpClient();

String beId = "19";
String uId = "9";
String AIId = "6"; // AIId: vendor id in this case
String payRegId = "0";
String multiPayId = "0";
String AIType = "(aiType)values(''ven'')";  // creditor type = "ven"
String sDate = "1990-01-01";
String eDate = "2017-11-04";
String sDDate = "1990-01-01";
String eDDate = "9999-12-31";
String sStaff = "";
String eStaff = "";
String loadGroupCo = "false";
String sTranType = "(sTranType) values ('apTran')";

String url = "http://" + server + "/jsf/rfws/erp/ac/ap/getOsInvoice/"
  + beId + "/"
  + uId + "/"
  + AIId + "/"
  + payRegId + "/"
  + multiPayId;

Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", clientID)
  .addHeader("authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .addHeader("AIType", AIType)
  .addHeader("sDate", sDate)
  .addHeader("eDate", eDate)
  .addHeader("sDDate", sDDate)
  .addHeader("eDDate", eDDate)
  .addHeader("sStaff", sStaff)
  .addHeader("eStaff", eStaff)
  .addHeader("loadDbNote", loadDbNote)
  .addHeader("sTranType", sTranType)
  .addHeader("loadGroupCo", loadGroupCo)
  .build();

Response response = client.newCall(request).execute();

Sample response:

{
	"size":6,
	"values":[{"tDate":"2017-09-01 00:00:00","cpDate":"2017-09-01 00:00:00","code":"KC_ART_20170901_001","virDeptId":3,"st_desc":"KC_ART_20170901_001","amt":100.0,"balInvDomAmt":110.0,"sTranId":396,"ce01Module":"arTran","sTranCode":"KC_ART_20170901_001","sTranTypeMess":"arTran","curId":1,"AIType":"cus","rate":1.1,"balAmt":100.0,"id":396,"sTranType":"arTran","curCode":"R","virDeptCode":"SALES01","AIId":6,"invDomAmt":110.0,"virDeptDesc":"Sales Team 1"},{"tDate":"2017-09-01 00:00:00","cpDate":"2017-09-01 00:00:00","code":"KC_ART_20170901_002","virDeptId":3,"st_desc":"KC_ART_20170901_002","amt":100.0,"balInvDomAmt":110.0,"sTranId":397,"ce01Module":"arTran","sTranCode":"KC_ART_20170901_002","sTranTypeMess":"arTran","curId":1,"AIType":"cus","rate":1.1,"balAmt":100.0,"id":397,"sTranType":"arTran","curCode":"R","virDeptCode":"SALES01","AIId":6,"invDomAmt":110.0,"virDeptDesc":"Sales Team 1"},{"tDate":"2017-09-01 00:00:00","cpDate":"2017-09-01 00:00:00","code":"KC_ART_20170901_003","virDeptId":3,"st_desc":"KC_ART_20170901_003","amt":100.0,"balInvDomAmt":110.0,"sTranId":398,"ce01Module":"arTran","sTranCode":"KC_ART_20170901_003","sTranTypeMess":"arTran","curId":1,"AIType":"cus","rate":1.1,"balAmt":100.0,"id":398,"sTranType":"arTran","curCode":"R","virDeptCode":"SALES01","AIId":6,"invDomAmt":110.0,"virDeptDesc":"Sales Team 1"},{"tDate":"2017-09-01 00:00:00","cpDate":"2017-09-01 00:00:00","code":"KC_ART_20170901_004","virDeptId":3,"st_desc":"KC_ART_20170901_004","amt":100.0,"balInvDomAmt":110.0,"sTranId":399,"ce01Module":"arTran","sTranCode":"KC_ART_20170901_004","sTranTypeMess":"arTran","curId":1,"AIType":"cus","rate":1.1,"balAmt":100.0,"id":399,"sTranType":"arTran","curCode":"R","virDeptCode":"SALES01","AIId":6,"invDomAmt":110.0,"virDeptDesc":"Sales Team 1"},{"tDate":"2017-09-15 00:00:00","cpDate":"2017-09-15 00:00:00","code":"KC_ART_20170915_001","virDeptId":3,"st_desc":"KC_ART_20170915_001","amt":110.0,"balInvDomAmt":119.9,"bal":1.0,"usedInvDomAmt":1.1,"sTranId":400,"ce01Module":"arTran","sTranCode":"KC_ART_20170915_001","sTranTypeMess":"arTran","curId":1,"AIType":"cus","rate":1.1,"balAmt":109.0,"id":400,"sTranType":"arTran","curCode":"R","virDeptCode":"SALES01","AIId":6,"invDomAmt":121.0,"virDeptDesc":"Sales Team 1"},{"tDate":"2017-10-25 00:00:00","cpDate":"2017-10-25 00:00:00","code":"KC_ART_20171025_001","virDeptId":3,"st_desc":"KC_ART_20171025_001","amt":12.0,"balInvDomAmt":13.2,"sTranId":405,"ce01Module":"arTran","sTranCode":"KC_ART_20171025_001","sTranTypeMess":"arTran","curId":1,"AIType":"cus","rate":1.1,"balAmt":12.0,"id":405,"sTranType":"arTran","curCode":"R","virDeptCode":"SALES01","AIId":6,"invDomAmt":13.2,"virDeptDesc":"Sales Team 1"}],
	"name":"",
	"fields":[{"fieldClassName":"Long","name":"id","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"String","name":"code","fieldClass":"java.lang.String","classType":0},
...{"fieldClassName":"String","name":"virDeptDesc","fieldClass":"java.lang.String","classType":0}]
}



# Get Outstanding AR Invoices

Get a list of outstanding account receivable invoices in a specific business entity.


HTTP Request

GET http://[server]/jsf/rfws/erp/ac/ar/getOsInvoice/{beId}/{uId}/{AIId}/{recregId}/{multiRecId}


Parameters

Name Type Description
beId int(Path) Required. Business entity ID
uId int(Path) Required. User ID
payRegId int(Path) Required. Must input 0.
multiPayId int(Path) Required. Must input 0.
AIId int(Path) Required. Debtor ID. ID of the debtor type's records, if debtor type = cus, this field will represent the ID of customer FM.
AIType string(Header) Required. Type of Debtor. Format please refer to request sample, built-in support these types: cus, ven, staff, cnDept, virDept.
sDate date(Header) Required. Transaction Date (From)
eDate date(Header) **Required. **Transaction Date (To)
sDDate date(Header) Required. Due Date (From)
eDDate date(Header) Required. Due Date (To)
sStaff string(Header) Staff Code (From)
eStaff string(Header) Staff Code (To)
sTranType string(Header) Invoice's transaction types. Format please refer to request sample, support types: arIni, arTran and siso.
loadCrNote int(Header) Default is 0. If 1, result will include negative AR transactions.
loadGroupCo boolean(Header) Default is false. If true, the result will consider group company data of the customer.

Result (in JSON Array: "values")

Name Type Description
id int Invoice ID
code string Invoice No.
tDate date Invoice Date
sTranType string Invoice's Transaction Type
sTranTypeMess string Invoice's Transaction Type Desc.
AIType string Debtor Type
AIId int DebtorID
curId int Currency ID
curCode string Currency Code
rate decimal Ex. rate
amt decimal Invoice Amount
bal decimal Paid Amount
balAmt decimal Outstanding Amount
cpDate date Due Date
accDesc string Account Brief Description
eDiscRate decimal Early Payment Discount
eDiscAmt decimal Early Payment Discount Amount
virDeptId int Business Unit ID
virDeptCode string Business Unit Code
virDeptDesc string Business Unit Description
AI1 - AI30 int Analysis Code 1 - 30
invDomAmt decimal Invoice Amount (Entity Currency)
usedInvDomAmt decimal Paid Amount (Entity Currency)
balInvDomAmt decimal Outstanding Amount (Entity Currency)

Sample request:

OkHttpClient client = new OkHttpClient();

String beId = "19";
String uId = "9";
String AIId = "6";	// debtor id = customer id in this sample
String recregId = "0";
String multiRecId = "0";
String AIType = "(aiType) values (''cus'')";	// debtor type = "cus"
String sDate = "1900-01-01";
String eDate = "2017-11-04";
String sDDate = "1900-01-01";
String eDDate = "9999-12-31";
String sStaff = "";
String eStaff = "";
String loadCrNote = "1";
String sTranType = "(sTranType) values ('arTran')";
String loadGroupCo = "false";

String url = "http://" + server + "/jsf/rfws/erp/ac/ar/getOsInvoice/"
  + beId + "/"
  + uId + "/"
  + AIId + "/"
  + recregId + "/"
  + multiPayId;

Request request = new Request.Builder()
  .url(url)
  .get()
  .addHeader("client_id", clientID)
  .addHeader("authorization", "Bearer " + token)
  .addHeader("cache-control", "no-cache")
  .addHeader("AIType", AIType)
  .addHeader("sDate", sDate)
  .addHeader("eDate", eDate)
  .addHeader("sDDate", sDDate)
  .addHeader("eDDate", eDDate)
  .addHeader("sStaff", sStaff)
  .addHeader("eStaff", eStaff)
  .addHeader("loadCrNote", loadCrNote)
  .addHeader("sTranType", sTranType)
  .addHeader("loadGroupCo", loadGroupCo)
  .build();

Response response = client.newCall(request).execute();

Sample response:

{
	"size":6,
	"values":[{"tDate":"2017-09-01 00:00:00","cpDate":"2017-09-01 00:00:00","code":"KC_ART_20170901_001","virDeptId":3,"st_desc":"KC_ART_20170901_001","amt":100.0,"balInvDomAmt":110.0,"sTranId":396,"ce01Module":"arTran","sTranCode":"KC_ART_20170901_001","sTranTypeMess":"arTran","curId":1,"AIType":"cus","rate":1.1,"balAmt":100.0,"id":396,"sTranType":"arTran","curCode":"R","virDeptCode":"SALES01","AIId":6,"invDomAmt":110.0,"virDeptDesc":"Sales Team 1"},{"tDate":"2017-09-01 00:00:00","cpDate":"2017-09-01 00:00:00","code":"KC_ART_20170901_002","virDeptId":3,"st_desc":"KC_ART_20170901_002","amt":100.0,"balInvDomAmt":110.0,"sTranId":397,"ce01Module":"arTran","sTranCode":"KC_ART_20170901_002","sTranTypeMess":"arTran","curId":1,"AIType":"cus","rate":1.1,"balAmt":100.0,"id":397,"sTranType":"arTran","curCode":"R","virDeptCode":"SALES01","AIId":6,"invDomAmt":110.0,"virDeptDesc":"Sales Team 1"},{"tDate":"2017-09-01 00:00:00","cpDate":"2017-09-01 00:00:00","code":"KC_ART_20170901_003","virDeptId":3,"st_desc":"KC_ART_20170901_003","amt":100.0,"balInvDomAmt":110.0,"sTranId":398,"ce01Module":"arTran","sTranCode":"KC_ART_20170901_003","sTranTypeMess":"arTran","curId":1,"AIType":"cus","rate":1.1,"balAmt":100.0,"id":398,"sTranType":"arTran","curCode":"R","virDeptCode":"SALES01","AIId":6,"invDomAmt":110.0,"virDeptDesc":"Sales Team 1"},{"tDate":"2017-09-01 00:00:00","cpDate":"2017-09-01 00:00:00","code":"KC_ART_20170901_004","virDeptId":3,"st_desc":"KC_ART_20170901_004","amt":100.0,"balInvDomAmt":110.0,"sTranId":399,"ce01Module":"arTran","sTranCode":"KC_ART_20170901_004","sTranTypeMess":"arTran","curId":1,"AIType":"cus","rate":1.1,"balAmt":100.0,"id":399,"sTranType":"arTran","curCode":"R","virDeptCode":"SALES01","AIId":6,"invDomAmt":110.0,"virDeptDesc":"Sales Team 1"},{"tDate":"2017-09-15 00:00:00","cpDate":"2017-09-15 00:00:00","code":"KC_ART_20170915_001","virDeptId":3,"st_desc":"KC_ART_20170915_001","amt":110.0,"balInvDomAmt":119.9,"bal":1.0,"usedInvDomAmt":1.1,"sTranId":400,"ce01Module":"arTran","sTranCode":"KC_ART_20170915_001","sTranTypeMess":"arTran","curId":1,"AIType":"cus","rate":1.1,"balAmt":109.0,"id":400,"sTranType":"arTran","curCode":"R","virDeptCode":"SALES01","AIId":6,"invDomAmt":121.0,"virDeptDesc":"Sales Team 1"},{"tDate":"2017-10-25 00:00:00","cpDate":"2017-10-25 00:00:00","code":"KC_ART_20171025_001","virDeptId":3,"st_desc":"KC_ART_20171025_001","amt":12.0,"balInvDomAmt":13.2,"sTranId":405,"ce01Module":"arTran","sTranCode":"KC_ART_20171025_001","sTranTypeMess":"arTran","curId":1,"AIType":"cus","rate":1.1,"balAmt":12.0,"id":405,"sTranType":"arTran","curCode":"R","virDeptCode":"SALES01","AIId":6,"invDomAmt":13.2,"virDeptDesc":"Sales Team 1"}],
	"name":"",
	"fields":[{"fieldClassName":"Long","name":"id","fieldClass":"java.lang.Long","classType":10},{"fieldClassName":"String","name":"code","fieldClass":"java.lang.String","classType":0},
	...{"fieldClassName":"String","name":"virDeptDesc","fieldClass":"java.lang.String","classType":0}]
}



# Void Transaction

Void a transaction base on given module name and transaction ID.


HTTP Request

GET http://[server]/jsf/rfws/erp/ac/voidunvoid/voidTran/


Parameters

All parameters are wrapped inside a JSON object. Please read the sample request for details.

Name Type Description
beId int Required. Business entity ID
moduleName int Required. Module name of the transaction.
tranId int Required. ID of the transaction
voidDate int Void date. Default: transaction date

Result

Name Type Description
success boolean Indicate if the process success.
message String Message of the result
voucherId int The reverse journal voucher ID if exists.

Sample request:

JsonObject data = new JsonObject();
data.addProperty("beId", 19);
data.addProperty("moduleName", "arTran");
data.addProperty("tranId", 431);
data.addProperty("voidDate", "2017-12-14");

RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), data.toString());

Request request = new Request.Builder()
  .url("http://" + server + "/jsf/rfws/erp/ac/voidunvoid/voidTran/")
  .addHeader("client_id", MyValue.clientID)
  .addHeader("authorization", "Bearer " + access_token)
  .addHeader("cache-control", "no-cache")
  .post(requestBody)
  .build();

OkHttpClient client = new OkHttpClient();
Response response = client.newCall(request).execute();

Sample response:

{
  "success": true,
  "voucherId": 18595,
  "message": "Void Completed"
}



# Unvoid Transaction

Unvoid a transaction base on given module name and transaction ID.


HTTP Request

GET http://[server]/jsf/rfws/erp/ac/voidunvoid/voidTran/


Parameters

All parameters are wrapped inside a JSON object. Please read the sample request for details.

Name Type Description
beId int Required. Business entity ID
moduleName int Required. Module name of the transaction.
tranId int Required. ID of the transaction

Result

Name Type Description
success boolean Indicate if the process success.
message String Message of the result

Sample request:

JsonObject data = new JsonObject();
data.addProperty("beId", 19);
data.addProperty("moduleName", "arTran");
data.addProperty("tranId", 431);

RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), data.toString());

Request request = new Request.Builder()
  .url("http://" + server + "/jsf/rfws/erp/ac/voidunvoid/unvoidTran/")
  .addHeader("client_id", MyValue.clientID)
  .addHeader("authorization", "Bearer " + access_token)
  .addHeader("cache-control", "no-cache")
  .post(requestBody)
  .build();

OkHttpClient client = new OkHttpClient();
Response response = client.newCall(request).execute();

Sample response:

{
  "success": true,
  "message": "Unvoid Completed"
}