請假系統程式說明文件
===
## 文件大綱
[ToC]
## 系統使用案例圖

## 系統介面/主要功能介紹
### 管理者
---

**一、管理員工名單**
> 可以查看、修改所有員工資料,並新增一名員工紀錄。
**二、請假單維護**
**1. 新增請假單**
>可以新增任何員工的請假單。
**2. 刪除請假單**
>可以刪除任何員工的請假單。
**三、特休維護**
**1. 修改特休天數**
>可以修改所有員工的特休天數。
**四、補休/加班費維護**
**1. 新增補休/加班費申請單**
>可以將任何員工的加班時數換成補休時數或加班費。
**2. 刪除補休/加班費申請單**
>可以刪除任何員工的補休/加班費申請單。
**3. 修改補休天數**
>可以修改所有員工的補休天數。
**五、加班單維護**
**1. 新增加班單**
>可以新增任何員工的加班單。
**2. 刪除加班單**
>可以修改任何員工的加班單。
### 使用者
---

#### [PM]
**一、查詢請假、特休、補休明細**
**1. 查詢請假單明細**
>可以查看個人當月份的請假單。
**2. 查詢特休天數**
>可以查看個人的特休天數狀況。
**3. 查詢補休天數**
>可以查看個人的補休天數狀況。
**二、請假申請**
**1. 請假申請**
>可以新增個人的請假單。
**2. 刪除請假申請**
>可以刪除個人的請假單。
**三、補休或加班費申請**
>可以將個人的加班時數換成補休時數或加班費。
**四、加班申請**
>可以新增任何員工的加班單。
#### [一般員工]
**一、查詢請假、特休、補休明細**
**1. 查詢請假單明細**
>可以查看個人當月份的請假單。
**2. 查詢特休天數**
>可以查看個人的特休天數狀況。
**3. 查詢補休天數**
>可以查看個人的補休天數狀況。
**二、請假申請**
**1. 請假申請**
>可以新增個人的請假單。
**2. 刪除請假申請**
>可以刪除個人的請假單。
**三、補休或加班費申請**
>可以將個人的加班時數換成補休時數或加班費。
## 資料庫架構
檔案連結:
https://docs.google.com/spreadsheets/d/17G21VIgFAJJNkyV2RS5VftyY4GHfmSWq/edit#gid=269463279
**leave_sheet 請假單**
| leave_record_number | application_time | leave_applicant | start_date | start_hour | start_minute | end_date | end_hour | end_minute | leave_type | reason | department | PM_and_deputy | duration | confirm |
| -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
| 請假單編號 | 時間戳記 | 請假申請人 | 請假開始日期 | 時 | 分 | 請假結束日期 | 時 | 分 | 假別 | 請假事由 | 部門 | PM及代理人 | 請假時數 | 主管簽核 |
**overtime_sheet 加班單**
| overtime_record_number | application_time | overtime_staff | department | project | PM | description | start_date | start_hour | start_minute | end_date | end_hour | end_minute | approved_overtime_hours | approved_compensatory_leave_hours | approved_overtime_pay |applied |
| -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
| 加班單編號 | 時間戳記 | 加班人員 | 部門 | 專案名稱 | (主管)、PM | 工作說明 | 加班開始日期 | 時 | 分 | 加班結束日期 | 時 | 分 | 核定加班時數 | 核定補休時數 | 核定加班費 | 已申請補休或加班費 |
## 系統程式碼說明
程式檔案路徑:`/usr/local/apache-tomcat-6.0.45/webapps/APCWKTPostgreSQL/LVS/LVS_jsp`
### 管理者
---
**一、管理員工名單**
(檔名: `a_employee_list.jsp`)
從資料庫的`employee_sheet`表選取所有員工資料,顯示到頁面中。
按下送出後,取得選取到的員工為哪一項,並判斷各欄位值是否為空。
若選新增一名員工,則將欄位填入值加到`employee_sheet`表。
再計算該名員工的特休天數,將資料加到`a_day`表。
若選某名員工項,則修改`employee_sheet`、`a_day`表中該名員工的資料。
**二、請假單維護**
**1. 新增請假單**
(檔名: `a_add_leave_record.jsp.jsp`)
取得管理者輸入之請假單內容。
選取`work_day`、`national_holiday`檢查請假日期時間是否為上班時間。
並選取`employee_sheet`檢查PM及代理人之email是否填寫正確。
新增一筆請假單明細至`leave_sheet`。
在`leave_summary`中加上請假天數。
若請補休假,更新`c_hour`。若請特休假,更新`a_day`。
並寄信件通知申請人、主管、HR、PM及代理人,要求主管審核。
**2. 刪除請假單**
(檔名: `a_delete_leave_record.jsp`)
選取所有請假紀錄,並顯示到頁面中。
```=
"SELECT * FROM leave_sheet"
```
按下按鈕後,取得選擇的請假單明細為哪一項。
```=
var leave_radio = $('input[name=leave_radio]:checked').val();
```
刪除選到的那筆請假記錄。
```=
"delete from leave_sheet where leave_record_number='"+delete_leave_record_number+"'"
```
辨識請假類型,修改請假天數。
```=
if(leave_type.equals("特休")){
modify="annual_leave";
}else if(leave_type.equals("補休"))...
```
```=
"update leave_summary set "+modify+"="+modify+"-"+duration_day+" where name='"+leave_applicant+"'"
```
如果是刪除申請特休假,更新`a_day`表:
```=
"update a_day set used_annual_leave_days = used_annual_leave_days - "+duration_day+" where name='"+leave_applicant+"'"
```
如果是刪除申請補休假,更新`c_hour`表:
```=
//選取c_hour資料
"SELECT * FROM c_hour WHERE name='"+leave_applicant+"' ORDER BY compensatory_leave_expiry_date DESC"
//更新尚未使用補休時數
"update c_hour set unused_compensatory_leave_hours ="+c_hour_array[j][2]
+",used_compensatory_leave_hours = 0 where apply_number='"+c_hour_array[j][0]+"'"
"update c_hour set unused_compensatory_leave_hours ="+temp
+", used_compensatory_leave_hours = used_compensatory_leave_hours - "+duration_hour
+"where apply_number='"+c_hour_array[j][0]+"'"
```
並寄信件通知申請人、主管、HR、PM及代理人。
**三、特休維護**
**1. 修改特休天數**
(檔名: `a_modify_annual_leave.jsp`)
選取特休天數資料,顯示到頁面中。
```=
SELECT * FROM a_day
```
按下按鈕後,取得選擇的員工明細為哪一項。
```=
var annual_radio = $('input[name=annual_record]:checked').val();
```
修改被選取員工的特休天數。
```=
"update a_day set annual_leave_days='" + annual_leave_days + "',used_annual_leave_days='" + used_annual_leave_days + "',unused_annual_leave_days='" + unused_annual_leave_days + "' where name='" + modify_name + "'"
```
**四、補休/加班費維護**
**1. 新增補休/加班費申請單**
(檔名: `a_add_apply.jsp`)
選取所有加班紀錄。
```=
"SELECT * FROM overtime_sheet"
```
按下按鈕後,取得選擇的加班紀錄。
```=
var o_radio = $('input[name=overtime_record]:checked').val();
```
若實際結束時間欄位不為空,則重新計算加班時數。
```=
function getDays(date1 , date2, hour1, hour2, minute1, minute2){...}
```
查詢加班時數對應的補休時數和加班費。
```=
"SELECT * FROM c_o_reference WHERE overtime_hours="+int_approved_overtime_hours
```
判斷加班日期為平日還假日,獲取對應的加班費/補休時數。
```=
if(day1 == 6 || day1 == 0){...}
```
新增補休/加班費申請單到`c_o_sheet`。
並寄信件通知申請人、主管、HR、PM及代理人,要求主管審核。
**2. 刪除補休/加班費申請單**
(檔名: `a_delete_apply.jsp`)
選取`c_o_sheet`中所有補休/加班費申請單明細。
取得管理者選擇要刪除的一筆補休/加班費申請單明細。
刪除`c_o_sheet`中的一筆補休/加班費申請單明細。
修改`overtime_sheet`中`applied`欄位為no,代表此筆加班未申請補休/加班費。
並寄信件通知申請人、主管、HR、PM。
**3. 修改補休天數**
(檔名: `a_modify_compensatory_leave.jsp`)
選取`c_hour`中所有補休時數明細。
取得管理者選擇並填入的補休時數。
修改`c_hour`中此筆補休時數明細。
**五、加班單維護**
**1. 新增加班單**
(檔名: `a_add_overtime_record.jsp`)
取得管理者輸入之加班單內容。
選取`work_day`、`national_holiday`檢查請假日期時間是否為上班時間。
並選取`employee_sheet`檢查PM及代理人之email是否填寫正確。
新增一筆加班單明細至`overtime_sheet`。
並寄信件通知申請人、主管、HR、PM。
**2. 刪除加班單**
(檔名: `a_delete_overtime_record.jsp`)
選取`overtime_sheet`中所有加班單明細。
取得管理者選擇要刪除的一筆加班單明細。
刪除`overtime_sheet`中的一筆加班單明細。
並寄信件通知申請人、主管、HR、PM。
### 使用者
---
#### [PM]
辨認身分:取得登入者帳號名字。
**一、查詢請假、特休、補休明細**
**1. 查詢請假單明細**
(檔名: `p_leave_record.jsp`)
查詢`leave_sheet`中使用者的請假單明細。
篩選顯示出當月的請假記錄。
**2. 查詢特休天數**
(檔名: `p_annual_leave.jsp`)
查詢`a_day`中使用者的特休天數資料,顯示詳細資訊。
**3. 查詢補休天數**
(檔名: `p_compensatory_leave.jsp`)
查詢`c_hour`中使用者的補休天數資料,顯示詳細資訊。
**二、請假申請**
**1. 請假申請**
(檔名: `p_add_leave_record.jsp`)
取得使用者輸入之請假單內容。
選取`work_day`、`national_holiday`檢查請假日期時間是否為上班時間。
並選取`employee_sheet`檢查PM及代理人之email是否填寫正確。
新增一筆請假單明細至`leave_sheet`。
在`leave_summary`中加上請假天數。
若請補休假,更新`c_hour`。若請特休假,更新`a_day`。
並寄信件通知申請人、主管、HR、PM及代理人,要求主管審核。
**2. 刪除請假申請**
(檔名: `p_delete_leave_record.jsp`)
選取使用者的請假紀錄,並顯示到頁面中。
```=
"SELECT * FROM leave_sheet"
```
按下按鈕後,取得選擇的請假單明細為哪一項。
```=
var leave_radio = $('input[name=leave_radio]:checked').val();
```
刪除選到的那筆請假記錄。
```=
"delete from leave_sheet where leave_record_number='"+delete_leave_record_number+"'"
```
辨識請假類型,修改請假天數。
```=
if(leave_type.equals("特休")){
modify="annual_leave";
}else if(leave_type.equals("補休"))...
```
```=
"update leave_summary set "+modify+"="+modify+"-"+duration_day+" where name='"+leave_applicant+"'"
```
如果是刪除申請特休假,更新`a_day`表:
```=
"update a_day set used_annual_leave_days = used_annual_leave_days - "+duration_day+" where name='"+leave_applicant+"'"
```
如果是刪除申請補休假,更新`c_hour`表:
```=
//選取c_hour資料
"SELECT * FROM c_hour WHERE name='"+leave_applicant+"' ORDER BY compensatory_leave_expiry_date DESC"
//更新尚未使用補休時數
"update c_hour set unused_compensatory_leave_hours ="+c_hour_array[j][2]
+",used_compensatory_leave_hours = 0 where apply_number='"+c_hour_array[j][0]+"'"
"update c_hour set unused_compensatory_leave_hours ="+temp
+", used_compensatory_leave_hours = used_compensatory_leave_hours - "+duration_hour
+"where apply_number='"+c_hour_array[j][0]+"'"
```
並寄信件通知申請人、主管、HR、PM及代理人,要求主管審核。
**三、補休或加班費申請**
(檔名: `p_add_apply.jsp`)
選取所有加班紀錄。
```=
"SELECT * FROM overtime_sheet"
```
按下按鈕後,取得選擇的加班紀錄。
```=
var o_radio = $('input[name=overtime_record]:checked').val();
```
若實際結束時間欄位不為空,則重新計算加班時數。
```=
function getDays(date1 , date2, hour1, hour2, minute1, minute2){...}
```
查詢加班時數對應的補休時數和加班費。
```=
"SELECT * FROM c_o_reference WHERE overtime_hours="+int_approved_overtime_hours
```
判斷加班日期為平日還假日,獲取對應的加班費/補休時數。
```=
if(day1 == 6 || day1 == 0){...}
```
新增補休/加班費申請單到`c_o_sheet`。
並寄信件通知申請人、主管、HR、PM及代理人,要求主管審核。
**四、加班申請**
(檔名: `p_add_overtime_record.jsp`)
取得使用者輸入之加班單內容。
選取`work_day`、`national_holiday`檢查請假日期時間是否為上班時間。
並選取`employee_sheet`檢查PM及代理人之email是否填寫正確。
新增一筆加班單明細至`overtime_sheet`。
並寄信件通知申請人、主管、HR、PM。
#### [一般員工]
**一、查詢請假、特休、補休明細**
**1. 查詢請假單明細**
(檔名: `u_leave_record.jsp`)
同PM`p_leave_record.jsp`
**2. 查詢特休天數**
(檔名: `u_annual_leave.jsp`)
同PM`p_annual_leave.jsp`
**3. 查詢補休天數**
(檔名: `u_compensatory_leave.jsp`)
同PM`p_compensatory_leave.jsp`
**二、請假申請**
**1. 請假申請**
(檔名: `u_add_leave_record.jsp`)
同PM`p_add_leave_record.jsp`
**2. 刪除請假申請**
(檔名: `u_delete_leave_record.jsp`)
同PM`p_delete_leave_record.jsp`
**三、補休或加班費申請**
(檔名: `u_add_apply.jsp`)
同PM`p_add_apply.jsp`
## 定時自動執行程式(批次)
linux系統的設定檔
檔案路徑:`/usr/bin/crontab`
修改檔案後重啟指令:`systemctl restart crond`
查看檔案內容指令:`cat /etc/crontab`
檢查是否有正確執行:`tail -f /var/log/cron`
http://linux.vbird.org/linux_basic/0430cron.php#cron
---
程式檔案路徑:`/usr/java/jdk1.8.0_65/bin`
**1. 年資滿一年自動修改**
(檔名:`timeupdateaday.sh`,執行時間:每天)
查詢`a_day`,並判斷`initial_date`距離現在時間是否滿一年。
若滿一年,則查詢`a_s_reference`對應的特休天數。
再更新`a_day`上的資料。
**2. 補休到期後自動刪除**
(檔名:`timedeletechour.sh`,執行時間:每天)
查詢`c_hour`,判斷補休到期日是否在今日之前。
若到期,則刪除該筆資料。
### 產生excel檔案
外部jar檔案:
`poi-4.1.0.jar`
`poi-ooxml-4.1.0.jar`
`poi-ooxml-schemas-4.1.0.jar`
`postgresql-42.2.6.jar`
**3. 產生請假申請單excel檔案,寄給cindy/chris**
(檔名:`timelsexcel.sh`,執行時間:每月30號)
查詢`leave_summary`,轉換成excel檔案。
再將`leave_summary.xls`寄給cindy。
**4. 產生補休與加班費申請記錄excel檔案,寄給cindy/chris**
(檔名:`timecoexcel.sh`,執行時間:每月30號/每週一)
查詢`c_o_sheet`,轉換成excel檔案。
再將`C_O_sheet.xls`寄給cindy。
### 寄信通知
**5. 寄信通知個人補休、特休天數**
(檔名:`timeac.sh`,執行時間:每月1號、10號)
查詢`c_hour`、`a_day`。
寄信給所有員工詳細資料。
**6. 寄信通知個人未申請之加班**
(檔名:`timeos.sh`,執行時間:每週一)
查詢`overtime_sheet`,且`appplied`欄位為no的資料。
寄信給所有員工詳細資料。
## 補充
:::info
有任何問題請聯絡Sunny或Grace!
:::
###### tags: `請假系統` `程式說明文件`