using System; using System.Data; using System.Configuration; using System.Data.Common; using Wellan.Common; using Wellan.Data; using System.Collections.Generic; using System.Linq; using NPOI.SS.Formula.Functions; /// /// 取得資料的方法集合 /// public class GetData { private string selectBPAA = @"SELECT A.BPPYN, A.BPBGT, A.BPCSD, A.BPS01, A.BPS02, A.BPS03, A.BPS04, A.BPS05, A.BPS06, A.BPS07, A.BPS08, A.BPS09, A.BPS10, A.BPS11, A.BPS12, A.BPS13, A.BPS14, A.BPS15, A.BPS16, A.BPS17, A.BPS18, A.BPS19, A.BPS20, A.BPS21, A.BPS22, A.BPS23, A.BPS24, A.BPS25, A.BPS26, A.BPS27, A.BPS28, A.BPS29, A.BPS30, A.BPFED, A.BPMSD, A.BPSAL, A.BPOTT, A.BPOTD, B.BPCPY FROM BPAA A WITH (NOLOCK) LEFT OUTER JOIN BPRJ B ON A.BPPNM=B.BPPNM "; public static string defaultBPOVR = "ROUND(ROUND(ROUND(@本薪/240, 0) + @伙食費/240, 0) * @加班費比例 * @時數, 0)"; public static string defaultBPLVE = "ROUND(ROUND(ROUND(@本薪/240, 0) + @伙食費/240, 0) * @時數, 0)"; public WQuery Query; public GetData() { } public GetData(WQuery AQuery) : this() { Query = AQuery; } /// /// 由年度,取得專案年度接單資料 /// public DataTable GetBPAA_Year(int aYear) { DbCommand cmd = Query.NewCommand(selectBPAA + "WHERE A.BPYER=@BPYER ORDER BY A.BPPYN"); cmd.Parameters.Add(Query.NewParameter("BPYER", aYear)); return Query.Select(cmd); } /// /// 由專案年度編號,取得專案年度接單資料 /// public DataTable GetBPAA_BPPYN(string bppyn) { DbCommand cmd = Query.NewCommand(selectBPAA + "WHERE A.BPPYN=@BPPYN"); cmd.Parameters.Add(Query.NewParameter("BPPYN", bppyn)); return Query.Select(cmd); } /// /// 由專案年度編號,取得補休有效期限 /// public int GetBPAA_BPOTD(string bppyn) { DbCommand cmd = Query.NewCommand(selectBPAA + "WHERE A.BPPYN=@BPPYN"); cmd.Parameters.Add(Query.NewParameter("BPPYN", bppyn)); BPAARecord bpaaRecord = new BPAARecord(); var dt = Query.Select(cmd); if (dt.Rows.Count > 0) { bpaaRecord.FillRecord(dt.Rows[0]); if (bpaaRecord.BPOTD != 0) return bpaaRecord.BPOTD; else return 6; } else { return 6; } } /// /// 由專案年度編號,取得專案加班時數是否計算至分鐘 /// public bool GetOverTimeToMinutes(string bppyn) { DbCommand cmd = Query.NewCommand("SELECT BPOTT FROM BPAA WITH (NOLOCK) WHERE BPPYN=@BPPYN"); cmd.Parameters.Add(Query.NewParameter("BPPYN", bppyn)); return WDAC.GetStringValue(Query.ExecuteScalar(cmd)) == "2"; } /// /// 由年月、專案年度代號,取得派遣出去的人員 (要改) /// public DataTable GetRASN_YYMM_BPPYN(DateTime yymm, string rapyn, DbTransaction tran) { return GetRASN_DATE_BPPYN(yymm, yymm.AddMonths(1).AddDays(-1), rapyn, tran); } /// /// 由日期區間、專案年度代號,取得派遣出去的人員 /// public DataTable GetRASN_DATE_BPPYN(DateTime date1, DateTime date2, string rapyn, DbTransaction tran) { DbCommand cmd = Query.NewCommand( @"SELECT A.RANUM, A.RAITM, A.RACNM, A.RAPYN, A.RASDT, A.RAEDT, A.RAJNO, A.RACNO, A.RABRH, B.BPSRM, B.BPSRD, B.BPP01, B.BPP02, B.BPP03, B.BPP04, B.BPP05, D.BPBFT, D.BPAFT, D.BPHOL, E.BFFRM AS BPOVR, F.BFFRM AS BPLVE, G.BPNME, G.BPEDY FROM RASN A WITH (NOLOCK) INNER JOIN BPJB B ON A.RAPYN=B.BPPYN AND A.RAJNO=B.BPJNO AND A.RACNO=B.BPCNO INNER JOIN BPAA C ON A.RAPYN=C.BPPYN INNER JOIN BPRJ D ON C.BPPNM=D.BPPNM INNER JOIN BFRM E ON D.BPOVR=E.BFNUM INNER JOIN BFRM F ON D.BPLVE=F.BFNUM INNER JOIN BPSNView G ON A.RANUM=G.BPENO WHERE A.RAPYN = @RAPYN AND ((A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM2) OR (A.RASDT <= @YYMM1 AND A.RAEDT IS NULL) OR (A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2) OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM2) OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT IS NULL) OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2)) ORDER BY A.RANUM, A.RAITM"); cmd.Parameters.Add(Query.NewParameter("RAPYN", rapyn)); cmd.Parameters.Add(Query.NewParameter("YYMM1", date1)); cmd.Parameters.Add(Query.NewParameter("YYMM2", date2)); if (tran != null) { cmd.Connection = tran.Connection; cmd.Transaction = tran; DbDataAdapter da = Query.NewDataAdapter(cmd); DataTable result = new DataTable(); da.Fill(result); return result; } else { return Query.Select(cmd); } } /// /// 由日期區間、專案年度代號,取得派遣出去的人員 /// public List GetRASN_DATE_BPPYN(DateTime date1, DateTime date2, string rapyn) { DbCommand cmd = Query.NewCommand( @"SELECT DISTINCT A.RANUM BPENO, G.BPNME, A.RABRH BPBRH FROM RASN A WITH (NOLOCK) INNER JOIN BPSNView G ON A.RANUM=G.BPENO WHERE A.RAPYN = @RAPYN AND ((A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM2) OR (A.RASDT <= @YYMM1 AND A.RAEDT IS NULL) OR (A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2) OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM2) OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT IS NULL) OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2)) ORDER BY A.RANUM"); cmd.Parameters.Add(Query.NewParameter("RAPYN", rapyn)); cmd.Parameters.Add(Query.NewParameter("YYMM1", date1)); cmd.Parameters.Add(Query.NewParameter("YYMM2", date2)); return Query.Select(cmd); } /// /// 取得人員在某日期派駐的專案 /// public string GetRAPYN_DATE_BPENO(DateTime date, string bpeno) { DbCommand cmd = Query.NewCommand( @"SELECT RAPYN FROM RASN A WITH (NOLOCK) WHERE A.RANUM = @RANUM AND ((A.RASDT <= @DATE AND A.RAEDT >= @DATE) OR (A.RASDT <= @DATE AND A.RAEDT IS NULL))"); cmd.Parameters.Add(Query.NewParameter("RANUM", bpeno)); cmd.Parameters.Add(Query.NewParameter("DATE", date)); return WQuery.GetStringValue(Query.ExecuteScalar(cmd)); } /// /// 取得員工在請假日期所在專案的補休期限設定 /// public int GetBPOTD_DATE_BPENO(DateTime date, string bpeno) { var pyn = GetRAPYN_DATE_BPENO(date, bpeno); return GetBPAA_BPOTD(pyn); } /// /// 由年度專案代號,取得前二、後二、假日加班比例 (要改) /// public void GetRASN_Overwork_Rate(string bppyn, out double bpbft, out double bpaft, out double bphol, out string bpovr, out string bplve) { DbCommand cmd = Query.NewCommand( @"SELECT B.BPBFT, B.BPAFT, B.BPHOL, C.BFFRM AS BPOVR, D.BFFRM AS BPLVE FROM BPAA A WITH (NOLOCK) INNER JOIN BPRJ B ON A.BPPNM=B.BPPNM INNER JOIN BFRM C ON B.BPOVR=C.BFNUM INNER JOIN BFRM D ON B.BPLVE=D.BFNUM WHERE A.BPPYN = @BPPYN"); cmd.Parameters.Add(Query.NewParameter("BPPYN", bppyn)); DataTable data = Query.Select(cmd); if (data.Rows.Count == 0) { bpbft = 0d; bpaft = 0d; bphol = 0d; bpovr = defaultBPOVR; bplve = defaultBPLVE; } else { bpbft = data.Rows[0]["BPBFT"] != DBNull.Value ? Convert.ToDouble(data.Rows[0]["BPBFT"]) : 0d; bpaft = data.Rows[0]["BPAFT"] != DBNull.Value ? Convert.ToDouble(data.Rows[0]["BPAFT"]) : 0d; bphol = data.Rows[0]["BPHOL"] != DBNull.Value ? Convert.ToDouble(data.Rows[0]["BPHOL"]) : 0d; bpovr = data.Rows[0]["BPOVR"] != DBNull.Value ? data.Rows[0]["BPOVR"].ToString() : defaultBPOVR; bplve = data.Rows[0]["BPLVE"] != DBNull.Value ? data.Rows[0]["BPLVE"].ToString() : defaultBPLVE; } } /// /// 由年月取得本月曾經在職的人員 /// public DataTable GetBPSNInMonth(DateTime yymm, DbTransaction tran) { DateTime yymm2 = yymm.AddMonths(1).AddDays(-1); // 月底日 DbCommand cmdBpsn = Query.NewCommand( @"SELECT BPENO, BPSDY, BPEDY FROM BPSNView WITH (NOLOCK) WHERE ((BPSDY <= @YYMM1 AND BPEDY >= @YYMM2) OR (BPSDY <= @YYMM1 AND BPEDY IS NULL) OR (BPSDY <= @YYMM1 AND BPEDY >= @YYMM1 AND BPEDY <= @YYMM2) OR (BPSDY >= @YYMM1 AND BPSDY <= @YYMM2 AND BPEDY >= @YYMM2) OR (BPSDY >= @YYMM1 AND BPSDY <= @YYMM2 AND BPEDY IS NULL) OR (BPSDY >= @YYMM1 AND BPSDY <= @YYMM2 AND BPEDY >= @YYMM1 AND BPEDY <= @YYMM2))"); cmdBpsn.Parameters.Add(Query.NewParameter("YYMM1", yymm)); cmdBpsn.Parameters.Add(Query.NewParameter("YYMM2", yymm2)); cmdBpsn.Connection = tran.Connection; cmdBpsn.Transaction = tran; DbDataAdapter da = Query.NewDataAdapter(cmdBpsn); DataTable result = new DataTable(); da.Fill(result); return result; } ///// ///// 取得上月初至本月底不在專案中的人員 (要改) ///// //public DataTable GetBPSNInMonthButNotInProject() //{ // DateTime yymm1 = DateTime.UtcNow.AddHours(8).AddDays(-(DateTime.UtcNow.AddHours(8).Day - 1)).AddMonths(-1); // 上個月月初日 // DateTime yymm2 = DateTime.UtcNow.AddHours(8).AddDays(-(DateTime.UtcNow.AddHours(8).Day - 1)).AddMonths(1).AddDays(-1); // 本月月底日 // DbCommand cmdBpsn = Query.NewCommand( // @"SELECT BPENO, BPENO + ' ' + BPNME BPNME // FROM BPSN WITH (NOLOCK) // WHERE ( (BPSDY <= @YYMM1 AND BPEDY >= @YYMM2) // OR (BPSDY <= @YYMM1 AND BPEDY IS NULL) // OR (BPSDY <= @YYMM1 AND BPEDY >= @YYMM1 AND BPEDY <= @YYMM2) // OR (BPSDY >= @YYMM1 AND BPSDY <= @YYMM2 AND BPEDY >= @YYMM2) // OR (BPSDY >= @YYMM1 AND BPSDY <= @YYMM2 AND BPEDY IS NULL) // OR (BPSDY >= @YYMM1 AND BPSDY <= @YYMM2 AND BPEDY >= @YYMM1 AND BPEDY <= @YYMM2)) // AND BPENO NOT IN // (SELECT RANUM FROM RASN // WHERE ( (RASDT <= @YYMM1 AND RAEDT >= @YYMM2) // OR (RASDT <= @YYMM1 AND RAEDT IS NULL) // OR (RASDT <= @YYMM1 AND RAEDT >= @YYMM1 AND RAEDT <= @YYMM2) // OR (RASDT >= @YYMM1 AND RASDT <= @YYMM2 AND RAEDT >= @YYMM2) // OR (RASDT >= @YYMM1 AND RASDT <= @YYMM2 AND RAEDT IS NULL) // OR (RASDT >= @YYMM1 AND RASDT <= @YYMM2 AND RAEDT >= @YYMM1 AND RAEDT <= @YYMM2)))"); // cmdBpsn.Parameters.Add(Query.NewParameter("YYMM1", yymm1)); // cmdBpsn.Parameters.Add(Query.NewParameter("YYMM2", yymm2)); // DataTable result = Query.Select(cmdBpsn); // return result; //} /// /// 由年月、人員編號,取得未派遣出去的日期區間資料、基本薪資資料,以及薪資異動資料 (要改) /// public DataTable GetBPSNNoCase(DateTime yymm, string bpeno, DbTransaction tran) { DateTime yymm2 = yymm.AddMonths(1).AddDays(-1); // 月底日 // 準備輸出架構 DataTable aTable = new DataTable(); aTable.Columns.Add("BPENO", typeof(System.String)); aTable.Columns.Add("STA_DATE", typeof(System.DateTime)); aTable.Columns.Add("END_DATE", typeof(System.DateTime)); aTable.Columns.Add("BPSRM", typeof(System.Int32)); aTable.Columns.Add("BPSRD", typeof(System.Int32)); aTable.Columns.Add("BPP01", typeof(System.Int32)); aTable.Columns.Add("BPP02", typeof(System.Int32)); aTable.Columns.Add("BPP03", typeof(System.Int32)); aTable.Columns.Add("BPP04", typeof(System.Int32)); aTable.Columns.Add("BPP05", typeof(System.Int32)); // 取得人員到職日與離職日 DbCommand cmdBpsn = Query.NewCommand( @"SELECT BPSDY, BPEDY FROM BPSNView WITH (NOLOCK) WHERE BPENO=@BPENO"); cmdBpsn.Parameters.Add(Query.NewParameter("BPENO", bpeno)); cmdBpsn.Connection = tran.Connection; cmdBpsn.Transaction = tran; DbDataAdapter da = Query.NewDataAdapter(cmdBpsn); DataTable bpsn = new DataTable(); da.Fill(bpsn); if (bpsn.Rows.Count == 0) return null; DateTime bpsdy = bpsn.Rows[0]["BPSDY"] != DBNull.Value ? Convert.ToDateTime(bpsn.Rows[0]["BPSDY"]) : yymm; int bpsdyDay = bpsdy < yymm ? 0 : bpsdy.Day - 1; DateTime bpedy = bpsn.Rows[0]["BPEDY"] != DBNull.Value ? Convert.ToDateTime(bpsn.Rows[0]["BPEDY"]) : yymm.AddMonths(1); int bpedyDay = bpedy > yymm2 ? yymm.AddMonths(1).AddDays(-1).Day - 1 : bpedy.Day - 1; // 由年月 + 人員,取得派遣紀錄 DbCommand cmdRasn = Query.NewCommand( @"SELECT A.RASDT, A.RAEDT FROM RASN A WITH (NOLOCK) WHERE RANUM=@BPENO AND ((A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM2) OR (A.RASDT <= @YYMM1 AND A.RAEDT IS NULL) OR (A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2) OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM2) OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT IS NULL) OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2))"); cmdRasn.Parameters.Add(Query.NewParameter("BPENO", bpeno)); cmdRasn.Parameters.Add(Query.NewParameter("YYMM1", yymm)); cmdRasn.Parameters.Add(Query.NewParameter("YYMM2", yymm2)); cmdRasn.Connection = tran.Connection; cmdRasn.Transaction = tran; da.SelectCommand = cmdRasn; DataTable rasn = new DataTable(); da.Fill(rasn); // 準備一個陣列,代表本月每一天 char[] days = new char[31]; // 填入 - 初始化 for (int i = 0; i < days.Length; i++) days[i] = '-'; // 填入 0 代表到職未派遣 for (int i = bpsdyDay; i <= bpedyDay; i++) days[i] = '0'; // 依照派遣紀錄將陣列填入 1,代表有派遣 foreach (DataRow rasnRow in rasn.Rows) { // 開始日 DateTime startDate = rasnRow["RASDT"] != DBNull.Value ? Convert.ToDateTime(rasnRow["RASDT"]) : yymm; if (startDate < yymm) startDate = yymm; // 結束日 DateTime endDate = rasnRow["RAEDT"] != DBNull.Value ? Convert.ToDateTime(rasnRow["RAEDT"]) : yymm2; if (endDate > yymm2) endDate = yymm2; for (int i = startDate.Day - 1; i < endDate.Day; i++) days[i] = '1'; } // 依照陣列產生輸出資料 int startDay = 0; int endDay = 0; char currState = '-'; BpslDAC bpsl = new BpslDAC(Query); for (int i = 0; i < days.Length; i++) { if (days[i] == '0') { if (currState == '1' || currState == '-') startDay = i; currState = '0'; endDay = i; } // 當遇到派遣日、非本月、月底日時,寫出紀錄 if (currState == '0' && (days[i] == '1' || days[i] == '-' || i == days.Length - 1)) { DateTime sDate = yymm.AddDays(startDay); DateTime eDate = yymm.AddDays(endDay); // 取得此區間內之薪資基本資料以及薪資異動資料 DataTable bpslData = bpsl.SelectBPSLDateRange(bpeno, sDate, eDate, tran); for (int j = 0; j < bpslData.Rows.Count; j++) { DataRow newRow = aTable.NewRow(); newRow["BPENO"] = bpeno; newRow["STA_DATE"] = sDate; if (bpslData.Rows.Count > 1 && j != bpslData.Rows.Count - 1) { sDate = Convert.ToDateTime(bpslData.Rows[j + 1]["BPBDT"]); newRow["END_DATE"] = sDate.AddDays(-1); } if (bpslData.Rows.Count == 1 || j == bpslData.Rows.Count - 1) { newRow["END_DATE"] = eDate; } newRow["BPSRM"] = bpslData.Rows[j]["BPSRM"]; newRow["BPSRD"] = bpslData.Rows[j]["BPSRD"]; newRow["BPP01"] = bpslData.Rows[j]["BPP01"]; newRow["BPP02"] = bpslData.Rows[j]["BPP02"]; newRow["BPP03"] = bpslData.Rows[j]["BPP03"]; newRow["BPP04"] = bpslData.Rows[j]["BPP04"]; newRow["BPP05"] = bpslData.Rows[j]["BPP05"]; aTable.Rows.Add(newRow); } currState = '1'; } } return aTable; } /// /// 由日期 + 人員 + 專案年度編號,取得月薪、伙食津貼、前二加班、後二加班、假日加班比例 (要改) /// /// 日期 /// 專案年度編號 /// 人員編號 /// 月薪 /// 伙食津貼 /// 前二加班比例 /// 後二加班比例 /// 假日加班比例 /// 加班費公式 /// 請假扣款公式 /// 加班費計算方式 1=計算至小時 2=計算至分鐘 public void GetRASN_Date_Bppyn_Bpeno_Overwork_Rate(DateTime aDate, string bppyn, string bpeno, out int bpsrm, out int bpp02, out double bpbft, out double bpaft, out double bphol, out string bpovr, out string bplve, out string bpott) { #region 專案人員 if (bppyn != "000000001") { DbCommand cmd = Query.NewCommand( @"SELECT B.BPSRM, B.BPP02, D.BPBFT, D.BPAFT, D.BPHOL, E.BFFRM AS BPOVR, F.BFFRM AS BPLVE, C.BPOTT AS BPOTT FROM RASN A WITH (NOLOCK) INNER JOIN BPJB B ON A.RAPYN=B.BPPYN AND A.RAJNO=B.BPJNO AND A.RACNO=B.BPCNO INNER JOIN BPAA C ON A.RAPYN=C.BPPYN INNER JOIN BPRJ D ON C.BPPNM=D.BPPNM INNER JOIN BFRM E ON D.BPOVR=E.BFNUM INNER JOIN BFRM F ON D.BPLVE=F.BFNUM WHERE A.RANUM=@RANUM AND A.RAPYN=@RAPYN AND ( (A.RASDT <= @DATE AND A.RAEDT IS NULL) OR (A.RASDT <= @DATE AND A.RAEDT >= @DATE) )"); cmd.Parameters.Add(Query.NewParameter("RANUM", bpeno)); cmd.Parameters.Add(Query.NewParameter("RAPYN", bppyn)); cmd.Parameters.Add(Query.NewParameter("DATE", aDate)); // cmd.Parameters.Add(Query.NewParameter("YYMM2", aDate.AddDays(-aDate.Day + 1).AddMonths(1).AddDays(-1))); DataTable data = Query.Select(cmd); if (data.Rows.Count == 0) { bpsrm = 0; bpp02 = 0; bpbft = 0d; bpaft = 0d; bphol = 0d; bpovr = defaultBPOVR; bplve = defaultBPLVE; bpott = "1"; } else { bpsrm = data.Rows[0]["BPSRM"] != DBNull.Value ? Convert.ToInt32(data.Rows[0]["BPSRM"]) : 0; bpp02 = data.Rows[0]["BPP02"] != DBNull.Value ? Convert.ToInt32(data.Rows[0]["BPP02"]) : 0; bpbft = data.Rows[0]["BPBFT"] != DBNull.Value ? Convert.ToDouble(data.Rows[0]["BPBFT"]) : 0d; bpaft = data.Rows[0]["BPAFT"] != DBNull.Value ? Convert.ToDouble(data.Rows[0]["BPAFT"]) : 0d; bphol = data.Rows[0]["BPHOL"] != DBNull.Value ? Convert.ToDouble(data.Rows[0]["BPHOL"]) : 0d; bpovr = data.Rows[0]["BPOVR"] != DBNull.Value ? WDAC.GetStringValue(data.Rows[0]["BPOVR"]).Trim() : defaultBPOVR; bplve = data.Rows[0]["BPLVE"] != DBNull.Value ? WDAC.GetStringValue(data.Rows[0]["BPLVE"]).Trim() : defaultBPLVE; bpott = data.Rows[0]["BPOTT"] != DBNull.Value ? WDAC.GetStringValue(data.Rows[0]["BPOTT"]).Trim() : "1"; } } #endregion #region 非專案人員 else { // 取得非專案人員的月薪、伙食津貼資料以及薪資異動資料的月薪、伙食津貼 DbCommand cmd = Query.NewCommand( @"SELECT * FROM ( SELECT BPENO, 0 AS BPITM, '1900/01/01' AS BPBDT, BPSRM, BPP02 FROM BPSL WITH (NOLOCK) WHERE BPENO=@BPENO UNION SELECT RPENO AS BPENO, RPITM AS BPITM, RPBDT AS BPBDT, RPSRM AS BPSRM, RPP02 AS BPP02 FROM RPSL WITH (NOLOCK) WHERE RPENO=@BPENO ) BPSL_TMP ORDER BY BPITM"); cmd.Parameters.Add(Query.NewParameter("BPENO", bpeno)); DataTable data = Query.Select(cmd); bpovr = defaultBPOVR; bplve = defaultBPLVE; bpbft = GetFeeRate("非專案人員前二加班", aDate, null); bpaft = GetFeeRate("非專案人員後二加班", aDate, null); bphol = GetFeeRate("非專案人員假日加班", aDate, null); bpsrm = 0; bpp02 = 0; bpott = "1"; if (data.Rows.Count == 0) { return; } else { // 依照日期,推算應該適用的月薪與伙食津貼 for (int i = 0; i < data.Rows.Count; i++) { DateTime bpbdt = data.Rows[i]["BPBDT"] != DBNull.Value ? Convert.ToDateTime(data.Rows[i]["BPBDT"]) : new DateTime(1900, 1, 1); if (aDate.CompareTo(bpbdt) >= 0) { bpsrm = data.Rows[i]["BPSRM"] != DBNull.Value ? Convert.ToInt32(data.Rows[i]["BPSRM"]) : 0; bpp02 = data.Rows[i]["BPP02"] != DBNull.Value ? Convert.ToInt32(data.Rows[i]["BPP02"]) : 0; } } } } #endregion } /// /// 由日期區間 + 人員 + 專案年度編號,取得月薪、伙食津貼、前二加班、後二加班、假日加班比例 (要改) /// /// 起始日期 /// 結束日期 /// 專案年度編號 /// 人員編號 /// 月薪 /// 伙食津貼 /// 前二加班比例 /// 後二加班比例 /// 假日加班比例 /// 加班費公式 /// 請假扣款公式 /// 加班時數計算方式 public void GetRASN_DateRange_Bppyn_Bpeno_Overwork_Rate(DateTime aDate1, DateTime aDate2, string bppyn, string bpeno, out int bpsrm, out int bpp02, out double bpbft, out double bpaft, out double bphol, out string bpovr, out string bplve, out string bpott) { // 專案人員 if (bppyn != "000000001") { DbCommand cmd = Query.NewCommand( @"SELECT B.BPSRM, B.BPP02, D.BPBFT, D.BPAFT, D.BPHOL, E.BFFRM AS BPOVR, F.BFFRM AS BPLVE, C.BPOTT as BPOTT FROM RASN A WITH (NOLOCK) INNER JOIN BPJB B ON A.RAPYN=B.BPPYN AND A.RAJNO=B.BPJNO AND A.RACNO=B.BPCNO INNER JOIN BPAA C ON A.RAPYN=C.BPPYN INNER JOIN BPRJ D ON C.BPPNM=D.BPPNM INNER JOIN BFRM E ON D.BPOVR=E.BFNUM INNER JOIN BFRM F ON D.BPLVE=F.BFNUM WHERE A.RANUM=@RANUM AND A.RAPYN=@RAPYN AND ((A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM2) OR (A.RASDT <= @YYMM1 AND A.RAEDT IS NULL) OR (A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2) OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM2) OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT IS NULL) OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2)) "); cmd.Parameters.Add(Query.NewParameter("RANUM", bpeno)); cmd.Parameters.Add(Query.NewParameter("RAPYN", bppyn)); cmd.Parameters.Add(Query.NewParameter("YYMM1", aDate1)); cmd.Parameters.Add(Query.NewParameter("YYMM2", aDate2)); // cmd.Parameters.Add(Query.NewParameter("YYMM2", aDate.AddDays(-aDate.Day + 1).AddMonths(1).AddDays(-1))); DataTable data = Query.Select(cmd); if (data.Rows.Count == 0) { bpsrm = 0; bpp02 = 0; bpbft = 0d; bpaft = 0d; bphol = 0d; bpovr = defaultBPOVR; bplve = defaultBPLVE; bpott = "1"; } else { bpsrm = data.Rows[0]["BPSRM"] != DBNull.Value ? Convert.ToInt32(data.Rows[0]["BPSRM"]) : 0; bpp02 = data.Rows[0]["BPP02"] != DBNull.Value ? Convert.ToInt32(data.Rows[0]["BPP02"]) : 0; bpbft = data.Rows[0]["BPBFT"] != DBNull.Value ? Convert.ToDouble(data.Rows[0]["BPBFT"]) : 0d; bpaft = data.Rows[0]["BPAFT"] != DBNull.Value ? Convert.ToDouble(data.Rows[0]["BPAFT"]) : 0d; bphol = data.Rows[0]["BPHOL"] != DBNull.Value ? Convert.ToDouble(data.Rows[0]["BPHOL"]) : 0d; bpovr = data.Rows[0]["BPOVR"] != DBNull.Value ? data.Rows[0]["BPOVR"].ToString().Trim() : defaultBPOVR; bplve = data.Rows[0]["BPLVE"] != DBNull.Value ? data.Rows[0]["BPLVE"].ToString().Trim() : defaultBPLVE; bpott = data.Rows[0]["BPOTT"] != DBNull.Value ? data.Rows[0]["BPOTT"].ToString().Trim() : "1"; } } // 非專案人員 else { // 取得非專案人員的月薪、伙食津貼資料以及薪資異動資料的月薪、伙食津貼 DbCommand cmd = Query.NewCommand( @"SELECT * FROM ( SELECT BPENO, 0 AS BPITM, '1900/01/01' AS BPBDT, BPSRM, BPP02 FROM BPSL WHERE BPENO=@BPENO UNION SELECT RPENO AS BPENO, RPITM AS BPITM, RPBDT AS BPBDT, RPSRM AS BPSRM, RPP02 AS BPP02 FROM RPSL WHERE RPENO=@BPENO ) BPSL_TMP ORDER BY BPITM"); cmd.Parameters.Add(Query.NewParameter("BPENO", bpeno)); DataTable data = Query.Select(cmd); bpovr = defaultBPOVR; bplve = defaultBPLVE; bpbft = GetFeeRate("非專案人員前二加班", aDate1, null); bpaft = GetFeeRate("非專案人員後二加班", aDate1, null); bphol = GetFeeRate("非專案人員假日加班", aDate1, null); bpsrm = 0; bpp02 = 0; bpott = "1"; if (data.Rows.Count == 0) { return; } else { // 依照日期,推算應該適用的月薪與伙食津貼 for (int i = 0; i < data.Rows.Count; i++) { DateTime bpbdt = data.Rows[i]["BPBDT"] != DBNull.Value ? Convert.ToDateTime(data.Rows[i]["BPBDT"]) : new DateTime(1900, 1, 1); if (aDate1.CompareTo(bpbdt) >= 0) { bpsrm = data.Rows[i]["BPSRM"] != DBNull.Value ? Convert.ToInt32(data.Rows[i]["BPSRM"]) : 0; bpp02 = data.Rows[i]["BPP02"] != DBNull.Value ? Convert.ToInt32(data.Rows[i]["BPP02"]) : 0; } } } } } /// /// 取得人員請假、加班、費用紀錄 /// /// 年月 /// 專案年度編號 /// 資料起始日 /// 資料結束日 /// 派遣起日 /// 派遣訖日 /// 員工編號 /// 費用類型 /// 結算日 /// 交易 /// public DataTable GetRPAR(DateTime yymm, string rppyn, DateTime startDay, DateTime endDay, DateTime rasdt, DateTime raedt, string rpeno, string rptyp, int bpfed, DbTransaction tran) { DateTime startDay1, endDay1; // 上個月月底超過結算日,起始日為上個月的結算日 + 1 if (yymm.AddDays(-1).Day > bpfed) startDay1 = yymm.AddMonths(-1).AddDays(bpfed); // 否則起始日為這個月的月初 else startDay1 = yymm; // 本月月底超過結算日,結束日為本月結算日 if (yymm.AddMonths(1).AddDays(-1).Day > bpfed) endDay1 = yymm.AddDays(bpfed - 1); // 否則結束日為本月的月底日 else endDay1 = yymm.AddMonths(1).AddDays(-1); // rptyp == "2" 是電話費以及油料費 // 此二項費用輸入時只輸入年月,所以資料都建立於該年月的 1 日 // 如果依照起始日及結束日來修正資料抓取的日期區間,並且起始日不是 1 日時 // 就會抓不到資料 if (rptyp != "2") { // 起始日不為月初,以起始日為準 if (startDay.Year == yymm.Year && startDay.Month == yymm.Month && startDay.Day != 1) startDay1 = startDay; // 結束日不為月底,以結束日為準 if (endDay.Year == yymm.Year && endDay.Month == yymm.Month && endDay.Day != WGuard1.GetMonthEnd(yymm, 0).Day) endDay1 = endDay; } if (rasdt.Ticks == 0) rasdt = new DateTime(1900, 1, 1); if (raedt.Ticks == 0) raedt = new DateTime(2999, 1, 1); // 取出不用簽核或是已經簽核過的 RPAR 紀錄 // 2020/09/30 差旅費改抓差旅費明細,避免跨月的差旅費重複計算 // 2024/02/03 不再使用 RPPYN 條件,改用用派遣起訖日範圍 DbCommand cmd = Query.NewCommand( @"SELECT RPPYN, RPREN, RPNUM, RPRDT, RPEDT, RPTYP, RPTCT, (CASE WHEN RPTYP LIKE '3%' THEN (SELECT SUM(RPSUM) FROM RPAD WHERE RPAD.RPREN=RPAR.RPREN AND RPDAT >= @YYMM1 AND RPDAT <= @YYMM2) ELSE RPFTR END) AS RPFTR, RPDOC, RPTC1, RPTC2, RPTC3, RPTC4, RPTC5, RPRTM, RPETM, RPRSN, RPPLC FROM RPAR WHERE RPNUM=@RPNUM AND ( (RPRDT >= @RASDT AND RPRDT <= @RAEDT) OR (RPEDT >= @RASDT AND RPEDT <= @RAEDT) OR (RPRDT <= @RASDT AND RPEDT >= @RAEDT) ) AND ( (RPRDT >= @YYMM1 AND RPRDT <= @YYMM2) OR (RPEDT >= @YYMM1 AND RPEDT <= @YYMM2) OR (RPRDT <= @YYMM1 AND RPEDT >= @YYMM2) ) AND RPTYP LIKE '" + rptyp + @"%' AND ((RPAPN IS NULL) OR (RPAPN<>'D' AND RPAPN=RPANO AND RPAPP='Y')) ORDER BY RPREN"); cmd.Parameters.Add(Query.NewParameter("RASDT", rasdt)); cmd.Parameters.Add(Query.NewParameter("RAEDT", raedt)); cmd.Parameters.Add(Query.NewParameter("RPNUM", rpeno)); cmd.Parameters.Add(Query.NewParameter("YYMM1", startDay1)); cmd.Parameters.Add(Query.NewParameter("YYMM2", endDay1)); cmd.Connection = tran.Connection; cmd.Transaction = tran; DbDataAdapter da = Query.NewDataAdapter(cmd); DataTable result = new DataTable(); da.Fill(result); // 修正不正確的 RPPYN,讓報表取資料能正確 foreach (DataRow row in result.Rows) { var row_rppyn = WDAC.GetStringValue(row["RPPYN"]).Trim(); var row_rpren = WDAC.GetStringValue(row["RPREN"]).Trim(); if (row_rppyn != rppyn) { row.BeginEdit(); row["RPPYN"] = rppyn; row.EndEdit(); row.AcceptChanges(); DbCommand cmd2 = Query.NewCommand("UPDATE RPAR SET RPPYN=@RPPYN WHERE RPREN=@RPREN"); cmd2.Parameters.Add(Query.NewParameter("RPPYN", rppyn)); cmd2.Parameters.Add(Query.NewParameter("RPREN", row_rpren)); cmd2.Connection = tran.Connection; cmd2.Transaction = tran; cmd2.ExecuteNonQuery(); } } return result; } /// /// 取得請假紀錄 /// 上月 bpfed + 1 日至本月 bpdef 日 /// public DataTable GetRPAR0X(DateTime yymm, string rppyn, DateTime startDay, DateTime endDay, DateTime rasdt, DateTime raedt, string rpeno, int bpfed, DbTransaction tran) { return GetRPAR(yymm, rppyn, startDay, endDay, rasdt, raedt, rpeno, RPAR_TYPE.T0_請假, bpfed, tran); } /// /// 取得加班與補休紀錄 /// 上月 bpfed + 1 日至本月 bpdef 日 /// public DataTable GetRPAR1X(DateTime yymm, string rppyn, DateTime startDay, DateTime endDay, DateTime rasdt, DateTime raedt, string rpeno, int bpfed, DbTransaction tran) { return GetRPAR(yymm, rppyn, startDay, endDay, rasdt, raedt, rpeno, RPAR_TYPE.T1_加班, bpfed, tran); } /// /// 以日期取得人員加班紀錄 /// /// 日期 /// 計畫年度代號 /// 員工編號 /// 交易 /// public DataTable GetRPAR1XByDate(DateTime date, string rppyn, string rpeno, DbTransaction tran) { DbCommand cmd = Query.NewCommand( @"SELECT RPPYN, RPREN, RPNUM, RPRDT, RPEDT, RPTYP, RPTCTm RPFTR, RPDOC, RPTC1, RPTC2, RPTC3, RPTC4, RPTC5, RPRTM, RPETM, RPRSN, RPPLC FROM RPAR WHERE RPPYN=@RPPYN AND RPNUM=@RPNUM AND RPRDT = @DATE AND RPTYP LIKE '1%' AND ((RPAPN IS NULL) OR (RPAPN<>'D' AND RPAPN=RPANO AND RPAPP='Y')) ORDER BY RPREN"); cmd.Parameters.Add(Query.NewParameter("RPPYN", rppyn)); cmd.Parameters.Add(Query.NewParameter("RPNUM", rpeno)); cmd.Parameters.Add(Query.NewParameter("DATE", date)); cmd.Connection = tran.Connection; cmd.Transaction = tran; DbDataAdapter da = Query.NewDataAdapter(cmd); DataTable result = new DataTable(); da.Fill(result); return result; } /// /// 取得當日人員請假紀錄 /// /// 年月 /// 資料起始日 /// 資料結束日 /// 計畫年度代號 /// 員工編號 /// 費用類型 /// 結算日 /// 交易 /// public DataTable GetRPAR0XByDate(DateTime date, string rppyn, string rpeno, DbTransaction tran) { // 取出不用簽核或是已經簽核過的 RPAR 紀錄 // 2020/9/30 差旅費改抓差旅費明細,避免跨月的差旅費重複計算 DbCommand cmd = Query.NewCommand( @"SELECT RPPYN, RPREN, RPNUM, RPRDT, RPEDT, RPTYP, RPTCT, RPFTR, RPDOC, RPTC1, RPTC2, RPTC3, RPTC4, RPTC5, RPRTM, RPETM, RPRSN, RPPLC FROM RPAR WHERE RPPYN=@RPPYN AND RPNUM=@RPNUM AND ( (RPRDT >= @YYMM1 AND RPRDT <= @YYMM2) OR (RPEDT >= @YYMM1 AND RPEDT <= @YYMM2) OR (RPRDT <= @YYMM1 AND RPEDT >= @YYMM2) ) AND RPTYP LIKE '0%' AND ((RPAPN IS NULL) OR (RPAPN<>'D' AND RPAPN=RPANO AND RPAPP='Y')) ORDER BY RPREN"); cmd.Parameters.Add(Query.NewParameter("RPPYN", rppyn)); cmd.Parameters.Add(Query.NewParameter("RPNUM", rpeno)); cmd.Parameters.Add(Query.NewParameter("YYMM1", date)); cmd.Parameters.Add(Query.NewParameter("YYMM2", date)); cmd.Connection = tran.Connection; cmd.Transaction = tran; DbDataAdapter da = Query.NewDataAdapter(cmd); DataTable result = new DataTable(); da.Fill(result); return result; } /// /// 取得電話費與油料費 /// 上月 bpfed + 1 日至本月 bpdef 日 /// public DataTable GetRPAR2X(DateTime yymm, string rppyn, DateTime startDay, DateTime endDay, DateTime rasdt, DateTime raedt, string rpeno, int bpfed, DbTransaction tran) { return GetRPAR(yymm, rppyn, startDay, endDay, rasdt, raedt, rpeno, RPAR_TYPE.T2_電話油料, bpfed, tran); } /// /// 取得差勤紀錄 /// 上月 bpfed + 1 日至本月 bpdef 日 /// public DataTable GetRPAR3X(DateTime yymm, string rppyn, DateTime startDay, DateTime endDay, DateTime rasdt, DateTime raedt, string rpeno, int bpfed, DbTransaction tran) { return GetRPAR(yymm, rppyn, startDay, endDay, rasdt, raedt, rpeno, RPAR_TYPE.T3_出差, bpfed, tran); } /// /// 取得某期間、某人員勞健保加退保紀錄 /// public DataTable GetRPIR(DateTime startDay, DateTime endDay, string rpeno, DbTransaction tran, bool isLabor) { // 1. 取出區間內加退保主檔,依加保日排序 DbCommand cmd = Query.NewCommand( @"SELECT RPREN, RPSDT FROM RPIR WHERE RPENO=@RPENO AND ((RPSDT <= @YYMM1 AND RPEDT >= @YYMM2) OR (RPSDT <= @YYMM1 AND RPEDT IS NULL) OR (RPSDT <= @YYMM1 AND RPEDT >= @YYMM1 AND RPEDT <= @YYMM2) OR (RPSDT >= @YYMM1 AND RPSDT <= @YYMM2 AND RPEDT >= @YYMM2) OR (RPSDT >= @YYMM1 AND RPSDT <= @YYMM2 AND RPEDT IS NULL) OR (RPSDT >= @YYMM1 AND RPSDT <= @YYMM2 AND RPEDT >= @YYMM1 AND RPEDT <= @YYMM2)) ORDER BY RPSDT"); cmd.Parameters.Add(Query.NewParameter("RPENO", rpeno)); cmd.Parameters.Add(Query.NewParameter("YYMM1", startDay)); cmd.Parameters.Add(Query.NewParameter("YYMM2", endDay)); cmd.Connection = tran.Connection; cmd.Transaction = tran; DbDataAdapter da = Query.NewDataAdapter(cmd); DataTable rpirRpren = new DataTable(); da.Fill(rpirRpren); if (rpirRpren.Rows.Count == 0) return rpirRpren; RpirDAC rpirDao = new RpirDAC(); DataTable rpir = new DataTable(); foreach (DataRow rpirRow in rpirRpren.Rows) { string rpren = rpirRow["RPREN"].ToString(); rpir.Merge(rpirDao.SelectRPIB(rpren, tran, "RPITM ASC", true), true, MissingSchemaAction.Add); } // 整理每一筆紀錄,將結束日期填入 for (int i = 0; i < rpir.Rows.Count; i++) { int rpitm = Convert.ToInt32(rpir.Rows[i]["RPITM"]); rpir.Rows[i].BeginEdit(); // 若項次不是 0,把起始日填入生效日 if (rpitm != 0) { DateTime rpbdt = Convert.ToDateTime(rpir.Rows[i]["RPBDT"]); } // 沒有結束日 if (rpir.Rows[i]["RPEDT"] == DBNull.Value) { // 若不是最後一筆,且下一筆項次不是 0 if (i < rpir.Rows.Count - 1 && Convert.ToInt32(rpir.Rows[i + 1]["RPITM"]) != 0) { // 下一筆沒有退保日,把下一筆的生效日期前一天與結束日比較之後的較前一天放入退保日期 if (rpir.Rows[i + 1]["RPEDT"] == DBNull.Value) { DateTime rpbdt = Convert.ToDateTime(rpir.Rows[i + 1]["RPBDT"]); if (rpbdt < endDay) rpir.Rows[i]["RPEDT"] = rpbdt.AddDays(-1); else rpir.Rows[i]["RPEDT"] = endDay; } // 下一筆有結束日,把下一筆的結束日,放入這一筆的結束日 else { rpir.Rows[i]["RPEDT"] = rpir.Rows[i + 1]["RPEDT"]; } } // 最後一筆 else if (i == rpir.Rows.Count - 1) { DateTime rpsdt = Convert.ToDateTime(rpir.Rows[i]["RPSDT"]); // 結束日大於月底日,結束日放入加保日的當月月底 if (rpsdt > endDay) rpir.Rows[i]["RPEDT"] = WGuard1.GetMonthEnd(rpsdt, 0); // 否則放入月底日 else rpir.Rows[i]["RPEDT"] = endDay; } } rpir.Rows[i]["RPXDT"] = rpir.Rows[i]["RPEDT"]; rpir.Rows[i].EndEdit(); } // 再一次整理,剔除: // 1. 生效起日與生效迄日均在日期區間外的紀錄 // 2. 生效迄日小於生效起日的紀錄 // 3. 生效起日等於生效迄日且是最後一筆,但項次不是 0 的紀錄 // 4. 後面的已經涵蓋整個月,前面的都要刪除 // 5. 生效起日與生效迄日相同且作業類別是退保、眷屬退保、留職停薪的紀錄 int count = rpir.Rows.Count - 1; bool goOut = false; List cover = new List(); for (int i = rpir.Rows.Count - 1; i >= 0; i--) { DataRow row = rpir.Rows[i]; DateTime rpsdt = WQuery.GetDateTimeValue(row["RPBDT"]); DateTime rpedt = WQuery.GetDateTimeValue(row["RPXDT"]); int rpitm = WQuery.GetInt32Value(row["RPITM"]); string rpopt = WQuery.GetStringValue(row["RPOPT"]); if (rpopt == "退保" && rpedt >= startDay && rpedt <= endDay) goOut = true; bool allCover = true; DateTime day = startDay; while (day <= endDay) { allCover &= cover.Contains(day); day = day.AddDays(1); if (!allCover) break; } if (allCover || (rpsdt < startDay && rpedt < startDay) || (rpsdt > endDay && rpedt > endDay) || (rpsdt > rpedt) || (rpsdt == rpedt && i == count && rpitm != 0) || (rpsdt == rpedt && (rpopt == "退保" || rpopt == "眷屬退保" || rpopt == "留職停薪")) ) rpir.Rows.RemoveAt(i); else { day = rpsdt; while (day <= rpedt) { if (!cover.Contains(day)) cover.Add(day); day = day.AddDays(1); } } } // 再做一次欄位改變比對 if (isLabor) { for (int i = 0; i < rpir.Rows.Count; i++) { if (i > 0) rpirDao.CompareChanged(rpir.Rows[i], rpir.Rows[i - 1]); } // 這段期間退保,將最後一筆的作業類別改為退保 if (goOut) { rpir.Rows[rpir.Rows.Count - 1].BeginEdit(); rpir.Rows[rpir.Rows.Count - 1]["RPOPT"] = "退保"; rpir.Rows[rpir.Rows.Count - 1].EndEdit(); rpir.Rows[rpir.Rows.Count - 1].AcceptChanges(); } } return rpir; } /// /// 取得薪資項目以及與個人有關費用的加總 /// public DataTable GetSSMSSum01(DateTime yymm, string rppyn, DbTransaction tran) { DbCommand cmd = Query.NewCommand( @"SELECT SUM(SSP00 + SSP01 + SSP02 + SSP03 + SSP04 + SSP05 - SSS01 - SSS02) BPS01, SUM(SSH01 + SSH02 + SSH03) BPS02, SUM(SSH05) BPS03, SUM(SSH04) BPS04, SUM(SSH06) BPS05, SUM(SSP09 + SSP10) BPS06, SUM(SSP12) BPS07, SUM(SSP06 + SSP07 + SSP08) BPS08, SUM(SSP11) BPS09 FROM SSMS_VIEW WHERE SSYMM = @YYMM AND SSPYN = @SSPYN"); cmd.Parameters.Add(Query.NewParameter("YYMM", yymm)); cmd.Parameters.Add(Query.NewParameter("SSPYN", rppyn)); cmd.Connection = tran.Connection; cmd.Transaction = tran; DbDataAdapter da = Query.NewDataAdapter(cmd); DataTable result = new DataTable(); da.Fill(result); return result; } /// /// 取得科目預設的備註 /// /// 年度專案編號 /// 科目編號 /// 要加入的交易物件 /// public string GetBPAB_BPDOC(string bppyn, string bpacc, DbTransaction tran) { DbCommand cmd = Query.NewCommand("SELECT BPDOC FROM BPAB WHERE BPPYN=@BPPYN AND BPACC=@BPACC"); cmd.Parameters.Add(Query.NewParameter("BPPYN", bppyn)); cmd.Parameters.Add(Query.NewParameter("BPACC", bpacc)); cmd.Connection = tran.Connection; cmd.Transaction = tran; object o = cmd.ExecuteScalar(); if (o != null && o != DBNull.Value) return o.ToString(); else return ""; } /// /// 取得憑證加總 by 科目 /// public DataTable GetRPFESum(DateTime yymm, string rppyn, DbTransaction tran) { DbCommand cmd = Query.NewCommand( @"SELECT RPACC, SUM(RPAMT) RPAMT FROM RPFE WHERE RPDAT = @YYMM AND RPPYN = @RPPYN GROUP BY RPACC"); cmd.Parameters.Add(Query.NewParameter("YYMM", yymm)); cmd.Parameters.Add(Query.NewParameter("RPPYN", rppyn)); cmd.Connection = tran.Connection; cmd.Transaction = tran; DbDataAdapter da = Query.NewDataAdapter(cmd); DataTable result = new DataTable(); da.Fill(result); return result; } /// /// 取得差勤結算日 /// /// 專案年度編號 /// 要加入的交易 /// public int GetBPAA_BPFED(string bppyn, DbTransaction tran) { DbCommand cmd = Query.NewCommand( @"SELECT BPFED FROM BPAA WHERE BPPYN = @BPPYN"); cmd.Parameters.Add(Query.NewParameter("BPPYN", bppyn)); cmd.Connection = tran.Connection; cmd.Transaction = tran; object o = cmd.ExecuteScalar(); if (o == null || o == DBNull.Value) return 31; else return Convert.ToInt32(o); } /// /// 取得加班匯總資料 /// public DataTable GetROWK(DateTime yymm, string ropyn, string roeno, DbTransaction tran) { DbCommand cmd = Query.NewCommand( @"SELECT ROYMM, ROPYN, ROENO, ROT01, ROT02, ROT03, ROT04, ROT05, ROA01, ROA02, ROA03, ROA05, ROT06, ROA06 FROM ROWK WHERE ROYMM = @YYMM AND ROPYN = @ROPYN AND ROENO=@ROENO"); cmd.Parameters.Add(Query.NewParameter("YYMM", yymm)); cmd.Parameters.Add(Query.NewParameter("ROPYN", ropyn)); cmd.Parameters.Add(Query.NewParameter("ROENO", roeno)); cmd.Connection = tran.Connection; cmd.Transaction = tran; DbDataAdapter da = Query.NewDataAdapter(cmd); DataTable result = new DataTable(); da.Fill(result); return result; } /// /// 取得總表用資料 /// public bool GetSACDReportData(string bppyn, DateTime aYYMM, out DataTable reportData) { // 產生資料架構 DataColumn[] keys = new DataColumn[1]; DbCommand cmdSACDTmp = Query.NewCommand( @"SELECT (SELECT TOP 1 B.BPACC FROM BPAB B WHERE B.BPPYN=A.BPPYN AND B.BPACC=SUBSTRING(A.BPACC,1,2) + '0000') BPACC_A, (SELECT TOP 1 B.BPAME FROM BPAB B WHERE B.BPPYN=A.BPPYN AND B.BPACC=SUBSTRING(A.BPACC,1,2) + '0000') BPAME_A, (SELECT TOP 1 C.BPACC FROM BPAB C WHERE C.BPPYN=A.BPPYN AND C.BPACC=SUBSTRING(A.BPACC,1,4) + '00') BPACC_B, (SELECT TOP 1 C.BPAME FROM BPAB C WHERE C.BPPYN=A.BPPYN AND C.BPACC=SUBSTRING(A.BPACC,1,4) + '00') BPAME_B, A.BPPYN, A.BPACC, A.BPBGT, A.BPCLS, A.BPAME, '' MM, CASE WHEN D.BPS13=A.BPACC OR D.BPS14=A.BPACC THEN 'N' ELSE 'Y' END SHOW, 0 SAAMT_01, 0 SAAMT_02, 0 SAAMT_03, 0 SAAMT_04, 0 SAAMT_05, 0 SAAMT_06, 0 SAAMT_07, 0 SAAMT_08, 0 SAAMT_09, 0 SAAMT_10, 0 SAAMT_11, 0 SAAMT_12, '' SADOC FROM BPAB A INNER JOIN BPAA D ON A.BPPYN=D.BPPYN WHERE A.BPPYN=@BPPYN AND SUBSTRING(A.BPACC,5,2) <> '00'"); cmdSACDTmp.Parameters.Add(Query.NewParameter("BPPYN", bppyn)); reportData = Query.Select(cmdSACDTmp); if (reportData.Rows.Count == 0) return false; keys[0] = reportData.Columns["BPACC"]; reportData.PrimaryKey = keys; // 擷取科目對照 DataTable bpaa = Query.Select("SELECT * FROM BPAA WHERE BPPYN='" + bppyn + "'"); DataRow bpaaRow = bpaa.Rows[0]; // 擷取每月資料,填入資料架構 DbCommand cmdSACD = Query.NewCommand( @"SELECT A.BPACC, ISNULL(B.SAAMT, 0) SAAMT, ISNULL(B.SADOC, '') SADOC FROM BPAB A LEFT OUTER JOIN SACD B ON A.BPPYN = B.SAPYN AND A.BPACC = B.SAACC AND B.SAYMM = @SAYMM WHERE A.BPPYN=@BPPYN AND SUBSTRING(A.BPACC,5,2) <> '00'"); cmdSACD.Parameters.Add(Query.NewParameter("SAYMM", DbType.DateTime)); cmdSACD.Parameters.Add(Query.NewParameter("BPPYN", bppyn)); DateTime aYYMM1 = new DateTime(aYYMM.Year, 1, 1); string thisMonth = aYYMM.ToString("MMM", WGuard1.TaiwanCulture) + "份"; string prevMonth = aYYMM.AddMonths(-1).ToString("MMM", WGuard1.TaiwanCulture) + "份"; for (int i = 0; i < aYYMM.Month; i++) { // 取得每月資料 cmdSACD.Parameters["SAYMM"].Value = aYYMM1.AddMonths(i); DataTable sacdThisMonth = Query.Select(cmdSACD); // 取得每月之前一個月資料 cmdSACD.Parameters["SAYMM"].Value = aYYMM1.AddMonths(i - 1); DataTable sacdPrevMonth = Query.Select(cmdSACD); foreach (DataRow row in sacdThisMonth.Rows) { string bpacc = row["BPACC"].ToString(); DataRow aRow = reportData.Rows.Find(bpacc); aRow.BeginEdit(); if (bpacc == bpaaRow["BPS02"].ToString() || bpacc == bpaaRow["BPS03"].ToString() || bpacc == bpaaRow["BPS04"].ToString() || bpacc == bpaaRow["BPS05"].ToString() || bpacc == bpaaRow["BPS11"].ToString()) { aRow["MM"] = prevMonth; DataRow[] prev = sacdPrevMonth.Select("BPACC='" + bpacc + "'"); if (prev.Length > 0) aRow[String.Format("SAAMT_{0:00}", i + 1)] = prev[0]["SAAMT"]; else aRow[String.Format("SAAMT_{0:00}", i + 1)] = 0; } else { aRow["MM"] = thisMonth; aRow[String.Format("SAAMT_{0:00}", i + 1)] = row["SAAMT"]; } if (aYYMM.Month == i + 1) aRow["SADOC"] = row["SADOC"]; aRow.EndEdit(); } } return true; } /// /// 取得薪資勞健保報表資料 /// public bool GetSSMSReportData(string bppyn, DateTime aYYMM, bool year, out DataTable reportData) { string where = string.Empty; if (year) where = "WHERE A.SSPYN=@SSPYN AND A.SSYMM >= @SSYMM_1 AND A.SSYMM < @SSYMM_2 AND DATEPART(DAY, A.SSYMM) = 1"; else where = "WHERE A.SSPYN=@SSPYN AND A.SSYMM=@SSYMM_1"; string sql = String.Format(@"SELECT A.SSYMM, A.SSENO, B.BPNME, A.SSJNO, C.BPJME, A.SSCNO, D.BPCME, A.SSBRH, E.BSRMK SSBRHX, A.SSD01, A.SSD02, A.SSSRD, A.SSP00, A.SSP01, A.SSP02, A.SSP03, A.SSP04, A.SSP05, A.SSP06, A.SSP07, A.SSP08, A.SSP09, A.SSP10, A.SSP11, A.SSP12, A.SSP13, A.SSP14, A.SSP15, A.SSP99, A.SSS01, A.SSS02, A.SSS03, A.SSS04, A.SSS05, A.SSS06, A.SSS07, A.SSS08, A.SSS09, A.SSS10, A.SSS11, A.SSS12, A.SSS13, A.SSS14, A.SSS15, A.SSS99, A.SSH01, A.SSH02, A.SSH03, A.SSH04, A.SSH05, A.SSH06, A.SSH07, A.SSH08, A.SSH09, A.SSH10, A.SST01, A.SST02, A.SST03, A.SST04, A.SST05, A.SST06, A.SST07, A.SST08, A.SST09, A.SST10, A.SST11, A.SST12, A.SST13, A.SST14, A.SST15, A.SST16, A.SST17, A.SST18, A.SST19, A.SST20, A.SST21, A.SST22, A.SST23, A.SST24, A.SST25, A.SSL01, A.SSL02, A.SSL03, A.SSL04, A.SSL05, A.SSC01, A.SSC02, A.SSC03, A.SSC04, A.SSC05, A.SSC06, A.SSC07, A.SSC08, A.SSC09, A.SSC10, B.BPSDY, D.BPSRM, D.BPP02, A.SST01M, A.SST02M, A.SST03M, A.SST04M, A.SST05M, A.SST06M, A.SST07M, A.SST08M, A.SST09M, A.SST10M, A.SST11M, A.SST12M, A.SST13M, A.SST14M, A.SST15M, A.SST16M, A.SST17M, A.SST19M, A.SST20M, A.SST21M, A.SST22M, A.SST23M, A.SST24M, A.SST25M, (SELECT TOP 1 RASDT FROM RASN F WHERE A.SSPYN=F.RAPYN AND A.SSENO=F.RANUM AND F.RASDT <= @SSYMM_1 ORDER BY F.RASDT DESC) RASDT, (SELECT TOP 1 RAEDT FROM RASN F WHERE A.SSPYN=F.RAPYN AND A.SSENO=F.RANUM AND F.RASDT <= @SSYMM_1 ORDER BY F.RASDT DESC) RAEDT FROM SSMS_VIEW A INNER JOIN BPSNView B ON A.SSENO=B.BPENO LEFT OUTER JOIN BPJA C ON A.SSPYN=C.BPPYN AND A.SSJNO=C.BPJNO LEFT OUTER JOIN BPJB D ON A.SSPYN=D.BPPYN AND A.SSJNO=D.BPJNO AND A.SSCNO=D.BPCNO LEFT OUTER JOIN BCLS E ON A.SSBRH=E.BSCLS AND E.BSPAR='BPSNBRH' {0} ORDER BY SSBRH, SSENO, SSYMM", where); DbCommand cmdBHIF = Query.NewCommand(sql); cmdBHIF.Parameters.Add(Query.NewParameter("SSPYN", bppyn)); cmdBHIF.Parameters.Add(Query.NewParameter("SSYMM_1", aYYMM)); if (year) cmdBHIF.Parameters.Add(Query.NewParameter("SSYMM_2", aYYMM.AddMonths(year ? 12 : 1))); DbConnection conn = Query.NewConnection(); cmdBHIF.Connection = conn; DbDataAdapter da = Query.NewDataAdapter(cmdBHIF); reportData = new DataTable(); da.FillSchema(reportData, SchemaType.Mapped); da.Fill(reportData); // 處理「中心」 foreach (DataRow row in reportData.Rows) { if (row["SSBRHX"].ToString().Contains("中心")) { row.BeginEdit(); row["SSBRHX"] = "中心"; row.EndEdit(); } } return reportData.Rows.Count > 0; } /// /// 取得薪資總表資料 /// public bool GetSSMSSummaryReportData(DateTime aYYMM, out DataTable reportData) { DbCommand cmdBHIF = Query.NewCommand( @"SELECT A.SSPYN, B.BPPYM, SUM(A.SSP00) AS SSP00, SUM(A.SSP01) AS SSP01, SUM(A.SSP02) AS SSP02, SUM(A.SSP03) AS SSP03, SUM(A.SSP04) AS SSP04, SUM(A.SSP05) AS SSP05, SUM(A.SSP06) AS SSP06, SUM(A.SSP07) AS SSP07, SUM(A.SSP08) AS SSP08, SUM(A.SSP09) AS SSP09, SUM(A.SSP10) AS SSP10, SUM(A.SSP11) AS SSP11, SUM(A.SSP12) AS SSP12, SUM(A.SSP13) AS SSP13, SUM(A.SSP14) AS SSP14, SUM(A.SSP15) AS SSP15, SUM(A.SSP99) AS SSP99, SUM(A.SSS01) AS SSS01, SUM(A.SSS02) AS SSS02, SUM(A.SSS03) AS SSS03, SUM(A.SSS04) AS SSS04, SUM(A.SSS05) AS SSS05, SUM(A.SSS06) AS SSS06, SUM(A.SSS07) AS SSS07, SUM(A.SSS08) AS SSS08, SUM(A.SSS09) AS SSS09, SUM(A.SSS10) AS SSS10, SUM(A.SSS11) AS SSS11, SUM(A.SSS12) AS SSS12, SUM(A.SSS13) AS SSS13, SUM(A.SSS14) AS SSS14, SUM(A.SSS15) AS SSS15, SUM(A.SSS99) AS SSS99, SUM(A.SSH01) AS SSH01, SUM(A.SSH02) AS SSH02, SUM(A.SSH03) AS SSH03, SUM(A.SSH04) AS SSH04, SUM(A.SSH05) AS SSH05, SUM(A.SSH06) AS SSH06, SUM(A.SSH07) AS SSH07, SUM(A.SSH08) AS SSH08, SUM(A.SSH09) AS SSH09, SUM(A.SSH10) AS SSH10, SUM(A.SST01) AS SST01, SUM(A.SST02) AS SST02, SUM(A.SST03) AS SST03, SUM(A.SST04) AS SST04, SUM(A.SST05) AS SST05, SUM(A.SST06) AS SST06, SUM(A.SST07) AS SST07, SUM(A.SST08) AS SST08, SUM(A.SST09) AS SST09, SUM(A.SST10) AS SST10, SUM(A.SST11) AS SST11, SUM(A.SST12) AS SST12, SUM(A.SST13) AS SST13, SUM(A.SST14) AS SST14, SUM(A.SST15) AS SST15, SUM(A.SST16) AS SST16, SUM(A.SST17) AS SST17, SUM(A.SST18) AS SST18, SUM(A.SST19) AS SST19, SUM(A.SST20) AS SST20, SUM(A.SST21) AS SST21, SUM(A.SST22) AS SST22, SUM(A.SST23) AS SST23, SUM(A.SST24) AS SST24, SUM(A.SST25) AS SST25, SUM(A.SSL01) AS SSL01, SUM(A.SSL02) AS SSL02, SUM(A.SSL03) AS SSL03, SUM(A.SSL04) AS SSL04, SUM(A.SSL05) AS SSL05 FROM SSMS_VIEW A INNER JOIN BPAA B ON A.SSPYN=B.BPPYN WHERE A.SSYMM=@SSYMM GROUP BY A.SSPYN, B.BPPYM ORDER BY A.SSPYN"); cmdBHIF.Parameters.Add(Query.NewParameter("SSYMM", aYYMM)); reportData = Query.Select(cmdBHIF); return reportData.Rows.Count > 0; } /// /// 由費率類別、年月取得費率 /// /// 費率類別 /// 年月 /// public double GetFeeRate(string BRTYP, DateTime aYYMM, DbTransaction tran) { DbCommand cmdBRTE = Query.NewCommand( @"SELECT TOP 1 BRRTE, BRVER FROM BRTE WHERE BRTYP=@BRTYP AND ((BRSDT <= @YYMM AND BREDT IS NULL) OR (BRSDT <= @YYMM AND BREDT >= @YYMM)) ORDER BY BRVER DESC"); cmdBRTE.Parameters.Add(Query.NewParameter("BRTYP", BRTYP)); cmdBRTE.Parameters.Add(Query.NewParameter("YYMM", aYYMM)); object o; if (tran == null) o = Query.ExecuteScalar(cmdBRTE); else { cmdBRTE.Connection = tran.Connection; cmdBRTE.Transaction = tran; o = cmdBRTE.ExecuteScalar(); } if (o == null || o == DBNull.Value) return 0d; else return Convert.ToDouble(o); } public DateTime Get關帳日(string bppyn) { DbCommand cmd = Query.NewCommand(@"SELECT BPMSD FROM BPAA WHERE BPPYN=@BPPYN"); Query.AddParam(cmd, "BPPYN", bppyn); object o = Query.ExecuteScalar(cmd); return WDAC.GetDateTimeValue(o).AddMonths(1).AddDays(-1); } } /// /// 專案年度接單 /// public struct BPAARecord { ///專案年度編號 public string BPPYN; ///年度預算 public int BPBGT; ///年關帳日 public DateTime BPCSD; ///月關帳日 public DateTime BPMSD; ///薪資科目 public string BPS01; ///勞保雇主部份負擔科目 public string BPS02; ///健保雇主部份負擔科目 public string BPS03; ///工資墊償基金科目 public string BPS04; ///勞退金提撥科目 public string BPS05; ///外勤作業費科目 public string BPS06; ///油料費科目 public string BPS07; ///加班費科目 public string BPS08; ///電話費科目 public string BPS09; ///行政督導薪資科目 public string BPS10; ///行政督導保險及退休提撥科目 public string BPS11; ///行政督導加班費科目 public string BPS12; ///公費科目 public string BPS13; ///營業稅科目 public string BPS14; ///管理費用 public string BPS15; ///科目16 public string BPS16; ///科目17 public string BPS17; ///科目18 public string BPS18; ///科目19 public string BPS19; ///科目20 public string BPS20; ///科目21 public string BPS21; ///科目22 public string BPS22; ///科目23 public string BPS23; ///科目24 public string BPS24; ///科目25 public string BPS25; ///科目26 public string BPS26; ///科目27 public string BPS27; ///科目28 public string BPS28; ///科目29 public string BPS29; ///科目30 public string BPS30; ///差勤結算日 public int BPFED; ///薪資破月計算方式 public string BPSAL; ///公司別 public string BPCPY; ///加班時數計算方式 public string BPOTT; ///補休有效期(月) public int BPOTD; public void FillRecord(DataRow row) { BPPYN = row["BPPYN"] != DBNull.Value ? row["BPPYN"].ToString().Trim() : ""; BPBGT = row["BPBGT"] != DBNull.Value ? Convert.ToInt32(row["BPBGT"]) : 0; BPCSD = row["BPCSD"] != DBNull.Value ? Convert.ToDateTime(row["BPCSD"]) : new DateTime(0); BPMSD = row["BPMSD"] != DBNull.Value ? Convert.ToDateTime(row["BPMSD"]) : new DateTime(0); BPS01 = row["BPS01"] != DBNull.Value ? row["BPS01"].ToString().Trim() : ""; BPS02 = row["BPS02"] != DBNull.Value ? row["BPS02"].ToString().Trim() : ""; BPS03 = row["BPS03"] != DBNull.Value ? row["BPS03"].ToString().Trim() : ""; BPS04 = row["BPS04"] != DBNull.Value ? row["BPS04"].ToString().Trim() : ""; BPS05 = row["BPS05"] != DBNull.Value ? row["BPS05"].ToString().Trim() : ""; BPS06 = row["BPS06"] != DBNull.Value ? row["BPS06"].ToString().Trim() : ""; BPS07 = row["BPS07"] != DBNull.Value ? row["BPS07"].ToString().Trim() : ""; BPS08 = row["BPS08"] != DBNull.Value ? row["BPS08"].ToString().Trim() : ""; BPS09 = row["BPS09"] != DBNull.Value ? row["BPS09"].ToString().Trim() : ""; BPS10 = row["BPS10"] != DBNull.Value ? row["BPS10"].ToString().Trim() : ""; BPS11 = row["BPS11"] != DBNull.Value ? row["BPS11"].ToString().Trim() : ""; BPS12 = row["BPS12"] != DBNull.Value ? row["BPS12"].ToString().Trim() : ""; BPS13 = row["BPS13"] != DBNull.Value ? row["BPS13"].ToString().Trim() : ""; BPS14 = row["BPS14"] != DBNull.Value ? row["BPS14"].ToString().Trim() : ""; BPS15 = row["BPS15"] != DBNull.Value ? row["BPS15"].ToString().Trim() : ""; BPS16 = row["BPS16"] != DBNull.Value ? row["BPS16"].ToString().Trim() : ""; BPS17 = row["BPS17"] != DBNull.Value ? row["BPS17"].ToString().Trim() : ""; BPS18 = row["BPS18"] != DBNull.Value ? row["BPS18"].ToString().Trim() : ""; BPS19 = row["BPS19"] != DBNull.Value ? row["BPS19"].ToString().Trim() : ""; BPS20 = row["BPS20"] != DBNull.Value ? row["BPS20"].ToString().Trim() : ""; BPS21 = row["BPS21"] != DBNull.Value ? row["BPS21"].ToString().Trim() : ""; BPS22 = row["BPS22"] != DBNull.Value ? row["BPS22"].ToString().Trim() : ""; BPS23 = row["BPS23"] != DBNull.Value ? row["BPS23"].ToString().Trim() : ""; BPS24 = row["BPS24"] != DBNull.Value ? row["BPS24"].ToString().Trim() : ""; BPS25 = row["BPS25"] != DBNull.Value ? row["BPS25"].ToString().Trim() : ""; BPS26 = row["BPS26"] != DBNull.Value ? row["BPS26"].ToString().Trim() : ""; BPS27 = row["BPS27"] != DBNull.Value ? row["BPS27"].ToString().Trim() : ""; BPS28 = row["BPS28"] != DBNull.Value ? row["BPS28"].ToString().Trim() : ""; BPS29 = row["BPS29"] != DBNull.Value ? row["BPS29"].ToString().Trim() : ""; BPS30 = row["BPS30"] != DBNull.Value ? row["BPS30"].ToString().Trim() : ""; BPFED = row["BPFED"] != DBNull.Value ? Convert.ToInt32(row["BPFED"]) : 31; BPSAL = row["BPSAL"] != DBNull.Value ? row["BPSAL"].ToString().Trim() : "1"; BPCPY = row["BPCPY"] != DBNull.Value ? row["BPCPY"].ToString().Trim() : ""; BPOTT = row["BPOTT"] != DBNull.Value ? row["BPOTT"].ToString().Trim() : "1"; BPOTD = row["BPOTD"] != DBNull.Value ? Convert.ToInt32(row["BPOTD"]) : 6; } } /// /// 人員派遣紀錄 /// public struct RASNRecord { ///人員編號 public string RANUM; ///派遣項次 public int RAITM; ///客戶編號 public string RACNM; ///專案年度編號 public string RAPYN; ///派遣開始日期 public DateTime RASDT; ///派遣結束日期 public DateTime RAEDT; ///離職日 public DateTime BPEDY; ///職稱 public string RAJNO; ///等級 public string RACNO; ///站別 public string RABRH; ///月薪 public int BPSRM; ///時薪 public int BPSRD; ///全勤獎金 public int BPP01; ///伙食津貼 public int BPP02; ///職務加給 public int BPP03; ///派駐津貼 public int BPP04; ///其他津貼 public int BPP05; ///前二加班 public double BPBFT; ///後二加班 public double BPAFT; ///假日加班 public double BPHOL; ///加班費計算公式 public string BPOVR; ///請假扣款計算公式 public string BPLVE; public void FillRecord(DataRow row) { RANUM = row["RANUM"] != DBNull.Value ? row["RANUM"].ToString().Trim() : ""; RAITM = row["RAITM"] != DBNull.Value ? Convert.ToInt32(row["RAITM"]) : 0; RACNM = row["RACNM"] != DBNull.Value ? row["RACNM"].ToString().Trim() : ""; RAPYN = row["RAPYN"] != DBNull.Value ? row["RAPYN"].ToString().Trim() : ""; RASDT = row["RASDT"] != DBNull.Value ? Convert.ToDateTime(row["RASDT"]) : new DateTime(0); RAEDT = row["RAEDT"] != DBNull.Value ? Convert.ToDateTime(row["RAEDT"]) : new DateTime(0); BPEDY = row["BPEDY"] != DBNull.Value ? Convert.ToDateTime(row["BPEDY"]) : new DateTime(0); RAJNO = row["RAJNO"] != DBNull.Value ? row["RAJNO"].ToString().Trim() : ""; RACNO = row["RACNO"] != DBNull.Value ? row["RACNO"].ToString().Trim() : ""; RABRH = row["RABRH"] != DBNull.Value ? row["RABRH"].ToString().Trim() : ""; BPSRM = row["BPSRM"] != DBNull.Value ? Convert.ToInt32(row["BPSRM"]) : 0; BPSRD = row["BPSRD"] != DBNull.Value ? Convert.ToInt32(row["BPSRD"]) : 0; BPP01 = row["BPP01"] != DBNull.Value ? Convert.ToInt32(row["BPP01"]) : 0; BPP02 = row["BPP02"] != DBNull.Value ? Convert.ToInt32(row["BPP02"]) : 0; BPP03 = row["BPP03"] != DBNull.Value ? Convert.ToInt32(row["BPP03"]) : 0; BPP04 = row["BPP04"] != DBNull.Value ? Convert.ToInt32(row["BPP04"]) : 0; BPP05 = row["BPP05"] != DBNull.Value ? Convert.ToInt32(row["BPP05"]) : 0; BPBFT = row["BPBFT"] != DBNull.Value ? Convert.ToDouble(row["BPBFT"]) : 1d; BPAFT = row["BPAFT"] != DBNull.Value ? Convert.ToDouble(row["BPAFT"]) : 1d; BPHOL = row["BPHOL"] != DBNull.Value ? Convert.ToDouble(row["BPHOL"]) : 1d; BPOVR = row["BPOVR"] != DBNull.Value ? row["BPOVR"].ToString() : GetData.defaultBPOVR; BPLVE = row["BPLVE"] != DBNull.Value ? row["BPLVE"].ToString() : GetData.defaultBPLVE; } } /// /// 非專案人員薪資計算用資料類別 /// public struct BPSNNoCaseRecord { public string BPENO; public DateTime STA_DATE; public DateTime END_DATE; public int BPSRM; public int BPSRD; public int BPP01; public int BPP02; public int BPP03; public int BPP04; public int BPP05; public void FillRecord(DataRow row) { BPENO = row["BPENO"] != DBNull.Value ? row["BPENO"].ToString() : ""; STA_DATE = row["STA_DATE"] != DBNull.Value ? Convert.ToDateTime(row["STA_DATE"]) : new DateTime(); END_DATE = row["END_DATE"] != DBNull.Value ? Convert.ToDateTime(row["END_DATE"]) : new DateTime(); BPSRM = row["BPSRM"] != DBNull.Value ? Convert.ToInt32(row["BPSRM"]) : 0; BPSRD = row["BPSRD"] != DBNull.Value ? Convert.ToInt32(row["BPSRD"]) : 0; BPP01 = row["BPP01"] != DBNull.Value ? Convert.ToInt32(row["BPP01"]) : 0; BPP02 = row["BPP02"] != DBNull.Value ? Convert.ToInt32(row["BPP02"]) : 0; BPP03 = row["BPP03"] != DBNull.Value ? Convert.ToInt32(row["BPP03"]) : 0; BPP04 = row["BPP04"] != DBNull.Value ? Convert.ToInt32(row["BPP04"]) : 0; BPP05 = row["BPP05"] != DBNull.Value ? Convert.ToInt32(row["BPP05"]) : 0; } } /// /// 人員請假、加班、差旅、費用紀錄 /// public struct RPARRecord { ///年度接單編號 public string RPPYN; ///員工編號 public string RPNUM; ///單號 public string RPREN; ///開始日期或發生日期 public DateTime RPRDT; ///結束日期 public DateTime RPEDT; ///類別 public string RPTYP; ///時數 public int RPTCT; ///費用 public int RPFTR; ///前二時數 public int RPTC1; ///後二時數 public int RPTC2; ///假日時數 public int RPTC3; ///2.67時數 public int RPTC4; ///2.00時數 public int RPTC5; ///備註 public string RPDOC; ///開始時間 public string RPRTM; ///結束時間 public string RPETM; ///差旅地點 public string RPPLC; ///差旅事由 public string RPRSN; public void FillRecord(DataRow row) { RPPYN = WDAC.GetStringValue(row["RPPYN"]); RPNUM = WDAC.GetStringValue(row["RPNUM"]); RPREN = WDAC.GetStringValue(row["RPREN"]); RPRDT = WDAC.GetDateTimeValue(row["RPRDT"]); RPEDT = WDAC.GetDateTimeValue(row["RPEDT"]); RPTYP = WDAC.GetStringValue(row["RPTYP"]); RPTCT = WDAC.GetInt32Value(row["RPTCT"]); RPFTR = WDAC.GetInt32Value(row["RPFTR"]); RPTC1 = WDAC.GetInt32Value(row["RPTC1"]); RPTC2 = WDAC.GetInt32Value(row["RPTC2"]); RPTC3 = WDAC.GetInt32Value(row["RPTC3"]); RPTC4 = WDAC.GetInt32Value(row["RPTC4"]); RPTC5 = WDAC.GetInt32Value(row["RPTC5"]); RPDOC = WDAC.GetStringValue(row["RPDOC"]); RPRTM = WDAC.GetStringValue(row["RPRTM"]); RPETM = WDAC.GetStringValue(row["RPETM"]); RPPLC = WDAC.GetStringValue(row["RPPLC"]); RPRSN = WDAC.GetStringValue(row["RPRSN"]); } } /// /// 勞健保加退保紀錄 /// public struct RPIRRecord { ///人員編號 public string RPENO; ///生效起日 public DateTime RPBDT; ///生效迄日 public DateTime RPXDT; ///加保日期 public DateTime RPSDT; ///退保日期 public DateTime RPEDT; ///薪資 public int RPSLY; ///勞保投保級距 public int RPAMT; ///健保投保級距 public int RPAM2; ///勞退投保級距 public int RPAM3; ///一般眷口數 public int RPFMY; ///減免25%眷口數 public int RPFM1; ///減免50%眷口數 public int RPFM2; ///減免100%眷口數 public int RPFM3; ///勞退自提 public int RPSLA; ///勞保減免比例 public string RPDIS; ///健保減免比例 public string RPDIH; ///已領老年給付 public bool RPOLD; ///國籍別 1=本國籍 / 2=外國籍 public string RPNAT; ///身份別 public string RPPTP; ///有勞保 public bool RPLIS; ///有健保 public bool RPHIS; ///公司別 public string RPCPY; ///超過65歲 public bool RPOVR; ///異動類別 1=加保, 2=退保, 3=其他異動 public int TRTYPE; ///GoOut 轉出 public bool GoOut; public void FillRecord(DataRow row) { RPENO = WDAC.GetStringValue(row["RPENO"]); RPBDT = WDAC.GetDateTimeValue(row["RPBDT"]); RPXDT = WDAC.GetDateTimeValue(row["RPXDT"]); RPSDT = WDAC.GetDateTimeValue(row["RPSDT"]); RPEDT = WDAC.GetDateTimeValue(row["RPEDT"]); RPSLY = WDAC.GetInt32Value(row["RPSLY"]); RPAMT = WDAC.GetInt32Value(row["RPAMT"]); RPAM2 = WDAC.GetInt32Value(row["RPAM2"]); RPAM3 = WDAC.GetInt32Value(row["RPAM3"]); RPFMY = WDAC.GetInt32Value(row["RPFMY"]); RPFM1 = WDAC.GetInt32Value(row["RPFM1"]); RPFM2 = WDAC.GetInt32Value(row["RPFM2"]); RPFM3 = WDAC.GetInt32Value(row["RPFM3"]); RPSLA = WDAC.GetInt32Value(row["RPSLA"]); RPDIS = WDAC.GetStringValue(row["RPDIS"]).Trim(); RPDIH = WDAC.GetStringValue(row["RPDIH"]).Trim(); RPOLD = WDAC.GetStringValue(row["RPOLD"]).Trim() == "Y"; RPNAT = WDAC.GetStringValue(row["RPNAT"]).Trim(); RPPTP = WDAC.GetStringValue(row["RPPTP"]).Trim(); RPLIS = WDAC.GetStringValue(row["RPLIS"]).Trim() == "Y"; RPHIS = WDAC.GetStringValue(row["RPHIS"]).Trim() == "Y"; RPCPY = WDAC.GetStringValue(row["RPCPY"]); RPOVR = WDAC.GetStringValue(row["RPOVR"]).Trim() == "Y"; GoOut = WDAC.GetStringValue(row["RPOPT"]) == "退保"; int itemNo = WDAC.GetInt32Value(row["RPITM"]); string rpedtChanged = WDAC.GetStringValue(row["RPEDT_Changed"]); if (itemNo == 0) TRTYPE = 1; // 加保 else if (rpedtChanged == "Y" && RPEDT.Ticks > 0) TRTYPE = 2; // 退保 else TRTYPE = 3; // 其他異動 } } /// /// 人員月加班匯總 /// public struct ROWKRecord { ///員工編號 public string ROENO; ///月份 public DateTime ROYMM; ///專案年度編號 public string ROPYN; ///前二加班時數 public int ROT01; ///後二加班時數 public int ROT02; ///假日加班時數 public int ROT03; ///申請補休時數 public int ROT04; ///2.67加班時數 public int ROT05; ///2.00加班時數 public int ROT06; ///前二加班費 public int ROA01; ///後二加班費 public int ROA02; ///假日加班費 public int ROA03; ///2.67加班費 public int ROA05; ///2.00加班費 public int ROA06; public void FillRecord(DataRow row) { ROENO = WDAC.GetStringValue(row["ROENO"]); ROYMM = WDAC.GetDateTimeValue(row["ROYMM"]); ROPYN = WDAC.GetStringValue(row["ROPYN"]); ROT01 = WDAC.GetInt32Value(row["ROT01"]); ROT02 = WDAC.GetInt32Value(row["ROT02"]); ROT03 = WDAC.GetInt32Value(row["ROT03"]); ROT04 = WDAC.GetInt32Value(row["ROT04"]); ROT05 = WDAC.GetInt32Value(row["ROT05"]); ROT06 = WDAC.GetInt32Value(row["ROT06"]); ROA01 = WDAC.GetInt32Value(row["ROA01"]); ROA02 = WDAC.GetInt32Value(row["ROA02"]); ROA03 = WDAC.GetInt32Value(row["ROA03"]); ROA05 = WDAC.GetInt32Value(row["ROA05"]); ROA06 = WDAC.GetInt32Value(row["ROA06"]); } } public class ProjectEmployeeItem { public string BPENO { get; set; } public string BPNME { get; set; } public string BPBRH { get; set; } }