今日までの勤続年数と誕生日から定年の年月日を表示したい

いつもお世話になっております。

社員情報アプリのデータをもとに以下のデータを見れるアプリを作成しています。

・有給の取得数、取得タイミング

・誕生日データをもとに定年の年月日を表示

・今日までの勤続年数

有給の取得数・タイミングについては、

http://qiita.com/ushiron/items/14a2cfa05e2132b77558

を元に表示させることができました。

が、定年の年月日を別のテーブルやフィールドへ表示させようとjsをいじってみましたがうまくいかず・・。 jswatchlogなんかも使ってみたんですが、jsとしてそもそも認識されていないようで何が間違っているのかわからず行き詰ってしまいました。

(勤続年数については有給取得のテーブルの一番下に追加して表示させることはできたんですが、可能であれば別に(テーブルでも文字列フィールドでも)表示させたいです。)

どのようにしたら表示させることができるのかご教授頂きたく投稿します。

宜しくお願いします。

 

※有給取得のjs(勤続年数をテーブル一番下に表示するようにしています)※

(function() {
“use strict”;

// Set local and starting week
moment.locale(‘ja’, { week: { dow: 0, doy: 4 }});

// Insert rowdata in need fieldtype ex.‘SINGLE_LINE_TEXT’
function createRow(detail, result, yukyu) {
return {
‘value’: {
‘Detail’: {
‘type’: ‘SINGLE_LINE_TEXT’,
‘value’: detail
},
‘Result’: {
‘type’: ‘SINGLE_LINE_TEXT’,
‘value’: result
},
‘yukyu’: {
‘type’: ‘NUMBER’,
‘value’: yukyu
}
}
};
}

var eventDatetime = function(event) {
var record = event.record;
var dateA = record[‘DatetimeA’].value;
var dateB = record[‘DatetimeB’].value;
var arrRow = [];

// Initialize table data
record[‘Table’][‘value’].length = 0;

// Basedatetime
arrRow.push(createRow(“~6ヵ月まで”, moment(dateA).add(6, ‘month’).format(‘YYYY/MM’), 5));
arrRow.push(createRow(“~1年5ヵ月まで”, moment(dateA).add(17, ‘month’).format(‘YYYY/MM’), 10));
arrRow.push(createRow(“~2年5ヵ月まで”, moment(dateA).add(29, ‘month’).format(‘YYYY/MM’), 11));
arrRow.push(createRow(“~3年5ヵ月まで”, moment(dateA).add(41, ‘month’).format(‘YYYY/MM’), 12));
arrRow.push(createRow(“~4年5ヵ月まで”, moment(dateA).add(53, ‘month’).format(‘YYYY/MM’), 14));
arrRow.push(createRow(“~5年5ヵ月まで”, moment(dateA).add(65, ‘month’).format(‘YYYY/MM’), 16));
arrRow.push(createRow(“~6年5ヵ月まで”, moment(dateA).add(66, ‘month’).format(‘YYYY/MM’), 18));
arrRow.push(createRow(“~6年6ヵ月以降”, moment(dateA).add(66, ‘month’).format(‘YYYY/MM’), 20));
// Compare datetime
var month = moment(dateB).diff(moment(dateA), ‘months’) % 12;
arrRow.push(createRow(“入社日から比較対象日まで”, moment(dateB).diff(moment(dateA), ‘years’) + "年 " + month + “ヶ月”));
// Appned tabel element
for (var i = 0; i < arrRow.length; i++) {
record[‘Table’][‘value’].push(arrRow[i]);
}
};

// Eventlist
var ev = [‘app.record.create.show’,
‘app.record.edit.show’,
‘app.record.edit.index.show’,
‘app.record.create.change.DatetimeA’,
‘app.record.create.change.DatetimeB’,
‘app.record.edit.change.DatetimeA’,
‘app.record.edit.change.DatetimeB’
];
kintone.events.on(ev, function(event) {
eventDatetime(event);
return event;
});

})();


※認識されないjs 誕生日(日時フィールド)から定年を計算※

(function() {
“use strict”;
// ロケールを初期化
moment.locale(‘ja’, { week: { dow: 0, doy: 4 }});
kintone.events.on(“app.record.edit.submit.success”, function(ev) {
var record = event.record;
var birthd = record[‘birth’].value;
var date = moment(birthd.add(60, ‘years’));
date.format(“YYYY/MM/DD”);

record[‘end’][‘value’] = date;

return event;
});

})();


 

yuki-I さん

app.record.edit.submit.success(レコード編集画面の保存成功後イベント)は、保存がすでに完了した後に走るイベント

なので、このイベント内で更新した値は反映されないと思います。

app.record.create.submit に変更してみてはいかがでしょうか。

amuroさま

ありがとうございます。

app.record.create.submit へ変更してみましたが、

レコード編集画面はうんともすんとも言わず・・

レコード新規作成画面では保存ボタンを押しても反応しない状態です・・(^^;

レコード登録・編集画面のイベントハンドラー?を追加してみましたが変わらず・・

有給取得とは別にjsファイルを作成して読み込ませているんですがそれだとうまく認識されないんでしょうか??

度々申し訳ないのですが、何か心当たりなどありましたら教えてください。

宜しくお願いします。

yuki-I さん

すいません、書き間違いました。

| app.record.edit.submit でした。 |

申し訳ありません。

amuroさま

ありがとうございます。変更してみたのですが、

レコード新規登録画面⇒保存できるが定年欄が空白

レコード編集画面⇒定年欄は空白、保存ボタンを押しても反応なし の状態でした。

submit⇒showに変更すると新規・編集画面ともに保存ボタンは反応しましたが定年欄は空白のままでした。

https://developer.cybozu.io/hc/ja/articles/202166270

のレコード編集イベントですと、app.record.edit.show が書かれていますが

showとsubmitはどんな違いがあるんでしょうか?

質問ばかりで申し訳ございません・・

yuki - I さん

横から失礼します。

イベントには、show(画面表示)・submit(保存)・submit.success(保存完了)、change(値の変更)などがあります。

各イベントの発生タイミングが異なりますので、用途に合ったイベントを使います。

定年を計算しているコードには、いくつか問題があります。

エラーも出ていると思いますので、「動かない?そんな時はデバッグをしてみよう!入門編」をみて、
デベロッパーツールを使ってみましょう。

 

kintone.events.on("app.record.edit.submit.success", function(ev) {
// 念のため、編集画面表示、birth 項目変更時、「保存」時のイベント処理にします。
// function(ev) は、return event; に合わせます

var date = moment(birthd.add(60, 'years')); // 指定方法誤り
date.format("YYYY/MM/DD"); // date の内容はかわりません。 , kintone の日付は、YYYY-MM-DD
record['end']['value'] = date;

 

定年計算が必要になりそうなイベント処理を挙げてみました。

また、定年の項目は、編集不可にしています。

(function() {
"use strict";
// ロケールを初期化
moment.locale('ja', { week: { dow: 0, doy: 4 } });

kintone.events.on(["app.record.edit.show","app.record.create.show","app.record.index.edit.show"], function(event) {
var record = event.record;
record['end'].disabled = true; // 編集不可にします。
return event;
});
var events = [
"app.record.edit.show",
"app.record.edit.change.birth",
"app.record.edit.submit",
"app.record.create.show",
"app.record.create.change.birth",
"app.record.create.submit",
"app.record.index.edit.show",
"app.record.index.edit.change.birth",
"app.record.index.edit.submit",
];
kintone.events.on(events, function(event) {
var record = event.record;
var birthd = record['birth'].value;
if (birthd) {
var date = moment(birthd).add(60, 'years').format("YYYY-MM-DD");
record['end']['value'] = date;
}
else {
record['end']['value'] = '';
}

return event;
});

})();

rex0220さま

コードまで考えていただいてありがとうございます。このコードで無事、定年表示が反映されました!

 

いくつか教えていただきたいことがあるのですが、

・定年の項目の編集不可設定は必須なんでしょうか?

var events = [~~];での定義をする時は、どういった内容でもedit、create、indexの3つをそれぞれに定義する必要があるんでしょうか?

・数値や文字列等に何か手を加えてレコードの値を更新する時はif文を使うようにしたほうがいいんでしょうか?

初歩的すぎる質問でしたらすみません。。お時間のある時にでもお答え頂けると幸いです。

宜しくお願いします。

定年の項目の編集不可設定は、必須ではありません。

ただユーザが入力しても、保存時に自動計算されますのでユーザ操作が無駄になるのと、疑問を持って質問されるのを防止します。

 

edit、create、index の編集画面で同じ入力操作をして、結果が異なると、操作する人が迷います。

意図をもって、別の処理にするとき以外は、同じ処理にしておいたほうがいいと思います。

 

if は、必要に応じて使います。

値が入力されていないと、処理内容によっては、エラーになったり、予期せぬ値になったりしますので、条件によって処理内容を変えます。

 

 

rex0220さま

ありがとうございました!

他に作っているものへも参考にします。

また何かありましたら宜しくお願いします。