有休自動計算をしたい

 

いつもお世話になっております。アルバイトの有休日と時間数の計算と残の日と時間数を計算したいですが、うまく方法が見つからず焦っております。

一旦はとりあいず、有休をとりましたら、アルバイトが記入するようにしたいですが、なかなかうまく行きません。知恵とアドバイスいただきたく投稿させていただきました。ご教授いただけたら幸いです。よろしくお願いいたします。

 

このように、有給日数を選んだ場合、有給日数フィールドに「1日」と自動表示され

有給時間数を選んだ場合、終了ー開始ー休憩=有給時間フィールドに自動計算。 

(function() {
“use strict”;
kintone.events.on([“app.record.create.show”, “app.record.edit.show”, “app.record.create.change.Table”, “app.record.edit.change.Table”], function(event) {
event.record.有給日数.disabled = true;
event.record.総有給時間数.disabled = true;
var table = event.record.Table.value;
table.forEach(function(row) {
row.value.有給時間.disabled = true;
});
return event;
});
kintone.events.on([
“app.record.create.show”, “app.record.edit.show”, “app.record.create.change.Table”, “app.record.edit.change.Table”,
“app.record.create.submit”, “app.record.edit.submit”,
“app.record.create.change.区分”, “app.record.edit.change.区分”,
“app.record.create.change.開始”, “app.record.edit.change.開始”,
“app.record.create.change.終了”, “app.record.edit.change.終了”,
“app.record.create.change.休憩”, “app.record.edit.change.休憩”,
“app.record.create.change.有給日数”, “app.record.edit.change.有給日数”,
], function(event) {
var record = event.record;
var mwork = { ‘総有給時間数’: moment.duration(0) };
var mcount = { ‘合計有給日数’: 0 };
var table = record.Table.value;
table.forEach(function(row) {

if (row.value.区分.value === ‘有給日数’) {
row.value.有給日数.value = 1;
mcount[‘合計有給日数’]++;
}

if (row.value.開始.value && row.value.終了.value && row.value.休憩.value) {
var whours = moment.duration(row.value.終了.value).subtract(moment.duration(row.value.開始.value)).subtract(Number(row.value.休憩.value), ‘minutes’);
if (whours.as(‘hours’) > 0) {
row.value.有給時間.value = whours.get(‘hours’) + '時間 ';
var kubun = ‘総’ + row.value.区分.value;
mwork[kubun] = mwork[kubun].add(whours);
}
else {
row.value.終了.error = ‘開始 > 終了’;
}
} else {
row.value.有給時間.value = ‘’;
}
});
Object.keys(mwork).forEach(function(key) {
record[key].value = parseInt(mwork[key].as(‘hours’)) + '時間 ';
});
return event;
});

})();

篠原 麗様

お世話になっております。 cstapの江田と申します。

総有給日数と総有給時間数を計算フィールド、有給日数と有給時間を数値フィールドとした上で下記のように実装してみては如何でしょうか?

・総有給日数の計算式: SUM(有給日数)

・総有給時間数の計算式: SUM(有給時間)

・JavaScriptファイル

(function(){"use strict";kintone.events.on(["app.record.create.show","app.record.edit.show"],function(event){event.record.総有給日数.disabled=true;event.record.総有給時間数.disabled=true;event.record.Table.value.forEach(function(row){row.value.有給日数.disabled=true;row.value.有給時間.disabled=true;row=changeDaysAndHoursInTableRow(row);});returnevent;});kintone.events.on(["app.record.create.change.Table","app.record.edit.change.Table","app.record.create.change.開始","app.record.edit.change.開始","app.record.create.change.終了","app.record.edit.change.終了","app.record.create.change.休憩","app.record.edit.change.休憩","app.record.create.change.区分","app.record.edit.change.区分",],function(event){varrow=event.changes.row;row.value.有給日数.disabled=true;row.value.有給時間.disabled=true;row=changeDaysAndHoursInTableRow(row);returnevent;});functionchangeDaysAndHoursInTableRow(row){if(row.value.区分.value==="有給日数"){row.value.有給日数.value=1;row.value.有給時間.value=0;}elseif(row.value.区分.value==="有給時間数"){row.value.有給日数.value=0;if(typeofrow.value.開始.value!=="undefined"&&typeofrow.value.終了.value!=="undefined"&&typeofrow.value.休憩.value!=="undefined"){varstart\_time;varend\_time;start\_time=row.value.開始.value.split(':');end\_time=row.value.終了.value.split(':');row.value.有給時間.value=((Number(end\_time[0])\*60+Number(end\_time[1]))-(Number(start\_time[0])\*60+Number(start\_time[1]))-Number(row.value.休憩.value))/60;}else{row.value.有給時間.value=0;}}else{row.value.有給日数.value=0;row.value.有給時間.value=0;}returnrow;}})();

※フィールドコードは添付画像にあったフィールド名と一致させています。

江田篤史

お世話になっております。コードまで教えていただき、本当にありがとうございます。想像していた動作ができるようになりました。

「有休時間数」を選択した場合、開始・終了・休憩を必須登録項目にすることはできますでしょうか?

自分では「有休日数」を選んだ場合、開始・終了・休憩を編集不可には書いてみました。

大変恐縮でございますが、再びアドバイスいただけたら幸いです。よろしくお願い致します。

(function() {
“use strict”;
kintone.events.on([“app.record.create.show”, “app.record.edit.show”], function(event) {
event.record.総有給日数.disabled = true;
event.record.総有給時間数.disabled = true;
event.record.Table.value.forEach(function(row) {
row.value.有給日数.disabled = true;
row.value.有給時間.disabled = true;
row = changeDaysAndHoursInTableRow(row);
});
return event;
});
kintone.events.on([
“app.record.create.change.Table”, “app.record.edit.change.Table”,
“app.record.create.change.開始”, “app.record.edit.change.開始”,
“app.record.create.change.終了”, “app.record.edit.change.終了”,
“app.record.create.change.休憩”, “app.record.edit.change.休憩”,
“app.record.create.change.区分”, “app.record.edit.change.区分”,
], function(event) {
var row = event.changes.row;
row.value.有給日数.disabled = true;
row.value.有給時間.disabled = true;
row = changeDaysAndHoursInTableRow(row);
return event;
});
function changeDaysAndHoursInTableRow(row){
if(row.value.区分.value === “有給日数”){
row.value.有給日数.value = 1;
row.value.有給時間.value = 0;
row.value.開始.value = [];//valueを空にする
row.value.終了.value = [];//valueを空にする
row.value.休憩.value = [];//valueを空にする
row.value.開始.disabled = true;
row.value.終了.disabled = true;
row.value.休憩.disabled = true;
}else if(row.value.区分.value === “有給時間数”){
row.value.有給日数.value = 0;
row.value.開始.disabled = false;
row.value.終了.disabled = false;
row.value.休憩.disabled = false;
if(typeof row.value.開始.value !== “undefined” && typeof row.value.終了.value !== “undefined” && typeof row.value.休憩.value !== “undefined”){
var start_time;
var end_time;
start_time = row.value.開始.value.split(‘:’);
end_time = row.value.終了.value.split(‘:’);
row.value.有給時間.value = ((Number(end_time[0]) * 60 + Number(end_time[1])) - (Number(start_time[0]) * 60 + Number(start_time[1])) - Number(row.value.休憩.value)) / 60;
}else{
row.value.有給時間.value = 0;
}
}else{
row.value.有給日数.value = 0;
row.value.有給時間.value = 0;
}
return row;
}
})();

区分を一回有給日数で登録してから、有給時間数に直すと、「有給時間」と「有給日数」の前に登録したところのロックが全部なくなってしまいます。なにかいい方法ありますでしょうか?よろしくお願い致します。

篠原 麗様

お世話になっております。 cstapの江田です。

以下のような記述で実装できるかと思います。

(function(){"use strict";kintone.events.on(["app.record.create.show","app.record.edit.show"],function(event){event.record.総有給日数.disabled=true;event.record.総有給時間数.disabled=true;event.record.Table.value.forEach(function(row){if(row.value.区分.value!=="有給時間数"){row.value.開始.disabled=true;row.value.終了.disabled=true;row.value.休憩.disabled=true;}row.value.有給日数.disabled=true;row.value.有給時間.disabled=true;row=changeDaysAndHoursInTableRow(row);});returnevent;});kintone.events.on(["app.record.create.change.Table","app.record.edit.change.Table","app.record.create.change.開始","app.record.edit.change.開始","app.record.create.change.終了","app.record.edit.change.終了","app.record.create.change.休憩","app.record.edit.change.休憩","app.record.create.change.区分","app.record.edit.change.区分",],function(event){varrow=event.changes.row;if(row.value.区分.value!=="有給時間数"){row.value.開始.disabled=true;row.value.終了.disabled=true;row.value.休憩.disabled=true;}else{row.value.開始.disabled=false;row.value.終了.disabled=false;row.value.休憩.disabled=false;}row.value.有給日数.disabled=true;row.value.有給時間.disabled=true;row=changeDaysAndHoursInTableRow(row);returnevent;});kintone.events.on(["app.record.create.submit","app.record.edit.submit"],function(event){event.record.Table.value.forEach(function(row){if(row.value.区分.value==="有給時間数"){if(!row.value.開始.value)row.value.開始.error="必須項目です。";if(!row.value.終了.value)row.value.終了.error="必須項目です。";if(!row.value.休憩.value)row.value.休憩.error="必須項目です。";}});returnevent;});functionchangeDaysAndHoursInTableRow(row){if(row.value.区分.value==="有給日数"){row.value.有給日数.value=1;row.value.有給時間.value=0;}elseif(row.value.区分.value==="有給時間数"){row.value.有給日数.value=0;if(typeofrow.value.開始.value!=="undefined"&&typeofrow.value.終了.value!=="undefined"&&typeofrow.value.休憩.value!=="undefined"){varstart\_time;varend\_time;start\_time=row.value.開始.value.split(':');end\_time=row.value.終了.value.split(':');row.value.有給時間.value=((Number(end\_time[0])\*60+Number(end\_time[1]))-(Number(start\_time[0])\*60+Number(start\_time[1]))-Number(row.value.休憩.value))/60;}else{row.value.有給時間.value=0;}}else{row.value.有給日数.value=0;row.value.有給時間.value=0;}returnrow;}})();

江田篤史

再びご指導いただき、本当にありがとうございます。

理想な動きができました。毎度毎度本当にありがとうございます。

ロジックも含め、とても勉強になりました。