お世話になります。
現在、社内にて日報の電子化に向けて日報アプリを作成しております。
上の画像のように極力シンプルな内容で作成しておるのですが
弊社規定の残業時間の抽出に難航しております。
弊社では、出社/退社時間範囲で、
AM5:00~AM8:30 および PM17:45~PM22:00 範囲内の勤務時間を残業としております。
従ってこの時間範囲の経過時間合計を「残業時間合計」フィールドへと抽出
また、PM22:00~翌AM5:00範囲内は深夜残業としております。
従ってこの時間範囲の経過時間は「深夜残業時間合計」フィールドへと抽出
時間ごとにフィールドを設けて細かく入力してもらえば標準のままでも取得が可能なのですが、社員の入力時間を1秒でも早くといった要望があったので最低限のシンプルな出社日時と退社日時の時間範囲から特定の時間範囲の経過時間を自動抽出できないだろうかと考えている次第です。
当方、javaは初心者で、類似のカスタマイズやサンプルコードなど探してみたものの見つけることができなかったので投稿させて頂きました。
どうか皆様のお力を頂けますと幸いです。
河合総一郎様
お世話になっております。 cstapの江田と申します。
以下のような記述で実装できるかと思います。
(function(){"use strict";kintone.events.on(['app.record.create.change.出社日時','app.record.edit.change.出社日時','app.record.create.change.退社日時','app.record.edit.change.退社日時',],function(event){varsum=[0,0,0];varperiod=[0,5,8.5,17.75,22,24];vararrival=newDate(event.record.出社日時.value);varleaving=newDate(event.record.退社日時.value);vartime=(leaving.getTime()-arrival.getTime())/1000/60/60;varstart=arrival.getHours()+arrival.getMinutes()/60;while(time\>0){if(start\>=period[4]){sum[2]+=Math.min(period[5]-start,time);time-=Math.min(period[5]-start,time);start=period[0];}elseif(start\>=period[3]){sum[1]+=Math.min(period[4]-start,time);time-=Math.min(period[4]-start,time);start=period[4];}elseif(start\>=period[2]){sum[0]+=Math.min(period[3]-start,time);time-=Math.min(period[3]-start,time);start=period[3];}elseif(start\>=period[1]){sum[1]+=Math.min(period[2]-start,time);time-=Math.min(period[2]-start,time);start=period[2];}else{sum[2]+=Math.min(period[1]-start,time);time-=Math.min(period[1]-start,time);start=period[1];}}event.record.実働時間.value=sum[0];event.record.残業時間合計.value=sum[1];event.record.深夜残業時間合計.value=sum[2];returnevent;});})();
また間違えやすいのですが、「Java」と「JavaScript」は別の言語ですので区別した方が良いかと思います。
江田篤史 様
ご教授頂きまして誠にありがとうございます。
理想としていた動作をさせることができました。
「Java」と「JavaScript」違い、大変失礼いたしました。
調べていると[中国]と[中国地方]くらい違うといった比喩もありました。。勉強不足でした。
>江田様
こちらの回答を参考に設定していたのですが、valueのエラーが発生するようです。
何か原因考えられますでしょうか
OHNさん
お世話になっております。
「勤務時間時」フィールドのフィールドコードが「勤務時間時」になっているか、今一度ご確認いただけますか?
江田様
お世話になっております。
確認したのですが「勤務時間時」ではなく「勤務時間自」となっていました。
失礼いたしました。
しかしながら合計計算に0は反応しますが数値がはいりません。
(function() {
"use strict";
kintone.events.on([
'app.record.create.change.勤務時間自', 'app.record.edit.change.勤務時間自',
'app.record.create.change.勤務時間至', 'app.record.edit.change.勤務時間至',
], function (event){
var sum = [0, 0, 0];
var period = [0, 5, 9, 17.5, 22, 24];
var arrival = new Date(event.record.勤務時間自.value);
var leaving = new Date(event.record.勤務時間至.value);
var time = (leaving.getTime() - arrival.getTime()) / 1000 / 60 / 60;
var start = arrival.getHours() + arrival.getMinutes() / 60;
while(time > 0){
if(start >= period[4]){
sum[2] += Math.min(period[5]-start, time);
time -= Math.min(period[5]-start, time);
start = period[0];
}else if(start >= period[3]){
sum[1] += Math.min(period[4]-start, time);
time -= Math.min(period[4]-start, time);
start = period[4];
}else if(start >= period[2]){
sum[0] += Math.min(period[3]-start, time);
time -= Math.min(period[3]-start, time);
start = period[3];
}else if(start >= period[1]){
sum[1] += Math.min(period[2]-start, time);
time -= Math.min(period[2]-start, time);
start = period[2];
}else{
sum[2] += Math.min(period[1]-start, time);
time -= Math.min(period[1]-start, time);
start = period[1];
}
}
event.record.実働時間.value = sum[0];
event.record.残業時間合計.value = sum[1];
event.record.深夜残業時間合計.value = sum[2];
return event;
});
})();
OHNさん
上記は、「出社日時」と「退社日時」のフィールドタイプが日時であることを想定しています。
OHNさんのアプリでは時刻フィールドだと思うので、そちらにあった計算をすると良いと思います。
時刻フィールドの値は’17:30’のような形式なので、「:」で分ければ時間と分をそれぞれ得られるかと思います。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/split
こちらは「日時」の表記でしたか。
時刻のほうが複雑になるんですね。もう少し勉強してからでないと応用できなさそうですね><
ありがとうございます。