iT邦幫忙

1

請問請假系統該如何扣除休息時間

以下是請假系統,一小部分程式碼
請假以30分鐘為單位
若請假有跨到10:00~10:15 要扣0.25小時
判斷式如何新增

有想了好幾個,但最後感覺是不能使用

if (sHour != 08 && sHour < 12 && eHour <= 12)  { 
	if (sDate.equals(eDate)) {
		totalTime = eHour - sHour;
	if (sMin > eMin) { totalTime = totalTime - 0.5; }
	if (sMin < eMin) { totalTime = totalTime + 0.5; }
...
...
...
...
...
ccutmis iT邦高手 9 級 ‧ 2018-03-30 22:00:38 檢舉
0.25等於四分之一對吧,那0.25小時是指15分鐘嗎,
如果是的話,本文的意思是說
如果請假的時間有跨到10:00-10:15這段時間的話,
會額外多算請15分鐘嗎,
例如A員工請了09:50-10:50,原本算一小時(兩個半小時),
因為跨了特殊時段,所以他請假的時間算一小時又15分?
又或者是一小時減去15分?又或者根本不用計算,
我個人覺得這是制度(SOP)問題要先理清楚,
例如一家公司放飯時間一小時,
那請半天假剛好跨過吃飯時間,
請問你要去跟公司拗這一小時嗎...
其實我是來亂的...XD
froce iT邦大師 4 級 ‧ 2018-03-31 06:53:18 檢舉
我猜是為了勞基法的每工作多少時間應讓勞工休息的問題。
froce iT邦大師 4 級 ‧ 2018-03-31 06:56:50 檢舉
然後這個我會分開寫,寫一個function判斷是否包含這段時間,是的話再扣除。
和請假時間計算分開算,這樣彈性比較大,也好維護。
0
evio0502
iT邦新手 3 級 ‧ 2018-03-30 18:08:45

我的方法分享一下:
把時間轉置(起始、休息起、休息迄、結束)
然後-->((結束-起始)-(休息迄-休息起))/60=工作小時數
//a=日期;b=小時;c=分鐘
var g_a=DateDiff(a,'1899/12/31')*1440;
var g_b=parseInt(b,10)*60;
var g_c=parseInt(c,10);
var g_time = parseInt(g_a,10)+parseInt(g_b,10)+parseInt(g_c,10);
當然~中間要加判斷式~判斷起迄中是否有包含休息~

抱歉有點晚回,這幾天在測試
我把每個時段都加入判斷
有兩種情況下可使用
1.不跨日
2.請假兩日以上的話起始日為08:30(上班時間)
或是 結束日為18:00(下班時間)
以上兩個符合一個即可

不能用的如:
今日1300請假到隔日1200 (一樣是八小時但算不出來)
或是只要有跨日起始日 和 結束日 都不完整 就無法請假

檢查之後發現是因為
前人在設計的時候,是直接使用電簽內建行事曆
完整1天是用1天*8小時來計算
並不是透過時間算出八小時

我現在用了一個新做法
就是只要程式算不出來
就由使用者自行填入時數
不過還是遇到一些問題
當CheckInputTime打勾時,手輸時數 不會帶入時數到totalHours那一格

CheckInputTime == true
是要判斷CheckInputTime如果有打勾的話才執行
我不知道該如何做
還請大師指點

另外否可指點還有哪邊需要在修正
謝謝

https://ithelp.ithome.com.tw/upload/images/20180412/20082456sQ2i0oeWNv.jpg

其中一段程式碼如下

if (sHour >= 13 && eHour < 18) { //下午小時
	if (sDate.equals(eDate)) {
		totalTime = eHour - sHour;
	if (sMin > eMin) { totalTime = totalTime - 0.5; }
	if (sMin < eMin) { totalTime = totalTime + 0.5; }
} else if (totalTime != null) {
        Form.setValue("totalHours", totalTime);
} else if (CheckInputTime == true && inputHours != null){
        Form.getValue("inputHours");
        Form.setValue("totalHours", inputHours);
} else {
        Form.showMessageDialog("此請假區間無法跨日!請勾選手輸時數,並填入正確請假時數,由人資部審核");
	}
}
evio0502 iT邦新手 3 級 ‧ 2018-04-12 11:46:28 檢舉

我也是在電子簽核上維護請假、加班系統的~
我的判斷方法是参考鼎新TIPTOP透過歷年轉置去算出起始點、休息起始點、休息截止點、下班截止點
1.上班-下班=總時數
2.休息迄-休息起=休息時數
3.判斷請假起、請假迄是否有在休息時間內
4.判斷請假起、請假迄是否不符合上下班時間
5.判斷請假截止是否介於休息起迄,若是-->休息時間=休息起-請假截止
6.判斷請假起始是否介於休息起迄,若是-->休息時間=請假起始-休息迄
7.總時數-請假時數-休息時數(扣除請假涵蓋部分)

WilliamHuang
iT邦研究生 1 級 ‧ 2018-03-30 18:09:28
【**此則訊息已被站方移除**】
3
Albert
iT邦高手 1 級 ‧ 2018-03-31 07:47:05

給你一個案例

你是否向思考都是扣除法
例如 10:00 - 10:15 休息

我們是這樣寫
08:00 - 10:00
10:15 - 12:15
13:00 - 15:00
15:15 - 17:15
是上班時間

9:00 請假到 16:00 真實請假時間是 ?
08:00 - 10:00 => 起點落入此時段, 結束晚於此時段 10:00 - 09:00 = 1:00
10:15 - 12:15 => 起點早於此時段, 結束晚於此時段 12:15 - 10:15 = 2:00
13:00 - 15:00 => 起點早於此時段, 結束晚於此時段 15:00 - 13:00 = 2:00
15:15 - 17:15 => 起點早於此時段, 結束落入此時段 16:00 - 15:15 = 0:45

專於 開放原碼 ERP 20年 iDempiere ERP 開放原碼結合 SAP 多對多設定方式

抱歉有點晚回,這幾天在測試
我把每個時段都加入判斷
有兩種情況下可使用
1.不跨日
2.請假兩日以上的話起始日為08:30(上班時間)
或是 結束日為18:00(下班時間)
以上兩個符合一個即可

不能用的如:
今日1300請假到隔日1200 (一樣是八小時但算不出來)
或是只要有跨日起始日 和 結束日 都不完整 就無法請假

檢查之後發現是因為
前人在設計的時候,是直接使用電簽內建行事曆
完整1天是用1天*8小時來計算
並不是透過時間算出八小時

我現在用了一個新做法
就是只要程式算不出來
就由使用者自行填入時數
不過還是遇到一些問題
當CheckInputTime打勾時,手輸時數 不會帶入時數到totalHours那一格

CheckInputTime == true
是要判斷CheckInputTime如果有打勾的話才執行
我不知道該如何做
還請大師指點

另外否可指點還有哪邊需要在修正
謝謝

https://ithelp.ithome.com.tw/upload/images/20180412/20082456sQ2i0oeWNv.jpg

其中一段程式碼如下

if (sHour >= 13 && eHour < 18) { //下午小時
	if (sDate.equals(eDate)) {
		totalTime = eHour - sHour;
	if (sMin > eMin) { totalTime = totalTime - 0.5; }
	if (sMin < eMin) { totalTime = totalTime + 0.5; }
} else if (totalTime != null) {
        Form.setValue("totalHours", totalTime);
} else if (CheckInputTime == true && inputHours != null){
        Form.getValue("inputHours");
        Form.setValue("totalHours", inputHours);
} else {
        Form.showMessageDialog("此請假區間無法跨日!請勾選手輸時數,並填入正確請假時數,由人資部審核");
	}
}
Albert iT邦高手 1 級 ‧ 2018-04-12 20:50:57 檢舉

當然是一天一天比對
依據該部門該職務應出勤時間表
是一天一天去比對
假如跨日跨月份一樣都是一天一天比對

0
做工仔人!
iT邦高手 1 級 ‧ 2018-03-31 09:25:03

select begin_time= 開始請假時間的整點x60 + 分鐘 =>開始請假的時間是從當天的第幾分鐘開始
select end_time= 結束請假時間的整點x60 + 分鐘 =>結束請假的時間是從當天的第幾分鐘

SELECT total_reset_time= end_time-begin_time =>當天的總請假分鐘數

SELECT 休息時間1的開始時間=10x60 = 600
SELECT 休息時間1的結束時間=10x60+15 = 615
--扣第一段休息時間
IF begin_time <=600 AND end_time >= 615 then
select total_reset_time= total_reset_time-15
end if
--扣第二段休息時間

--最後:
SELECT 請假時數=total_reset_time/60

evio0502 iT邦新手 3 級 ‧ 2018-03-31 09:28:08 檢舉

上班時間跨天;休息時間跨天的話得多下條件~

0
untitled
iT邦新手 5 級 ‧ 2018-03-31 19:32:16

a=Abs(10:00-10:30) MOD 15 =2

b= a*0.25=30分鐘

上班時間起迄建議轉換為分鐘計算比較好懂
23:00~2:00 跨時段
(1440+120)-1380=上班分鐘

untitled iT邦新手 5 級 ‧ 2018-03-31 19:46:20 檢舉

你要定義的地方很多 像是00-15歸屬於15 那就是不無法整除15的要+1
自己本身寫排班表的人 還有很多需要考慮的地方你得思考

我要發表回答

立即登入回答