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;
///
/// 節假日設定檔
///
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 休假日班表 = new List { 排休, 例假日, 休假日, 國定假日 };
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
{
///
/// 無資料
///
Null = ' ',
///
/// 上班日
///
WorkDay = '-',
///
/// 補班
///
CompensatoryWorkDay = 'B',
///
/// 國定假日或民俗假
///
NationalHoliday = 'N',
///
/// 例假日
///
Holiday = 'H',
///
/// 彈性休假
///
ElasticRest = 'V',
///
/// 颱風假
///
TyphoonRest = 'T',
///
/// 選舉假
///
VoteRest = 'E',
///
/// 公司活動
///
CompanyActivity = 'A'
}