// GraalJS Script (engine type: 2)
//////// START "main()" /////////////////////////////////////////////////////////////////
main();
function main(){
//// == Config Retrieving / 工程コンフィグの参照 ==
const strInputDt = configs.get( "StrConfA1" ); // required
if( strInputDt === "" ){
throw new Error( "\n AutomatedTask ConfigError:" +
" Config {A1: Input Datetime data} is empty \n" );
}
const strInputTz = configs.get( "StrConfA2" ); // hour
let numInputTz = engine.getTimeZoneOffsetInMinutes() /60;
if( strInputTz !== "" ){
numInputTz = parseFloat( strInputTz );
}
const dtPocketOutput = configs.getObject( "SelectConfB1" );
const strOutputTz = configs.get( "StrConfB2" ); // hour
let numOutputTz = engine.getTimeZoneOffsetInMinutes() /60;
if( strOutputTz !== "" ){
numOutputTz = parseFloat( strOutputTz );
}
engine.log( " AutomatedTask: Workflow Platform offset: " +
(engine.getTimeZoneOffsetInMinutes() /60) );
engine.log( " AutomatedTask: Input Datetime as: " + numInputTz );
engine.log( " AutomatedTask: Output Datetime as: " + numOutputTz );
const numPocketTimestamp = configs.getObject( "SelectConfC" );
//// == Data Retrieving / ワークフローデータの参照 ==
// (Nothing. Retrieved via Expression Language in Config Retrieving)
//// == Calculating / 演算 ==
let dateUniversalTmp = toJsDate( strInputDt );
// DATE Data in Platform time
let dateUniversal = new Date( dateUniversalTmp.getTime() +
engine.getTimeZoneOffsetInMinutes() *60 *1000 -
numInputTz *60 *60 *1000 );
// Corrects the difference from the Platform time
let numMsecUniversal = dateUniversal.getTime();
engine.log( " AutomatedTask: Timestamp: " + numMsecUniversal );
let dateShifted = new Date( dateUniversal.getTime() -
engine.getTimeZoneOffsetInMinutes() *60 *1000 +
numOutputTz *60 *60 *1000 );
// Shifts the time forward/back with timezone
//// == Data Updating / ワークフローデータへの代入 ==
engine.setData( dtPocketOutput, new java.sql.Timestamp( dateShifted.getTime() ) );
if( numPocketTimestamp !== null ){
engine.setData( numPocketTimestamp, new java.math.BigDecimal( numMsecUniversal /1000 ) );
} // Millisec will exceed the numerical limit of workflow platform
} //////// END "main()" /////////////////////////////////////////////////////////////////
function toJsDate( bpmsDateOrDatetimeStr ){
// BPMS Date: "2020-04-01" (subtype "Y/M" "M/D" "Y", not supported)
// BPMS Datetime: "2020-04-01 23:59"
let year = 0;
let monthIndex = 0;
let day = 0;
let hours = 0;
let minutes = 0;
// The ECMA/JavaScript Date object has a large number of methods.
// "Date.parse" is danger (strongly discouraged)
// - new Date("2014-11-10") // Mon Nov 10 2014 09:00:00 GMT+0900 (JST)
// - new Date(2014, 10, 10) // Mon Nov 10 2014 00:00:00 GMT+0900 (JST)
let arrDatetime = bpmsDateOrDatetimeStr.split(" ");
if( arrDatetime.length === 1 ){
let arrDateParts = arrDatetime[0].split("-");
year = parseInt(arrDateParts[0], 10);
monthIndex = parseInt(arrDateParts[1], 10) - 1;
day = parseInt(arrDateParts[2], 10);
}
if( arrDatetime.length === 2 ){
let arrDateParts = arrDatetime[0].split("-");
let arrTimeParts = arrDatetime[1].split(":");
year = parseInt(arrDateParts[0], 10);
monthIndex = parseInt(arrDateParts[1], 10) - 1;
day = parseInt(arrDateParts[2], 10);
hours = parseInt(arrTimeParts[0], 10);
minutes = parseInt(arrTimeParts[1], 10);
}
return new Date( year, monthIndex, day, hours, minutes );
}
/*
Notes:
- Convert datetime data using two time zone offsets.
- Offset values are set in Hour. Decimal notation is also possible. (PST:"-8", JST:"+9")
- https://en.wikipedia.org/wiki/Time_zone
- To customize the notification text according to the recipient's timezone, etc.
- Can be converted even in the standard automation "Update Data".
- Setting Example of "Output Datetime" (EL syntax)
- "#q_dtInputDatetime.addHours( #q_numOutputOffset - #q_numInputOffset )"
- Assumption: Integer Hour is input in Numeric type data
- M227: Auto Executing Data Binding, Arithmetic Operations
- https://questetra.zendesk.com/hc/en-us/articles/360002260571-M227
- R2270: Numeric Output via EL syntax
- https://questetra.zendesk.com/hc/en-us/articles/360024292572-R2270
- Update Data
- https://support.questetra.com/bpmn-icons/service-task-data-assignment/
Notes-ja:
- 2つのタイムゾーンOffset値を用いて、時刻型データを変換します。
- Offset値はHour単位で設定します。小数表記も可能です。(日本標準時: "+9" 太平洋標準時: "-8")
- https://ja.wikipedia.org/wiki/%E6%99%82%E9%96%93%E5%B8%AF_(%E6%A8%99%E6%BA%96%E6%99%82)
- 受信者のタイムゾーンにあわせて通知文をカスタマイズしたい場合などに。
- 標準で組み込まれている自動工程[データ更新]でも、時刻の自動変換は可能です。
- "Output Datetime" の設定例 (EL式)
- "#q_dtInputDatetime.addHours( #q_numOutputOffset - #q_numInputOffset )"
- (数値型データに整数Hourが入力される前提)
- M227: 業務データの結合や四則演算が自動実行されるように設定する
- https://questetra.zendesk.com/hc/ja/articles/360002260571-M227
- R2270: EL式による数値としての出力(データ設定式)
- https://questetra.zendesk.com/hc/ja/articles/360024292572-R2270
- データ更新
- https://support.questetra.com/ja/bpmn-icons/service-task-data-assignment/
*/
/*
APPENDIX
- Not only Datetime type data but also process start datetime can be converted.
- "#{#q_dtInputDatetime}"
- "#{processInstanceStartDatetime}"
- "Date type + static hh:mm" is also acceptable. (processes the string "YYYY-MM-DD hh:mm")
- "#{#q_date} 00:00"
- The timestamp obtained by this Addon is Unix epoch.
- Seconds since 1 January 1970 UTC
- Not the same as the ECMAScript epoch (elapsed Milliseconds), Unix is 1/1000 of ECMAScript
APPENDIX-ja
- 日時型データだけでなく、プロセス開始時刻等も変換できます。
- "#{#q_dtInputDatetime}"
- "#{processInstanceStartDatetime}"
- "日付型データ+固定時刻文字列" による指定も可能です。("YYYY-MM-DD hh:mm" の文字列を処理します)
- "#{#q_date} 00:00"
- "#{processInstanceStartDatetime}"
- このAddonによって取得されるタイムスタンプは Unix epoch ("経過秒数")です。
- 協定世界時 (UTC) の1970年1月1日からの経過秒数
- Unix epoch("経過秒数")は ECMAScript epoch("経過ミリ秒数")の1000分の1となります
*/