261 lines
8.1 KiB
C#
261 lines
8.1 KiB
C#
using System;
|
|
using System.Data;
|
|
using System.Configuration;
|
|
using System.Data.Common;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Wellan.Data;
|
|
using Wellan.Common;
|
|
using System.Linq;
|
|
|
|
/// <summary>
|
|
/// 節假日設定檔
|
|
/// </summary>
|
|
public class BhrdDAC : Wellan.Data.WDAC
|
|
{
|
|
private Hashtable bhrdData = new Hashtable();
|
|
private string nationalHolidays = "0101,0228,0501,1010";
|
|
|
|
public const string 排休 = "排休";
|
|
public const string 例假日 = "例假日";
|
|
public const string 休假日 = "休假日";
|
|
public const string 國定假日 = "國定假日";
|
|
public static readonly List<string> 休假日班表 = new List<string> { 排休, 例假日, 休假日, 國定假日 };
|
|
|
|
public BhrdDAC()
|
|
{
|
|
}
|
|
|
|
public BhrdDAC(string connectionConfig, string connectionConfigName)
|
|
: this()
|
|
{
|
|
this._connectionConfig = connectionConfig;
|
|
this._connectionConfigName = connectionConfigName;
|
|
}
|
|
|
|
public BhrdDAC(WQuery query)
|
|
{
|
|
this._query = query;
|
|
}
|
|
|
|
public DataTable GetAll()
|
|
{
|
|
return Query.Select("SELECT BHYER, BHHRD FROM BHRD ORDER BY BHYER");
|
|
}
|
|
|
|
public string[] GetYear(int Year)
|
|
{
|
|
DbCommand cmd = Query.NewCommand("SELECT BHYER, BHHRD FROM BHRD WHERE BHYER=@BHYER");
|
|
cmd.Parameters.Add(Query.NewParameter("BHYER", Year));
|
|
DataTable bhrd = Query.Select(cmd);
|
|
string yearData;
|
|
|
|
// 有資料,取出該年資料
|
|
if (bhrd.Rows.Count != 0)
|
|
{
|
|
yearData = bhrd.Rows[0]["BHHRD"].ToString();
|
|
}
|
|
// 無資料,回傳預設資料
|
|
else
|
|
{
|
|
char[] tmp = new char[366];
|
|
for (int i = 0; i < tmp.Length; i++)
|
|
{
|
|
tmp[i] = ' ';
|
|
}
|
|
|
|
DateTime aDate = new DateTime(Year, 1, 1);
|
|
for (int i = 0; i < tmp.Length; i++)
|
|
{
|
|
if (aDate.DayOfWeek == DayOfWeek.Sunday || aDate.DayOfWeek == DayOfWeek.Saturday)
|
|
tmp[i] = (char)HolidayType.Holiday;
|
|
else if (nationalHolidays.Contains(String.Format("{0:00}{1:00}", aDate.Month, aDate.Day)))
|
|
tmp[i] = (char)HolidayType.NationalHoliday;
|
|
else
|
|
tmp[i] = (char)HolidayType.WorkDay;
|
|
|
|
aDate = aDate.AddDays(1);
|
|
if (aDate.Year != Year)
|
|
break;
|
|
}
|
|
|
|
yearData = new String(tmp);
|
|
}
|
|
|
|
string[] result = new string[12];
|
|
for (int m = 1; m <= 12; m++)
|
|
{
|
|
DateTime aDate = new DateTime(Year, m, 1);
|
|
result[m - 1] = yearData.Substring(aDate.DayOfYear - 1, WGuard1.GetMonthEnd(aDate, 0).Day);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
private void SetYear(int Year, string[] YearData)
|
|
{
|
|
DbCommand cmd = Query.NewCommand("SELECT COUNT(1) FROM BHRD WHERE BHYER=@BHYER");
|
|
cmd.Parameters.Add(Query.NewParameter("BHYER", Year));
|
|
int count;
|
|
ExecuteScalar(cmd, out count);
|
|
if (count == 0)
|
|
{
|
|
cmd.CommandText = "INSERT INTO BHRD (BHYER, BHHRD, TRDAT, TRMOD, TRUSR) VALUES (@BHYER, @BHHRD, GETDATE(), 'INSERT', 'X001')";
|
|
}
|
|
else
|
|
{
|
|
cmd.CommandText = "UPDATE BHRD SET BHHRD=@BHHRD, TRDAT=GETDATE(), TRMOD='MODIFY', TRUSR='X001' WHERE BHYER=@BHYER";
|
|
}
|
|
cmd.Parameters.Add(Query.NewParameter("BHHRD", String.Concat(YearData)));
|
|
Query.ExecuteNonQuery(cmd);
|
|
}
|
|
|
|
public string GetMonth(int Year, int Month)
|
|
{
|
|
string[] YearData = GetYear(Year);
|
|
return YearData[Month - 1];
|
|
}
|
|
|
|
public void SetMonth(int Year, int Month, string Value)
|
|
{
|
|
string[] YearData = GetYear(Year);
|
|
YearData[Month - 1] = Value;
|
|
SetYear(Year, YearData);
|
|
}
|
|
|
|
public HolidayType GetDayHolidayType(DateTime aDateTime)
|
|
{
|
|
string bhhrd = "";
|
|
if (!bhrdData.Contains(aDateTime.Year))
|
|
{
|
|
DbCommand cmd = Query.NewCommand("SELECT BHHRD FROM BHRD WHERE BHYER=@BHYER");
|
|
cmd.Parameters.Add(Query.NewParameter("BHYER", aDateTime.Year));
|
|
if (ExecuteScalar(cmd, out bhhrd))
|
|
bhrdData.Add(aDateTime.Year, bhhrd);
|
|
}
|
|
else
|
|
{
|
|
bhhrd = bhrdData[aDateTime.Year].ToString();
|
|
}
|
|
|
|
if (bhhrd != "")
|
|
{
|
|
// 有節假日資料,找出該日之節假日資料
|
|
char theDay;
|
|
try
|
|
{
|
|
theDay = bhhrd[aDateTime.DayOfYear - 1];
|
|
}
|
|
catch
|
|
{
|
|
theDay = ' ';
|
|
}
|
|
|
|
switch ((HolidayType)theDay)
|
|
{
|
|
case HolidayType.WorkDay: // 上班日
|
|
case HolidayType.CompensatoryWorkDay: // 補班
|
|
case HolidayType.NationalHoliday: // 國定假日或民俗假
|
|
case HolidayType.Holiday: // 例假日
|
|
case HolidayType.ElasticRest: // 彈性休假
|
|
case HolidayType.TyphoonRest: // 颱風假
|
|
case HolidayType.VoteRest: // 選舉假
|
|
case HolidayType.CompanyActivity: // 公司活動
|
|
return (HolidayType)theDay;
|
|
default:
|
|
if (nationalHolidays.Contains(aDateTime.ToString("MMdd")))
|
|
return HolidayType.NationalHoliday;
|
|
else if (aDateTime.DayOfWeek == DayOfWeek.Sunday || aDateTime.DayOfWeek == DayOfWeek.Saturday)
|
|
return HolidayType.Holiday;
|
|
else
|
|
return HolidayType.WorkDay;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// 若無節假日資料,則週六、週日為假日
|
|
if (nationalHolidays.Contains(aDateTime.ToString("MMdd")))
|
|
return HolidayType.NationalHoliday;
|
|
else if (aDateTime.DayOfWeek == DayOfWeek.Sunday || aDateTime.DayOfWeek == DayOfWeek.Saturday)
|
|
return HolidayType.Holiday;
|
|
else
|
|
return HolidayType.WorkDay;
|
|
}
|
|
}
|
|
|
|
public bool IsHoliday(string bpeno, DateTime aDateTime)
|
|
{
|
|
// 先看班表有沒有資料
|
|
RtmeDAC rtmeDao = new RtmeDAC();
|
|
var rtme = rtmeDao.SelectDay(bpeno, aDateTime).FirstOrDefault();
|
|
if (rtme != null && !string.IsNullOrEmpty(rtme.RTTID.Trim()))
|
|
{
|
|
return ItemIsHoliday(rtme.RTTID.Trim());
|
|
}
|
|
|
|
// 若沒有班表資料,用行事曆資料判斷是否需要上班
|
|
HolidayType theDay = GetDayHolidayType(aDateTime);
|
|
|
|
switch (theDay)
|
|
{
|
|
case HolidayType.WorkDay: // 上班日
|
|
case HolidayType.CompensatoryWorkDay: // 補班
|
|
return false;
|
|
case HolidayType.NationalHoliday: // 國定假日或民俗假
|
|
case HolidayType.Holiday: // 例假日
|
|
case HolidayType.ElasticRest: // 彈性休假
|
|
case HolidayType.TyphoonRest: // 颱風假
|
|
case HolidayType.VoteRest: // 選舉假
|
|
case HolidayType.CompanyActivity: // 公司活動
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static bool ItemIsHoliday(string item)
|
|
{
|
|
return 休假日班表.IndexOf(item.Trim()) >= 0;
|
|
}
|
|
}
|
|
|
|
public enum HolidayType
|
|
{
|
|
/// <summary>
|
|
/// 無資料
|
|
/// </summary>
|
|
Null = ' ',
|
|
/// <summary>
|
|
/// 上班日
|
|
/// </summary>
|
|
WorkDay = '-',
|
|
/// <summary>
|
|
/// 補班
|
|
/// </summary>
|
|
CompensatoryWorkDay = 'B',
|
|
/// <summary>
|
|
/// 國定假日或民俗假
|
|
/// </summary>
|
|
NationalHoliday = 'N',
|
|
/// <summary>
|
|
/// 例假日
|
|
/// </summary>
|
|
Holiday = 'H',
|
|
/// <summary>
|
|
/// 彈性休假
|
|
/// </summary>
|
|
ElasticRest = 'V',
|
|
/// <summary>
|
|
/// 颱風假
|
|
/// </summary>
|
|
TyphoonRest = 'T',
|
|
/// <summary>
|
|
/// 選舉假
|
|
/// </summary>
|
|
VoteRest = 'E',
|
|
/// <summary>
|
|
/// 公司活動
|
|
/// </summary>
|
|
CompanyActivity = 'A'
|
|
}
|