以下是請假系統,一小部分程式碼
請假以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; }
...
...
...
...
...
我的方法分享一下:
把時間轉置(起始、休息起、休息迄、結束)
然後-->((結束-起始)-(休息迄-休息起))/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如果有打勾的話才執行
我不知道該如何做
還請大師指點
另外否可指點還有哪邊需要在修正
謝謝
其中一段程式碼如下
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("此請假區間無法跨日!請勾選手輸時數,並填入正確請假時數,由人資部審核");
}
}
我也是在電子簽核上維護請假、加班系統的~
我的判斷方法是参考鼎新TIPTOP透過歷年轉置去算出起始點、休息起始點、休息截止點、下班截止點
1.上班-下班=總時數
2.休息迄-休息起=休息時數
3.判斷請假起、請假迄是否有在休息時間內
4.判斷請假起、請假迄是否不符合上下班時間
5.判斷請假截止是否介於休息起迄,若是-->休息時間=休息起-請假截止
6.判斷請假起始是否介於休息起迄,若是-->休息時間=請假起始-休息迄
7.總時數-請假時數-休息時數(扣除請假涵蓋部分)
給你一個案例
你是否向思考都是扣除法
例如 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如果有打勾的話才執行
我不知道該如何做
還請大師指點
另外否可指點還有哪邊需要在修正
謝謝
其中一段程式碼如下
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("此請假區間無法跨日!請勾選手輸時數,並填入正確請假時數,由人資部審核");
}
}
當然是一天一天比對
依據該部門該職務應出勤時間表
是一天一天去比對
假如跨日跨月份一樣都是一天一天比對
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
a=Abs(10:00-10:30) MOD 15 =2
b= a*0.25=30分鐘
上班時間起迄建議轉換為分鐘計算比較好懂
23:00~2:00 跨時段
(1440+120)-1380=上班分鐘