using Mono.Security.Cryptography; using System; using System.Collections; using System.Configuration; using System.Data; using System.Data.Common; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Net.Mail; using System.Security.Cryptography; using System.Text; using System.Transactions; using System.Web; using System.Web.Script.Services; using System.Web.Security; using System.Web.Services; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using Wellan.Common; using Wellan.Data; /// /// 人員出缺勤紀錄 (員工自行輸入) /// 請假處理 /// 加班處理 /// 電話費處理 /// 油料費處理 /// 差勤處理 /// public partial class forms_customer_fmRpar : Wellan.Web.UI.WUserControlBase { private string _RPPYN = ""; private string _RPRDT1 = ""; private string _RPRDT2 = ""; private int _YY = 0; private string select = @"SELECT TRDAT, TRMOD, TRUSR, RPREN, RPNUM, RAITM, RPCNM, RPPYN, RPRDT, RPEDT, RPTYP, RPFTR, RPDOC, RPRSN, RPAGM, RPPLC, APPNO, RPAPP, RPAPD, RPAPU, RPADT, RPAPN, RPANO, RPAGT, RPRTM, RPETM, RPUST, RPFPC, RPFAD, RPKMS, FLOOR(RPTCT / 60) AS RPTCT, RPTCT - FLOOR(RPTCT / 60) * 60 AS RPTMT, FLOOR(RPTC1 / 60) AS RPTC1, RPTC1 - FLOOR(RPTC1 / 60) * 60 AS RPTM1, FLOOR(RPTC2 / 60) AS RPTC2, RPTC2 - FLOOR(RPTC2 / 60) * 60 AS RPTM2, FLOOR(RPTC3 / 60) AS RPTC3, RPTC3 - FLOOR(RPTC3 / 60) * 60 AS RPTM3, FLOOR(RPTC4 / 60) AS RPTC4, RPTC4 - FLOOR(RPTC4 / 60) * 60 AS RPTM4, FLOOR(RPTC5 / 60) AS RPTC5, RPTC5 - FLOOR(RPTC5 / 60) * 60 AS RPTM5"; private string from = " FROM RPAR "; private string where = " WHERE 1=1 "; private string order = " ORDER BY RPRDT DESC"; private FormView RPARForm; private Panel RPARPanel; protected string rparType; private BpsnDAC bpsnDao; private BpapDAC bpapDao; private RparDAC rparDao; private DbConnection conn; private string oldRPTYP; private BhrdDAC bhrdDao; private RpabDAC rpabDao; private RpadDAC rpadDao; private RyerDAC ryerDao; private string _RPREN; private string _RPSTP; private string _RPEDP; private string _RPDAT; private GetData _getData; private DateTime 關帳日期; private int 可用補休; private int 可用特休; private int 可用病假; private int 可用事假; private int 年度病假; private int 年度事假; private string 上班時間; private string 下班時間; private string 午休開始; private string 午休結束; private int 上班分鐘數; private int 午休分鐘數; private string 簽核人員; private string attachPath; private string attachFileExt1, attachFileExt2, attachFileExt3; private byte[] attachFile1, attachFile2, attachFile3; private bool attachDelete1, attachDelete2, attachDelete3; private TimeCalc timeCalc = new TimeCalc(); protected bool OverTimeToMinute; protected void Page_Load(object sender, EventArgs e) { _RPRDT1 = WDAC.GetStringValue(ViewState["RPRDT1"]); _RPRDT2 = WDAC.GetStringValue(ViewState["RPRDT2"]); _RPREN = WDAC.GetStringValue(ViewState["RPREN"]); _RPSTP = WDAC.GetStringValue(ViewState["RPSTP"]); _RPEDP = WDAC.GetStringValue(ViewState["RPEDP"]); _RPDAT = WDAC.GetStringValue(ViewState["RPDAT"]); attachPath = Server.MapPath("~/UploadedPicture/RPAR_ATTACHMENT"); Directory.CreateDirectory(attachPath); attachFile1 = null; attachFileExt1 = ""; attachFile2 = null; attachFileExt2 = ""; attachFile3 = null; attachFileExt3 = ""; switch (RPARForm.CurrentMode) { case FormViewMode.ReadOnly: RPABGrid.Visible = true; break; case FormViewMode.Edit: RPABGrid.Visible = false; break; case FormViewMode.Insert: RPABGrid.Visible = false; break; } //if (IsPostBack) //{ // RPABGrid.DataBind(); // gv補休明細.DataBind(); // gvRPAD.DataBind(); // RPARGrid.DataBind(); //} } protected override void OnInit(EventArgs e) { base.OnInit(e); dsRPARForm.ConnectionString = ConnectionString; dsRPARGrid.ConnectionString = ConnectionString; dsRPAR_RPTYP.ConnectionString = ConnectionString; dsRPAB.ConnectionString = ConnectionString; bpsnDao = new BpsnDAC(Query); rparDao = new RparDAC(Query); bhrdDao = new BhrdDAC(Query); rpadDao = new RpadDAC(Query); rpabDao = new RpabDAC(Query); ryerDao = new RyerDAC(Query); bpapDao = new BpapDAC(Query); _RPPYN = WDAC.GetStringValue(ViewState["RPPYN"]); if (_RPPYN == null || _RPPYN.Length == 0) { _RPPYN = bpsnDao.GetCurrentProject(UserId); if (_RPPYN == null || _RPPYN.Length == 0) _RPPYN = "000000001"; ViewState["RPPYN"] = _RPPYN; } rparType = GetStringParam("type"); switch (rparType) { case RPAR_TYPE.T0_請假: RPARForm = RPARForm0; RPARPanel = Panel1; gv補休明細.Visible = true; break; case RPAR_TYPE.T1_加班: RPARForm = RPARForm1; RPARPanel = Panel2; gv補休明細.Visible = false; break; case RPAR_TYPE.T3_出差: RPARForm = RPARForm3; RPARPanel = Panel3; gv補休明細.Visible = false; break; } dsRPAR_RPTYP.SelectParameters["BSCLS"].DefaultValue = rparType + "%"; _YY = GetIntParam("YY"); GetGridViewRowColor(RPARGrid); /* if (_RPPYN.CompareTo("000000001") == 0) { RegisterLookupEvent(this, "btnRPAR_RPNUM1_WQRY", "txtRPAR_RPNUM1", "txtRPAR_RPNUM1,lbRPAR_RPNUM1X", "BPSN1", "NOT EXISTS (SELECT RANUM FROM RASN WHERE RANUM=BPENO AND RAEDT IS NULL)"); RegisterLookupEvent(this, "btnRPAR_RPNUM2_WQRY", "txtRPAR_RPNUM2", "txtRPAR_RPNUM2,lbRPAR_RPNUM2X", "BPSN1", "NOT EXISTS (SELECT RANUM FROM RASN WHERE RANUM=BPENO AND RAEDT IS NULL)"); } else { RegisterLookupEvent(this, "btnRPAR_RPNUM1_WQRY", "txtRPAR_RPNUM1", "txtRPAR_RPNUM1,lbRPAR_RPNUM1X", "BPSN1", "EXISTS (SELECT RANUM FROM RASN WHERE RAPYN='" + _RPPYN + "' AND RANUM=BPENO)"); RegisterLookupEvent(this, "btnRPAR_RPNUM2_WQRY", "txtRPAR_RPNUM2", "txtRPAR_RPNUM2,lbRPAR_RPNUM2X", "BPSN1", "EXISTS (SELECT RANUM FROM RASN WHERE RAPYN='" + _RPPYN + "' AND RANUM=BPENO)"); } */ RegisterCalendarEvent(this, "btnRPAR_RPRDT1_DATE", "txtRPAR_RPRDT1"); RegisterCalendarEvent(this, "btnRPAR_RPRDT2_DATE", "txtRPAR_RPRDT2"); MultiView1.Visible = _RPPYN != ""; if (_RPRDT1.Length == 0) { /* _RPRDT1 = DateTime.UtcNow.AddHours(8).Date.AddDays(-DateTime.UtcNow.AddHours(8).Date.Day + 1).ToString("yyyy-MM-dd", WGuard1.InvariantCulture); ViewState["RPRDT1"] = _RPRDT1; */ } if (_RPRDT2.Length == 0) { /* _RPRDT2 = DateTime.UtcNow.AddHours(8).Date.AddDays(-DateTime.UtcNow.AddHours(8).Date.Day).AddMonths(1).ToString("yyyy-MM-dd", WGuard1.InvariantCulture); ViewState["RPRDT2"] = _RPRDT2; */ } // 取得關帳日期 _getData = new GetData(); _getData.Query = Query; BPAARecord bpaaRecord = new BPAARecord(); DataTable bpaa = _getData.GetBPAA_BPPYN(_RPPYN); if (bpaa.Rows.Count == 0) { cvMessage.IsValid = false; cvMessage.ErrorMessage = "您目前不在任何專案中,無法使用差勤系統!"; return; } bpaaRecord.FillRecord(bpaa.Rows[0]); // 關帳日期 = bpaaRecord.BPMSD.AddMonths(1).AddDays(-1); 關帳日期 = bpaaRecord.BPMSD; OverTimeToMinute = bpaaRecord.BPOTT == "2"; // 取得上下班時間、午休時間設定資料 上班時間 = WGuard1.WSetR("UNRPARTIME", 1); 下班時間 = WGuard1.WSetR("UNRPARTIME", 2); 午休開始 = WGuard1.WSetR("UNRPARTIME", 3); 午休結束 = WGuard1.WSetR("UNRPARTIME", 4); 上班分鐘數 = TimeCalc.計算分鐘數(上班時間, 下班時間) - TimeCalc.計算分鐘數(午休開始, 午休結束); 午休分鐘數 = TimeCalc.計算分鐘數(午休開始, 午休結束); // 可用時數 if (int.TryParse(WGuard1.WSetR("UNRPARTIME", 5), out 年度事假)) 年度事假 = 年度事假 * 60; else 年度事假 = 112 * 60; if (int.TryParse(WGuard1.WSetR("UNRPARTIME", 6), out 年度病假)) 年度病假 = 年度病假 * 60; else 年度病假 = 240 * 60; GetHours(DateTime.UtcNow.AddHours(8).Date); Search(); } // 查詢按鈕 protected void btnSearch_Click(object sender, EventArgs e) { ViewState["RPRDT1"] = txtRPAR_RPRDT1.Text; ViewState["RPRDT2"] = txtRPAR_RPRDT2.Text; DateTime dt; CheckDate(txtRPAR_RPRDT1.Text, out dt); if (dt.Ticks == 0) _RPRDT1 = ""; else _RPRDT1 = dt.ToString("yyyy-MM-dd", WGuard1.InvariantCulture); CheckDate(txtRPAR_RPRDT2.Text, out dt); if (dt.Ticks == 0) _RPRDT2 = ""; else _RPRDT2 = dt.ToString("yyyy-MM-dd", WGuard1.InvariantCulture); if (_RPRDT1.Length == 0 && _RPRDT2.Length == 0) { lbMessage.Text = GetString("NOSRHCOND"); lbMessage.Visible = true; } else { MultiView1.ActiveViewIndex = 1; Search(); RPARGrid.PageIndex = 0; RPARGrid.SelectedIndex = 0; RPARGrid.DataBind(); } } // 查詢取消按鈕 protected void btnCancel_Click(object sender, EventArgs e) { MultiView1.ActiveViewIndex = 1; } // 查詢動作 private new void Search() { if (MultiView1.ActiveViewIndex == 1) { where = " WHERE RPNUM = '" + UserId + "' "; switch (rparType) { case RPAR_TYPE.T0_請假: WLabel1.Text = GetString("FMRPAR00.NAME"); where += " AND RPTYP LIKE '0%' AND RPADT IS NOT NULL "; RPARForm = RPARForm0; RPARPanel = Panel1; RPARGrid.Columns[3].HeaderText = "開始日期"; (RPARGrid.Columns[3] as BoundField).DataFormatString = "{0:yyyyMMdd}"; RPARGrid.Columns[4].HeaderText = "結束日期"; RPARGrid.Columns[4].Visible = true; RPARGrid.Columns[6].HeaderText = "時數"; RPARGrid.Columns[6].Visible = true; RPARGrid.Columns[7].Visible = false; break; case RPAR_TYPE.T1_加班: WLabel1.Text = GetString("FMRPAR01.NAME"); where += " AND RPTYP LIKE '1%' AND RPADT IS NOT NULL "; RPARForm = RPARForm1; RPARPanel = Panel2; RPARGrid.Columns[3].HeaderText = "日期"; (RPARGrid.Columns[3] as BoundField).DataFormatString = "{0:yyyyMMdd}"; RPARGrid.Columns[4].HeaderText = "日期"; RPARGrid.Columns[4].Visible = false; RPARGrid.Columns[6].HeaderText = "時數"; RPARGrid.Columns[6].Visible = true; RPARGrid.Columns[7].HeaderText = "加班費"; RPARGrid.Columns[7].Visible = true; break; case RPAR_TYPE.T3_出差: WLabel1.Text = GetString("FMRPAR03.NAME"); where += " AND RPTYP LIKE '3%' AND RPADT IS NOT NULL "; RPARForm = RPARForm3; RPARPanel = Panel3; RPARGrid.Columns[3].HeaderText = "開始日期"; (RPARGrid.Columns[3] as BoundField).DataFormatString = "{0:yyyyMMdd}"; RPARGrid.Columns[4].HeaderText = "結束日期"; RPARGrid.Columns[4].Visible = true; RPARGrid.Columns[6].Visible = false; RPARGrid.Columns[7].HeaderText = "差旅費"; RPARGrid.Columns[7].Visible = true; break; } RPARForm.Visible = true; RPARPanel.Visible = true; } StringBuilder sql = new StringBuilder(); sql.Append(select); sql.Append(from); sql.Append(where); dsRPARGrid.SelectParameters.Clear(); DateTime RPRDT1, RPRDT2; CheckDate(_RPRDT1, out RPRDT1); CheckDate(_RPRDT2, out RPRDT2); AddSearch(sql, dsRPARGrid, "RPRDT", RPRDT1, RPRDT2, true); sql.Append(order); dsRPARGrid.SelectCommand = sql.ToString(); dsRPARForm.SelectCommand = select + from + " WHERE RPREN=@RPREN "; gv補休明細.DataBind(); } private new void CalcFields(SqlDataSourceCommandEventArgs e) { string rppyn = _RPPYN; // 藉由人員編號以及日期,找出相應的派遣紀錄,填入相關欄位 // DbCommand cmd = Query.NewCommand("SELECT TOP 1 RAITM, RACNM, RAPYN FROM RASN WHERE RANUM=@RPNUM AND ((RASDT <= @RPRDT AND RAEDT >= @RPRDT) OR (RASDT <= @RPRDT AND RAEDT IS NULL)) ORDER BY RAITM"); DbCommand cmd = Query.NewCommand( @"SELECT TOP 1 RAITM, RACNM, RAPYN FROM RASN WHERE RANUM=@RPNUM AND ((RASDT <= @RPRDT AND RAEDT >= @RPRDT) OR (RASDT <= @RPRDT AND RAEDT IS NULL)) ORDER BY RAITM"); cmd.Parameters.Add(Query.NewParameter("RPNUM", UserId)); cmd.Parameters.Add(Query.NewParameter("RPRDT", e.Command.Parameters["@RPRDT"].Value)); DataTable rasn = Query.Select(cmd); if (rasn.Rows.Count > 0) { e.Command.Parameters["@RAITM"].Value = rasn.Rows[0]["RAITM"]; e.Command.Parameters["@RPCNM"].Value = rasn.Rows[0]["RACNM"]; e.Command.Parameters["@RPPYN"].Value = rasn.Rows[0]["RAPYN"]; rppyn = WQuery.GetStringValue(rasn.Rows[0]["RAPYN"]); } // 電話費、油料費,填入類別 if (rparType.StartsWith("2")) e.Command.Parameters["@RPTYP"].Value = rparType; // 取出計算需要的資料 string rpnum = e.Command.Parameters["@RPNUM"].Value.ToString(); string rptyp = e.Command.Parameters["@RPTYP"].Value.ToString(); int rptct = Convert.ToInt32(e.Command.Parameters["@RPTCT"].Value); int rpftr = Convert.ToInt32(e.Command.Parameters["@RPFTR"].Value); DateTime rprdt = Convert.ToDateTime(e.Command.Parameters["@RPRDT"].Value); DateTime rpedt; GetData calc = new GetData(); calc.Query = Query; int bpsrm; int bpp02; double bpbft; double bpaft; double bphol; string bpovr; string bplve; string bpott; // 取得月薪、伙食津貼、前二加班比率、後二加班比率、假日加班比率、加班費公式、請假扣款公式 calc.GetRASN_Date_Bppyn_Bpeno_Overwork_Rate( rprdt, rppyn, rpnum, out bpsrm, out bpp02, out bpbft, out bpaft, out bphol, out bpovr, out bplve, out bpott); e.Command.Parameters["@RPADT"].Value = DateTime.UtcNow.AddHours(8).Date; e.Command.Parameters["@RPAPN"].Value = "2"; //e.Command.Parameters["@RPANO"].Value = 0; //e.Command.Parameters["@RPAPP"].Value = ""; //e.Command.Parameters["@RPAPD"].Value = DBNull.Value; //e.Command.Parameters["@RPAPU"].Value = ""; string 起時; string 迄時; switch (rparType) { #region 請假 case RPAR_TYPE.T0_請假: // 請假,要計算缺勤扣款與請假時數 // 計算請假時數 rpedt = WDAC.GetDateTimeValue(e.Command.Parameters["@RPEDT"].Value); 起時 = e.Command.Parameters["@RPRTM"].Value.ToString(); 迄時 = e.Command.Parameters["@RPETM"].Value.ToString(); rptct = timeCalc.計算請假總時數(rpnum, rprdt, rpedt, 起時, 迄時, rptyp, bpott == "1"); e.Command.Parameters["@RPTCT"].Value = rptct; // 計算請假扣款 Absent absent = new Absent(); absent.bpsrm = bpsrm; absent.bpp02 = bpp02; absent.Formula = bplve; // e.Command.Parameters["@RPFTR"].Value = absent.Add(rptyp, rptct); e.Command.Parameters["@RPFTR"].Value = absent.Add(rpnum, rptyp, rprdt, rpedt, 起時, 迄時, rprdt, rpedt, bpott == "1"); // 若請假 >= 3 天,要批三關 if (timeCalc.計算請假跨日數(UserId, rprdt, rpedt, rptyp) >= 3) e.Command.Parameters["@RPAPN"].Value = "3"; //e.Command.Parameters["@RPANO"].Value = 1; // 目前第一關 //e.Command.Parameters["@RPAPU"].Value = 簽核人員; break; #endregion #region 加班 case RPAR_TYPE.T1_加班: // 加班,要計算加班費與每個加班時段的時數 // 計算加班時數 起時 = e.Command.Parameters["@RPRTM"].Value.ToString(); 迄時 = e.Command.Parameters["@RPETM"].Value.ToString(); // 將這一天的加班單都取出,重新計算每個加班時段的時數 ExtraWork extraWork = new ExtraWork(); int RPTC1 = 0; int RPTC2 = 0; int RPTC3 = 0; int RPTC4 = 0; int RPTC5 = 0; var rpren = WDAC.GetStringValue(e.Command.Parameters["@RPREN"].Value).Trim(); var oneDayOverTime = rparDao.SelectOverTimeOneDay(rpnum, rprdt); if (string.IsNullOrEmpty(rpren)) { oneDayOverTime.Add(new RPAR { RPREN = "", RPNUM = rpnum, RPTYP = rptyp, RPRDT = rprdt, RPRTM = 起時, RPETM = 迄時 }); } else { var item = oneDayOverTime.FirstOrDefault(p => p.RPREN == rpren); if (item != null) { item.RPRDT = rprdt; item.RPTYP = rptyp; item.RPRTM = 起時; item.RPETM = 迄時; } } var tot = 0; var prev = 0; oneDayOverTime.OrderBy(p => p.RPRTM) .ToList() .ForEach(p => { prev = CalcOverTimeHours(p, ref tot); // 新增或本筆資料 if (p.RPREN == rpren || string.IsNullOrEmpty(p.RPREN)) { rptct = p.RPTCT; RPTC1 = p.RPTC1; RPTC2 = p.RPTC2; RPTC3 = p.RPTC3; RPTC4 = p.RPTC4; RPTC5 = p.RPTC5; } // 更新同日其他加班單資料 else if (p.RPREN != "") { extraWork.Clear(); extraWork.Add(p.RPTYP, p.RPRDT, p.RPTCT, bpsrm, bpp02, bpbft, bpaft, bphol, bpovr, bpott, p.RPTC1, p.RPTC2, p.RPTC3, p.RPTC4, p.RPTC5); rparDao.UpdateOverTimeHours(p.RPREN, p.RPTCT, p.RPTC1, p.RPTC2, p.RPTC3, p.RPTC4, p.RPTC5, extraWork.RPTA1, extraWork.RPTA2, extraWork.RPTA3, extraWork.RPTA4, extraWork.RPTA5); } }); e.Command.Parameters["@RPTCT"].Value = rptct; e.Command.Parameters["@RPTC1"].Value = RPTC1; e.Command.Parameters["@RPTC2"].Value = RPTC2; e.Command.Parameters["@RPTC3"].Value = RPTC3; e.Command.Parameters["@RPTC4"].Value = RPTC4; e.Command.Parameters["@RPTC5"].Value = RPTC5; extraWork.Clear(); extraWork.Add(rptyp, rprdt, rptct, bpsrm, bpp02, bpbft, bpaft, bphol, bpovr, bpott, RPTC1, RPTC2, RPTC3, RPTC4, RPTC5); e.Command.Parameters["@RPTA1"].Value = extraWork.RPTA1; e.Command.Parameters["@RPTA2"].Value = extraWork.RPTA2; e.Command.Parameters["@RPTA3"].Value = extraWork.RPTA3; e.Command.Parameters["@RPTA4"].Value = extraWork.RPTA4; e.Command.Parameters["@RPTA5"].Value = extraWork.RPTA5; e.Command.Parameters["@RPFTR"].Value = extraWork.RPTA1 + extraWork.RPTA2 + extraWork.RPTA3 + extraWork.RPTA4 + extraWork.RPTA5; e.Command.Parameters["@RPUST"].Value = 0; break; #endregion #region 出差 case RPAR_TYPE.T3_出差: rpedt = WDAC.GetDateTimeValue(e.Command.Parameters["@RPEDT"].Value); 起時 = e.Command.Parameters["@RPRTM"].Value.ToString(); 迄時 = e.Command.Parameters["@RPETM"].Value.ToString(); // 20180305 出差時間一律計算至分鐘 rptct = timeCalc.計算差旅時數(rpnum, rprdt, rpedt, 起時, 迄時); e.Command.Parameters["@RPTCT"].Value = rptct; break; #endregion } } /// /// 計算加班時數並分配至各時段 /// /// 加班記錄 /// 累計總時數(分鐘) /// 處理此筆記錄前的累計時數 private int CalcOverTimeHours(RPAR p, ref int tot) { int 處理前累計時數 = tot; var 是休息日 = RPAR_TYPE.休息日加班(p.RPTYP); // 計算本次加班時數 p.RPTCT = timeCalc.計算加班時數(p.RPNUM, p.RPRDT, p.RPRTM, p.RPETM, 是休息日); tot += p.RPTCT; // 使用 ExtraWork.SplitOverTime 分配時段 ExtraWork extraWork = new ExtraWork(); int tc1 = 0; int tc2 = 0; int tc3 = 0; int tc4 = 0; int tc5 = 0; extraWork.SplitOverTime(p.RPTYP, p.RPTCT, tot, out tc1, out tc2, out tc3, out tc4, out tc5); p.RPTC1 = tc1; p.RPTC2 = tc2; p.RPTC3 = tc3; p.RPTC4 = tc4; p.RPTC5 = tc5; return 處理前累計時數; } protected void dsRPARForm_Inserting(object sender, SqlDataSourceCommandEventArgs e) { CalcFields(e); if (e.Cancel) { return; } conn = Query.NewConnection(Query.ConnectionString); conn.Open(); tran = conn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); try { e.Command.Connection = conn; e.Command.Transaction = tran; // 產生新的單號 _RPREN = WGuard1.WNextRen(DateTime.UtcNow.AddHours(8), "RPAR", "RPREN", "YYYYMM<9999>", ""); e.Command.Parameters["@RPREN"].Value = _RPREN; // 請假 if (rparType == "0") { DateTime _RPRDT = WDAC.GetDateTimeValue(e.Command.Parameters["@RPRDT"].Value); int _RPTCT = WDAC.GetInt32Value(e.Command.Parameters["@RPTCT"].Value); string _RPTYP = WDAC.GetStringValue(e.Command.Parameters["@RPTYP"].Value); switch (_RPTYP) { // 補休 case RPAR_TYPE.T00_補休: e.Command.Parameters["@RPDOC"].Value = rparDao.沖補休(tran, _RPREN, UserId, _RPRDT, _RPTCT); break; // 特休 case RPAR_TYPE.T01_特休: ryerDao.沖特休(UserId, _RPRDT.Year, _RPTCT, tran); break; // 事假、家庭照顧假 case RPAR_TYPE.T02_事假: case RPAR_TYPE.T0B_家庭照顧假: if (年度事假 - rparDao.Get已請事假(UserId, _RPRDT, _RPREN) - _RPTCT < 0) e.Command.Parameters["@RPALT"].Value = "可用事假時數不足"; break; // 病假 case RPAR_TYPE.T03_病假: if (年度病假 - rparDao.Get已請病假(UserId, _RPRDT, _RPREN) - _RPTCT < 0) e.Command.Parameters["@RPALT"].Value = "可用病假時數不足"; break; } } // 有上傳附件 if (attachFile1 != null) { File.WriteAllBytes(string.Format("{0}\\{1}{2}", attachPath, _RPREN, attachFileExt1), attachFile1); } if (attachFile2 != null) { File.WriteAllBytes(string.Format("{0}\\{1}_2{2}", attachPath, _RPREN, attachFileExt2), attachFile2); } if (attachFile3 != null) { File.WriteAllBytes(string.Format("{0}\\{1}_3{2}", attachPath, _RPREN, attachFileExt3), attachFile3); } // 送簽 簽核人員 = WDAC.GetStringValue(e.Command.Parameters["@RPAPU"].Value); if (簽核人員.Length > 0) { e.Command.Parameters["@RPANO"].Value = "1"; rpabDao.送簽(tran, _RPREN, e.Command.Parameters["@RPAPN"].Value.ToString(), "1", 簽核人員, UserId); } } catch { tran.Rollback(); tran = null; e.Cancel = true; throw; } } protected void dsRPARForm_Inserted(object sender, SqlDataSourceStatusEventArgs e) { if (tran != null) { tran.Commit(); tran = null; } if (conn != null && conn.State == ConnectionState.Open) { conn.Close(); conn.Dispose(); conn = null; } // 發郵件 發代理人郵件(_RPREN); } protected void dsRPARForm_Updating(object sender, SqlDataSourceCommandEventArgs e) { CalcFields(e); if (e.Cancel) return; conn = Query.NewConnection(Query.ConnectionString); conn.Open(); tran = conn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); try { e.Command.Connection = conn; e.Command.Transaction = tran; _RPREN = WDAC.GetStringValue(e.Command.Parameters["@RPREN"].Value); string 新類別 = WDAC.GetStringValue(e.Command.Parameters["@RPTYP"].Value); DateTime 新日期 = WDAC.GetDateTimeValue(e.Command.Parameters["@RPRDT"].Value); int 新時數 = WDAC.GetInt32Value(e.Command.Parameters["@RPTCT"].Value); // 如果是請假 if (rparType == "0") { // 舊資料如果是補休,要取消沖補休 if (oldRPTYP == RPAR_TYPE.T00_補休) { rparDao.取消沖補休(tran, _RPREN); } // 舊資料如果是特休,要取消沖特休 if (oldRPTYP == RPAR_TYPE.T01_特休) { ryerDao.取消沖特休(tran, _RPREN); } // 新資料如果是補休,要沖補休 if (新類別 == RPAR_TYPE.T00_補休) { e.Command.Parameters["@RPDOC"].Value = rparDao.沖補休(tran, _RPREN, UserId, 新日期, 新時數); } // 新資料如果是特休,要沖特休 if (新類別 == RPAR_TYPE.T01_特休) { ryerDao.沖特休(UserId, 新日期.Year, 新時數, tran); } // 新資料如果是事假或家庭照顧假,要檢查可用事假時數 if (新類別 == RPAR_TYPE.T02_事假 || 新類別 == RPAR_TYPE.T0B_家庭照顧假) { if (年度事假 - rparDao.Get已請事假(UserId, 新日期, _RPREN) - 新時數 < 0) e.Command.Parameters["@RPALT"].Value = "可用事假時數不足"; else e.Command.Parameters["@RPALT"].Value = ""; } // 新資料如果是病假,要檢查可用病假時數 if (新類別 == RPAR_TYPE.T03_病假) { if (年度病假 - rparDao.Get已請病假(UserId, 新日期, _RPREN) - 新時數 < 0) e.Command.Parameters["@RPALT"].Value = "可用病假時數不足"; else e.Command.Parameters["@RPALT"].Value = ""; } } // 要刪除附件 if (attachDelete1) { RparDAC.DeleteAttach1(_RPREN); } if (attachDelete2) { RparDAC.DeleteAttach2(_RPREN); } if (attachDelete3) { RparDAC.DeleteAttach3(_RPREN); } // 有上傳附件 if (attachFile1 != null) { File.WriteAllBytes(string.Format("{0}\\{1}{2}", attachPath, _RPREN, attachFileExt1), attachFile1); } if (attachFile2 != null) { File.WriteAllBytes(string.Format("{0}\\{1}_2{2}", attachPath, _RPREN, attachFileExt2), attachFile2); } if (attachFile3 != null) { File.WriteAllBytes(string.Format("{0}\\{1}_3{2}", attachPath, _RPREN, attachFileExt3), attachFile3); } // 送簽 簽核人員 = WDAC.GetStringValue(e.Command.Parameters["@RPAPU"].Value); if (簽核人員.Length > 0) { e.Command.Parameters["@RPANO"].Value = 1; rpabDao.送簽(tran, _RPREN, e.Command.Parameters["@RPAPN"].Value.ToString(), "1", 簽核人員, UserId); } } catch { tran.Rollback(); tran = null; e.Cancel = true; throw; } } protected void dsRPARForm_Updated(object sender, SqlDataSourceStatusEventArgs e) { if (tran != null) { tran.Commit(); tran = null; } if (conn != null && conn.State == ConnectionState.Open) { conn.Close(); conn.Dispose(); conn = null; } // 發郵件 發代理人郵件(_RPREN); } protected void dsRPARForm_Deleting(object sender, SqlDataSourceCommandEventArgs e) { conn = Query.NewConnection(Query.ConnectionString); conn.Open(); tran = conn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); try { e.Command.Connection = conn; e.Command.Transaction = tran; string oldrpren = WDAC.GetStringValue(e.Command.Parameters["@OLD_RPREN"].Value); oldRPTYP = WDAC.GetStringValue(Query.ExecuteScalar("SELECT RPTYP FROM RPAR WHERE RPREN='" + oldrpren + "'", tran)); // 如果是請假 if (rparType == RPAR_TYPE.T0_請假) { // 舊資料如果是補休,要取消沖補休 if (oldRPTYP == RPAR_TYPE.T00_補休) { rparDao.取消沖補休(tran, oldrpren); } // 舊資料如果是特休,要取消沖特休 if (oldRPTYP == RPAR_TYPE.T01_特休) { ryerDao.取消沖特休(tran, oldrpren); } } else if (rparType == RPAR_TYPE.T1_加班) { // 重新計算當日的加班單 var oldform = rparDao.SelectOne(oldrpren).FirstOrDefault(); if (oldform != null) { ExtraWork extraWork = new ExtraWork(); int bpsrm; int bpp02; double bpbft; double bpaft; double bphol; string bpovr; string bplve; string bpott; GetData calc = new GetData(); calc.Query = Query; // 取得月薪、伙食津貼、前二加班比率、後二加班比率、假日加班比率、加班費公式、請假扣款公式 calc.GetRASN_Date_Bppyn_Bpeno_Overwork_Rate( oldform.RPRDT, oldform.RPPYN, oldform.RPNUM, out bpsrm, out bpp02, out bpbft, out bpaft, out bphol, out bpovr, out bplve, out bpott); var oneDayOverTime = rparDao.SelectOverTimeOneDay(oldform.RPNUM, oldform.RPRDT) .Where(p => p.RPREN != oldrpren) .OrderBy(p => p.RPRTM) .ToList(); var tot = 0; var prev = 0; oneDayOverTime .ForEach(p => { prev = CalcOverTimeHours(p, ref tot); extraWork.Clear(); extraWork.Add(p.RPTYP, p.RPRDT, p.RPTCT, bpsrm, bpp02, bpbft, bpaft, bphol, bpovr, bpott, p.RPTC1, p.RPTC2, p.RPTC3, p.RPTC4, p.RPTC5); rparDao.UpdateOverTimeHours(p.RPREN, p.RPTCT, p.RPTC1, p.RPTC2, p.RPTC3, p.RPTC4, p.RPTC5, extraWork.RPTA1, extraWork.RPTA2, extraWork.RPTA3, extraWork.RPTA4, extraWork.RPTA5); }); } } // 刪除簽核資料 rpabDao.Delete(tran, oldrpren); // 刪除附件 RparDAC.DeleteAttach1(oldrpren); RparDAC.DeleteAttach2(oldrpren); RparDAC.DeleteAttach3(oldrpren); } catch { tran.Rollback(); tran = null; e.Cancel = true; throw; } } protected void dsRPARForm_Deleted(object sender, SqlDataSourceStatusEventArgs e) { if (tran != null) { tran.Commit(); tran = null; } if (conn != null && conn.State == ConnectionState.Open) { conn.Close(); conn.Dispose(); conn = null; } } protected void RPARGrid_DataBound(object sender, EventArgs e) { GridView_DataBound(sender, e); if (RPARGrid.Rows.Count > 0) { if (RPARGrid.SelectedIndex == -1) RPARGrid.SelectedIndex = 0; if (RPARGrid.SelectedIndex > RPARGrid.Rows.Count - 1) RPARGrid.SelectedIndex = RPARGrid.Rows.Count - 1; RPARForm.DataBind(); if (RPARForm.CurrentMode == FormViewMode.ReadOnly) RPABGrid.DataBind(); if (pnlRPAD.Visible) gvRPAD.DataBind(); } } protected void RPARGrid_PageIndexChanged(object sender, EventArgs e) { Search(); RPARGrid.SelectedIndex = 0; RPARGrid.DataBind(); if (RPARForm.CurrentMode == FormViewMode.ReadOnly) RPABGrid.DataBind(); if (pnlRPAD.Visible) gvRPAD.DataBind(); } protected void dsRPARGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) { if (e.AffectedRows == 0) { switch (MultiView1.ActiveViewIndex) { case 0: lbMessage.Text = GetString("NODATA"); lbMessage.Visible = true; break; case 1: RPARForm.ChangeMode(FormViewMode.Insert); RPARForm_ModeChanged(sender, e); break; } } } protected void RPARForm_ItemCommand(object sender, FormViewCommandEventArgs e) { switch (e.CommandName) { case "Insert": case "Edit": break; case "Search": MultiView1.ActiveViewIndex = 0; break; case "Cancel": Search(); RPARForm.ChangeMode(FormViewMode.ReadOnly); RPARForm_ModeChanged(sender, e); break; case "Detail": // 差旅費 pnlRPAD.Visible = !pnlRPAD.Visible; if (pnlRPAD.Visible) { _RPREN = WDAC.GetStringValue(e.CommandArgument); ViewState["RPREN"] = _RPREN; _RPSTP = bpsnDao.GetCurrentSite(UserId); if (_RPSTP.EndsWith("站") || _RPSTP.EndsWith("台")) _RPSTP = _RPSTP.Substring(0, _RPSTP.Length - 1); ViewState["RPSTP"] = _RPSTP; _RPEDP = (RPARForm.FindControl("lbRPAR_RPPLC") as ITextControl).Text; ViewState["RPEDP"] = _RPEDP; txtRPSTP.Text = _RPSTP; txtRPEDP.Text = _RPEDP; _RPDAT = (RPARForm.FindControl("lbRPAR_RPRDT") as ITextControl).Text; ViewState["RPDAT"] = _RPDAT; txtRPDAT.Text = _RPDAT; txtRPF01.Text = "0"; txtRPF02.Text = "0"; txtRPF03.Text = "0"; txtRPF04.Text = "0"; txtRPF05.Text = "0"; txtRPF06.Text = "0"; txtRPF07.Text = "0"; txtRPF08.Text = "0"; txtRPVCH.Text = "0"; txtRPDOC.Text = ""; gvRPAD.DataBind(); } break; case "抽單": RequiredFieldValidator rfvBSENO = RPARForm.FindControl("rfvBSENO") as RequiredFieldValidator; rfvBSENO.Validate(); if (!rfvBSENO.IsValid) return; _RPREN = WDAC.GetStringValue(e.CommandArgument); // 抽單送簽 簽核人員 = ((e.CommandSource as Control).FindControl("ddlBSENO") as DropDownList).SelectedValue; if (簽核人員.Length > 0) { conn = Query.NewConnection(Query.ConnectionString); conn.Open(); tran = conn.BeginTransaction(); try { rparDao.抽單(tran, _RPREN, 簽核人員); rpabDao.抽單(tran, _RPREN, 簽核人員, UserId); tran.Commit(); } catch { tran.Rollback(); throw; } finally { conn.Close(); conn.Dispose(); conn = null; tran = null; } 發抽單通知郵件(_RPREN); RPARForm.DataBind(); RPABGrid.DataBind(); } break; case "取消抽單": _RPREN = WDAC.GetStringValue(e.CommandArgument); conn = Query.NewConnection(Query.ConnectionString); conn.Open(); tran = conn.BeginTransaction(); try { string 前關人員; string 前關關卡; DateTime 前關日期; string 前關結果; string 前關應簽; 前關人員 = rpabDao.取消抽單(tran, _RPREN, out 前關關卡, out 前關日期, out 前關結果, out 前關應簽); rparDao.取消抽單(tran, _RPREN, 前關應簽, 前關關卡, 前關結果, 前關日期, 前關人員); tran.Commit(); } catch { tran.Rollback(); throw; } finally { conn.Close(); conn.Dispose(); conn = null; tran = null; } RPARForm.DataBind(); RPABGrid.DataBind(); break; } } protected void RPARForm_ModeChanged(object sender, EventArgs e) { switch (RPARForm.CurrentMode) { case FormViewMode.ReadOnly: RPARGrid.Visible = true; RPARGrid.DataBind(); if (RPARGrid.Rows.Count > 0) { if (RPARGrid.SelectedIndex == -1) { RPARGrid.SelectedIndex = 0; } if (OldMode == FormViewMode.Insert) { RPARGrid.PageIndex = 0; // RPARGrid.PageIndex = RPARGrid.PageCount - 1; RPARGrid.DataBind(); RPARGrid.SelectedIndex = 0; // RPARGrid.SelectedIndex = RPARGrid.Rows.Count - 1; } RPARGrid.DataBind(); RPARForm.DataBind(); if (pnlRPAD.Visible) gvRPAD.DataBind(); } RPABGrid.Visible = true; break; case FormViewMode.Edit: RPARGrid.Visible = false; pnlRPAD.Visible = false; RPABGrid.Visible = false; break; case FormViewMode.Insert: RPARGrid.Visible = false; pnlRPAD.Visible = false; RPABGrid.Visible = false; break; } } protected void RPARForm_ModeChanging(object sender, FormViewModeEventArgs e) { OldMode = (sender as FormView).CurrentMode; } private void GetHours(DateTime rprdt) { 可用補休 = rparDao.Get可用補休(UserId, rprdt); 可用特休 = ryerDao.Get可用特休(UserId, rprdt.Year, rprdt.Month, rprdt.Day); if (OverTimeToMinute) lb可用補休.Text = (可用補休 / 60).ToString() + ":" + (可用補休 - 可用補休 / 60 * 60).ToString(); else lb可用補休.Text = (可用補休 / 60).ToString(); lb可用特休.Text = (可用特休 / 60).ToString(); 可用事假 = 年度事假 - rparDao.Get已請事假(UserId, rprdt, ""); 可用病假 = 年度病假 - rparDao.Get已請病假(UserId, rprdt, ""); if (可用事假 < 0) 可用事假 = 0; if (可用病假 < 0) 可用病假 = 0; lb剩餘事假.Text = (可用事假 / 60).ToString(); lb剩餘病假.Text = (可用病假 / 60).ToString(); } protected void RPARForm_DataBound(object sender, EventArgs e) { switch (RPARForm.CurrentMode) { case FormViewMode.Edit: (RPARForm.FindControl("lbRPAR_RPNUM") as ITextControl).Text = UserId; (RPARForm.FindControl("lbRPAR_RPNUMX") as ITextControl).Text = UserName; RegisterCalendarEvent(RPARForm, "btnRPAR_RPRDT_DATE", "txtRPAR_RPRDT"); RegisterCalendarEvent(RPARForm, "btnRPAR_RPEDT_DATE", "txtRPAR_RPEDT"); RegisterLookupEvent(RPARForm, "btnRPAR_RPAGT_WQRY", "txtRPAR_RPAGT", "txtRPAR_RPAGT,txtRPAR_RPAGM", "BPSNEML", "EXISTS (SELECT RANUM FROM RASN WHERE RAPYN='" + _RPPYN + "' AND RANUM=BPENO)", false); SetClientFocus(RPARForm, "txtRPAR_RPRDT"); break; case FormViewMode.Insert: (RPARForm.FindControl("lbRPAR_RPNUM") as ITextControl).Text = UserId; (RPARForm.FindControl("lbRPAR_RPNUMX") as ITextControl).Text = UserName; RegisterCalendarEvent(RPARForm, "btnRPAR_RPRDT_DATE", "txtRPAR_RPRDT"); RegisterCalendarEvent(RPARForm, "btnRPAR_RPEDT_DATE", "txtRPAR_RPEDT"); RegisterLookupEvent(RPARForm, "btnRPAR_RPAGT_WQRY", "txtRPAR_RPAGT", "txtRPAR_RPAGT,txtRPAR_RPAGM", "BPSNEML", "EXISTS (SELECT RANUM FROM RASN WHERE RAPYN='" + _RPPYN + "' AND RANUM=BPENO)", false); switch (rparType) { case RPAR_TYPE.T0_請假: var RPRTM = RPARForm.FindControl("RPRTM") as utility_TimeInput; var RPETM = RPARForm.FindControl("RPETM") as utility_TimeInput; if (RPRTM != null) RPRTM.Time = 上班時間; if (RPETM != null) RPETM.Time = 下班時間; break; case RPAR_TYPE.T1_加班: var RPDOC = RPARForm.FindControl("txtRPAR_RPDOC") as ITextControl; if (RPDOC != null) RPDOC.Text = "平日辦公室內"; break; case RPAR_TYPE.T3_出差: //(RPARForm.FindControl("txtRPAR_RPFTR") as ITextControl).Text = "0"; break; } SetClientFocus(RPARForm, "txtRPAR_RPNUM"); break; case FormViewMode.ReadOnly: _RPREN = WDAC.GetStringValue(RPARForm.DataKey["RPREN"]); ViewState["RPREN"] = _RPREN; if (rparType == RPAR_TYPE.T3_出差 && pnlRPAD.Visible) { // 帶入差旅地點 _RPEDP = (RPARForm.FindControl("lbRPAR_RPPLC") as ITextControl).Text; ViewState["RPEDP"] = _RPEDP; txtRPEDP.Text = _RPEDP; // 帶入差旅日期 _RPDAT = (RPARForm.FindControl("lbRPAR_RPRDT") as ITextControl).Text; ViewState["RPDAT"] = _RPDAT; txtRPDAT.Text = _RPDAT; txtRPVCH.Text = "0"; } break; } GetHours(DateTime.UtcNow.AddHours(8).Date); } protected void RPARGrid_RowDataBound(object sender, GridViewRowEventArgs e) { SetGridViewMouseBehavier(RPARGrid, e.Row); //GridView_RowDataBound_Shrink_ViewState(sender, e); } protected void RPARGrid_SelectedIndexChanged(object sender, EventArgs e) { foreach (GridViewRow row in RPARGrid.Rows) SetGridViewMouseBehavier(RPARGrid, row); if (pnlRPAD.Visible) gvRPAD.DataBind(); // pnlRPAD.Visible = false; } protected new bool CheckInput(System.Collections.Specialized.IOrderedDictionary values) { cvMessage.ErrorMessage = ""; cvMessage.IsValid = true; //BhrdDAC bhrd = new BhrdDAC(); bool result = true; string rptyp = WDAC.GetStringValue(values["RPTYP"]); string rpren = WDAC.GetStringValue(values["RPREN"]); int rptct = 0; switch (rparType) { case RPAR_TYPE.T0_請假: // 請假 values["RPRDT"] = CheckDate(values["RPRDT"], "請輸入正確的開始日期", ref result, cvMessage); values["RPEDT"] = CheckDate(values["RPEDT"], "請輸入正確的結束日期", ref result, cvMessage); DateTime sdt = WDAC.GetDateTimeValue(values["RPRDT"]); DateTime edt = WDAC.GetDateTimeValue(values["RPEDT"]); string stm = WDAC.GetStringValue(values["RPRTM"]); string etm = WDAC.GetStringValue(values["RPETM"]); // 關帳 if (!CheckCloseAccount(sdt, edt)) { result = false; cvMessage.ErrorMessage += "此月份已關帳,不可輸入單據"; cvMessage.IsValid = false; } // 日期 if (sdt > edt) { result = false; cvMessage.ErrorMessage += "開始日期 不可大於 結束日期"; cvMessage.IsValid = false; } // 時間必須輸入 if (stm == "") { result = false; cvMessage.ErrorMessage += "開始時間必須輸入"; cvMessage.IsValid = false; } if (etm == "") { result = false; cvMessage.ErrorMessage += "結束時間必須輸入"; cvMessage.IsValid = false; } if (sdt == edt && stm.CompareTo(etm) > 0) { result = false; cvMessage.ErrorMessage += "開始時間必須早於結束時間"; cvMessage.IsValid = false; } // 假日,檢查頭尾是否為假日,但是產假不用檢查 if (rptyp != RPAR_TYPE.T05_產假 && bhrdDao.IsHoliday(UserId, sdt)) { result = false; cvMessage.ErrorMessage += String.Format("{0:yyyy-MM-dd} 是假日,不需請假。", sdt); cvMessage.IsValid = false; } if (rptyp != RPAR_TYPE.T05_產假 && bhrdDao.IsHoliday(UserId, edt)) { result = false; cvMessage.ErrorMessage += String.Format("{0:yyyy-MM-dd} 是假日,不需請假。", edt); cvMessage.IsValid = false; } /* while (sdt <= edt) { if (bhrdDao.IsHoliday(sdt)) { result = false; cvMessage.ErrorMessage += String.Format("{0:yyyy-MM-dd} 是假日,不需請假。", sdt); cvMessage.IsValid = false; } sdt = sdt.AddDays(1); } */ // 計算時數 rptct = timeCalc.計算請假總時數(UserId, sdt, edt, stm, etm, rptyp, !OverTimeToMinute); // 補休時數不足 if (rptyp == RPAR_TYPE.T00_補休 && rparDao.Get可用補休(UserId, sdt) < rptct) { result = false; cvMessage.ErrorMessage += "補休時數不足!"; cvMessage.IsValid = false; } // 特休時數不足 if (rptyp == RPAR_TYPE.T01_特休 && ryerDao.Get可用特休(UserId, sdt.Year, sdt.Month, sdt.Day) < rptct) { result = false; cvMessage.ErrorMessage += "特休時數不足!"; cvMessage.IsValid = false; } // 必須輸入代理人 if (WDAC.GetStringValue(values["RPAGT"]).Trim().Length == 0 || WDAC.GetStringValue(values["RPAGM"]).Trim().Length == 0) { result = false; cvMessage.ErrorMessage += "請輸入代理人!"; cvMessage.IsValid = false; } // 代理人是否請假或差勤的檢查 if (rparDao.代理人不在(WDAC.GetStringValue(values["RPAGT"]), WDAC.GetStringValue(values["RPAGM"]), sdt, edt, stm, etm)) { result = false; cvMessage.ErrorMessage += "代理人請假或差勤,請選擇其他代理人!"; cvMessage.IsValid = false; } // 自己是否是代理人的檢查 var email = bpsnDao.GetEmail(UserId); var 代理人 = rparDao.我是代理人的單據(UserName, email, sdt, edt, stm, etm); if (代理人.Rows.Count > 0) { // 發郵件通知該同仁 var r = 代理人.Rows[0]; 發代理人差假衝突郵件(rpren, rptyp, WDAC.GetStringValue(r["BPEML"]), UserName); // 發郵件通知計畫督導、計畫專員 var 督導 = rparDao.取得督導(rpren); foreach (DataRow r督導 in 督導.Rows) { 發代理人差假衝突郵件給督導( rpren, rptyp, WDAC.GetStringValue(r督導["BPEML"]), UserName, WDAC.GetStringValue(r["BPNME"]), WDAC.GetStringValue(r["BPMB1"]), WDAC.GetStringValue(r["BPMB2"])); } result = false; cvMessage.ErrorMessage += "您這段時間已被指定為職務代理人,無法申請請假,系統已通知相關人員修改代理人!"; cvMessage.IsValid = false; } break; case RPAR_TYPE.T1_加班: // 加班 values["RPRDT"] = CheckDate(values["RPRDT"], "請輸入正確的日期", ref result, cvMessage); DateTime rprdt = Convert.ToDateTime(values["RPRDT"]); stm = WDAC.GetStringValue(values["RPRTM"]); etm = WDAC.GetStringValue(values["RPETM"]); sdt = WDAC.GetDateTimeValue(values["RPRDT"]); // 計算時數 rptct = timeCalc.計算加班時數(UserId, sdt, stm, etm, RPAR_TYPE.休息日加班(rparType)); // 關帳檢查 if (!CheckCloseAccount(rprdt, new DateTime())) { result = false; cvMessage.ErrorMessage += "此月份已關帳,不可輸入單據"; cvMessage.IsValid = false; } // 檢查不可輸入同樣的加班單 if (rparDao.加班單是否重複(WDAC.GetStringValue(values["RPREN"]), WDAC.GetStringValue(values["RPNUM"]), rprdt, null, stm, etm)) { result = false; cvMessage.ErrorMessage += "已輸入相同的加班單"; cvMessage.IsValid = false; } // 時間必須輸入 if (stm == "") { result = false; cvMessage.ErrorMessage += "開始時間必須輸入"; cvMessage.IsValid = false; } if (etm == "") { result = false; cvMessage.ErrorMessage += "結束時間必須輸入"; cvMessage.IsValid = false; } if (stm.CompareTo(etm) > 0) { result = false; cvMessage.ErrorMessage += "開始時間必須早於結束時間"; cvMessage.IsValid = false; } // 計算加班時數 //string boptt = new BpaaDAC(Query).GetOverTimeType(_RPPYN); //rptct = timeCalc.計算加班時數(UserId, rprdt, stm, etm, rptyp == "13" || rptyp == "14"); if (RPAR_TYPE.休息日加班(rptyp)) { // 檢查休息日加班 string message; if (!rparDao.檢查休息日加班(UserId, rprdt, rpren, out message)) { result = false; cvMessage.ErrorMessage = message; cvMessage.IsValid = false; } } // 全月加班時數限制 46 小時 var ot_time = rparDao.Select當月加班時數(rprdt, UserId, rpren) + rptct; if (ot_time > 46 * 60) { result = false; cvMessage.ErrorMessage = "加班日的同月加班時數已超過 46 小時"; cvMessage.IsValid = false; } //if (rptct < 0) //{ // result = false; // cvMessage.ErrorMessage = "結束時間不可早於開始時間"; // cvMessage.IsValid = false; //} /* if (!bhrd.IsHoliday(Convert.ToDateTime(values["RPRDT"]))) { if (Convert.ToInt32(values["RPTCT"]) > 4) { result = false; cvMessage.ErrorMessage += "平日加班不可超過 4 小時"; cvMessage.IsValid = false; } } else { if (Convert.ToInt32(values["RPTCT"]) > 8) { result = false; cvMessage.ErrorMessage += "假日加班不可超過 8 小時"; cvMessage.IsValid = false; } } */ break; case RPAR_TYPE.T21_電話費: // 電話費 case RPAR_TYPE.T22_油料費: // 油料費 values["RPRDT"] = CheckDate(values["RPRDT"].ToString() + "01", "請輸入正確的年月", ref result, cvMessage); break; case RPAR_TYPE.T3_出差: // 差旅 values["RPRDT"] = CheckDate(values["RPRDT"], "請輸入正確的開始日期", ref result, cvMessage); values["RPEDT"] = CheckDate(values["RPEDT"], "請輸入正確的結束日期", ref result, cvMessage); sdt = WDAC.GetDateTimeValue(values["RPRDT"]); edt = WDAC.GetDateTimeValue(values["RPEDT"]); stm = WDAC.GetStringValue(values["RPRTM"]); etm = WDAC.GetStringValue(values["RPETM"]); // 關帳檢查 if (!CheckCloseAccount(values["RPRDT"], values["RPEDT"])) { result = false; cvMessage.ErrorMessage += "此月份已關帳,不可輸入單據"; cvMessage.IsValid = false; } if (Convert.ToDateTime(values["RPRDT"]).CompareTo(values["RPEDT"]) > 0) { result = false; cvMessage.ErrorMessage += "開始日期 不可大於 結束日期"; cvMessage.IsValid = false; } // 時間必須輸入 if (stm == "") { result = false; cvMessage.ErrorMessage += "開始時間必須輸入"; cvMessage.IsValid = false; } if (etm == "") { result = false; cvMessage.ErrorMessage += "結束時間必須輸入"; cvMessage.IsValid = false; } if (sdt == edt && stm.CompareTo(etm) > 0) { result = false; cvMessage.ErrorMessage += "開始時間必須早於結束時間"; cvMessage.IsValid = false; } if (WDAC.GetStringValue(values["RPPLC"]).Trim().Length == 0) { result = false; cvMessage.ErrorMessage += "差旅地點必須輸入"; cvMessage.IsValid = false; } if (WDAC.GetStringValue(values["RPRSN"]).Trim().Length == 0) { result = false; cvMessage.ErrorMessage += "差旅事由必須輸入"; cvMessage.IsValid = false; } // 必須輸入代理人 if (WDAC.GetStringValue(values["RPAGT"]).Trim().Length == 0 || WDAC.GetStringValue(values["RPAGM"]).Trim().Length == 0) { result = false; cvMessage.ErrorMessage += "請輸入代理人!"; cvMessage.IsValid = false; } // 代理人檢查 if (rparDao.代理人不在(WDAC.GetStringValue(values["RPAGT"]), WDAC.GetStringValue(values["RPAGM"]), sdt, edt, 上班時間, 下班時間)) { result = false; cvMessage.ErrorMessage += "代理人請假或差勤,請選擇其他代理人!"; cvMessage.IsValid = false; } // 2017/05/03 修改為代理人當天可以申請差勤 // // 自己是否是代理人的檢查 //email = bpsnDao.GetEmail(UserId); //代理人 = rparDao.我是代理人的單據(UserName, email, sdt, edt, 上班時間, 下班時間); //if (代理人.Rows.Count > 0) //{ // // 發郵件通知該同仁 // var r = 代理人.Rows[0]; // var rpren = WDAC.GetStringValue(r["RPREN"]); // 發代理人差假衝突郵件(rpren, rptyp, WDAC.GetStringValue(r["BPEML"]), UserName); // // 發郵件通知計畫督導、計畫專員 // var 督導 = rparDao.取得督導(rpren); // foreach (DataRow r督導 in 督導.Rows) // { // 發代理人差假衝突郵件給督導( // rpren, // rptyp, // WDAC.GetStringValue(r督導["BPEML"]), // UserName, // WDAC.GetStringValue(r["BPNME"]), // WDAC.GetStringValue(r["BPMB1"]), // WDAC.GetStringValue(r["BPMB2"])); // } // result = false; // cvMessage.ErrorMessage += "您這段時間已被指定為職務代理人,無法申請差勤,系統已通知相關人員修改代理人!"; // cvMessage.IsValid = false; //} break; } string attachErrorMessage; if (!CheckAttachment(out attachErrorMessage)) { result = false; cvMessage.ErrorMessage += attachErrorMessage; cvMessage.IsValid = false; } ProcessCustomValidatorMessage(cvMessage); return result; } protected void RPARForm_ItemInserting(object sender, FormViewInsertEventArgs e) { if (RPARForm.FindControl("ddlRPAR_RPTYP") != null) e.Values["RPTYP"] = (RPARForm.FindControl("ddlRPAR_RPTYP") as DropDownList).SelectedValue; // 抓起始時間與結束時間 /* if (RPARForm.FindControl("ddlSTH") != null) { e.Values["RPRTM"] = (RPARForm.FindControl("ddlSTH") as DropDownList).SelectedValue + ":00"; e.Values["RPETM"] = (RPARForm.FindControl("ddlEDH") as DropDownList).SelectedValue + ":00"; } */ // 簽核人員 if (RPARForm.FindControl("ddlBSENO") != null) e.Values["RPAPU"] = (RPARForm.FindControl("ddlBSENO") as DropDownList).SelectedValue; e.Values["RPNUM"] = UserId; e.Values["RPPYN"] = _RPPYN; // 暫存附件 TempSaveAttachment(); e.Cancel = !CheckInput(e.Values); } protected void RPARForm_ItemUpdating(object sender, FormViewUpdateEventArgs e) { if (RPARForm.FindControl("ddlRPAR_RPTYP") != null) e.NewValues["RPTYP"] = (RPARForm.FindControl("ddlRPAR_RPTYP") as DropDownList).SelectedValue; // 抓起始時間與結束時間 /* if (RPARForm.FindControl("ddlSTH") != null) { e.NewValues["RPRTM"] = (RPARForm.FindControl("ddlSTH") as DropDownList).SelectedValue + ":00"; e.NewValues["RPETM"] = (RPARForm.FindControl("ddlEDH") as DropDownList).SelectedValue + ":00"; } */ e.Cancel = !CheckInput(e.NewValues); // 記住舊類別,以便做請補休假的判斷 oldRPTYP = WDAC.GetStringValue(e.OldValues["RPTYP"]); // 簽核人員 if (RPARForm.FindControl("ddlBSENO") != null) e.NewValues["RPAPU"] = (RPARForm.FindControl("ddlBSENO") as DropDownList).SelectedValue; // 已簽核不可更正 // int rpano = WDAC.GetInt32Value(e.OldValues["RPANO"]); // 20181128 修正,從資料庫抓取最新簽核狀況 var rparItem = rparDao.SelectOne(WDAC.GetStringValue(e.Keys["RPREN"])).FirstOrDefault(); if (rparItem != null) { if (rparItem.RPANO == "D") { e.Cancel = true; cvMessage.IsValid = false; cvMessage.ErrorMessage = "抽單不可更正"; } else { int rpano = WDAC.GetInt32Value(rparItem.RPANO); if (rpano > 1) { e.Cancel = true; cvMessage.IsValid = false; cvMessage.ErrorMessage = "已簽核,不可更正"; } } } // 暫存附件 TempSaveAttachment(); } private void TempSaveAttachment() { var fuRPATH = RPARForm.FindControl("fuRPATH") as FileUpload; var fuRPAT2 = RPARForm.FindControl("fuRPAT2") as FileUpload; var fuRPAT3 = RPARForm.FindControl("fuRPAT3") as FileUpload; if (fuRPATH != null && fuRPATH.HasFile) { attachFileExt1 = Path.GetExtension(fuRPATH.FileName); if (".jpg|.jpeg|.png|.gif|.bmp".Contains(attachFileExt1.ToLower()) && !string.IsNullOrEmpty(attachFileExt1)) { MemoryStream ms = WGuard1.縮圖(fuRPATH.FileContent, 1366, 1366); attachFile1 = new byte[ms.Length]; ms.Position = 0; ms.Read(attachFile1, 0, (int)ms.Length); } else { attachFile1 = new byte[fuRPATH.FileContent.Length]; fuRPATH.FileContent.Read(attachFile1, 0, (int)fuRPATH.FileContent.Length); } } if (fuRPAT2 != null && fuRPAT2.HasFile) { attachFileExt2 = Path.GetExtension(fuRPAT2.FileName); if (".jpg|.jpeg|.png|.gif|.bmp".Contains(attachFileExt2.ToLower()) && !string.IsNullOrEmpty(attachFileExt2)) { MemoryStream ms = WGuard1.縮圖(fuRPAT2.FileContent, 1366, 1366); attachFile2 = new byte[ms.Length]; ms.Position = 0; ms.Read(attachFile2, 0, (int)ms.Length); } else { attachFile2 = new byte[fuRPAT2.FileContent.Length]; fuRPAT2.FileContent.Read(attachFile2, 0, (int)fuRPAT2.FileContent.Length); } } if (fuRPAT3 != null && fuRPAT3.HasFile) { attachFileExt3 = Path.GetExtension(fuRPAT3.FileName); if (".jpg|.jpeg|.png|.gif|.bmp".Contains(attachFileExt3.ToLower()) && !string.IsNullOrEmpty(attachFileExt3)) { MemoryStream ms = WGuard1.縮圖(fuRPAT3.FileContent, 1366, 1366); attachFile3 = new byte[ms.Length]; ms.Position = 0; ms.Read(attachFile3, 0, (int)ms.Length); } else { attachFile3 = new byte[fuRPAT3.FileContent.Length]; fuRPAT3.FileContent.Read(attachFile3, 0, (int)fuRPAT3.FileContent.Length); } } var cbDelAttach1 = RPARForm.FindControl("cbDelAttach1") as CheckBox; var cbDelAttach2 = RPARForm.FindControl("cbDelAttach2") as CheckBox; var cbDelAttach3 = RPARForm.FindControl("cbDelAttach3") as CheckBox; attachDelete1 = cbDelAttach1 != null && cbDelAttach1.Checked; attachDelete2 = cbDelAttach2 != null && cbDelAttach2.Checked; attachDelete3 = cbDelAttach3 != null && cbDelAttach3.Checked; } private bool CheckAttachment(out string errorMessage) { errorMessage = ""; bool result = true; string allowExt = ".jpg|.jpeg|.png|.gif|.bmp|.pdf"; FileUpload fuRPATH = RPARForm.FindControl("fuRPATH") as FileUpload; FileUpload fuRPAT2 = RPARForm.FindControl("fuRPAT2") as FileUpload; FileUpload fuRPAT3 = RPARForm.FindControl("fuRPAT3") as FileUpload; if (fuRPATH != null && fuRPATH.HasFile) { attachFileExt1 = Path.GetExtension(fuRPATH.FileName).ToLower(); if (!allowExt.Contains(attachFileExt1)) { errorMessage = "附件僅接受 JPG, PNG, GIF, BMP, PDF 檔"; result = false; } } if (fuRPAT2 != null && fuRPAT2.HasFile) { attachFileExt2 = Path.GetExtension(fuRPAT2.FileName).ToLower(); if (!allowExt.Contains(attachFileExt2)) { errorMessage = "附件僅接受 JPG, PNG, GIF, BMP, PDF 檔"; result = false; } } if (fuRPAT3 != null && fuRPAT3.HasFile) { attachFileExt3 = Path.GetExtension(fuRPAT3.FileName).ToLower(); if (!allowExt.Contains(attachFileExt3)) { errorMessage = "附件僅接受 JPG, PNG, GIF, BMP, PDF 檔"; result = false; } } return result; } protected void RPARForm_ItemDeleting(object sender, FormViewDeleteEventArgs e) { // 記住舊類別,以便做請補休假的判斷 oldRPTYP = WDAC.GetStringValue(e.Values["RPTYP"]); DateTime rprdt; DateTime rpedt; CheckDate(WDAC.GetStringValue(e.Values["RPRDT"]), out rprdt); CheckDate(WDAC.GetStringValue(e.Values["RPEDT"]), out rpedt); // 刪除前檢查 // 已關帳不可刪除 if (!CheckCloseAccount(rprdt, rpedt)) { e.Cancel = true; cvMessage.IsValid = false; cvMessage.ErrorMessage = "已關帳,不可刪除"; } // 已簽核不可刪除 if (!CanEdit(rprdt, rpedt, e.Values["RPANO"], e.Values["RPAPD"])) { e.Cancel = true; cvMessage.IsValid = false; cvMessage.ErrorMessage = "已簽核,不可刪除"; } } protected void RPARForm_ItemInserted(object sender, FormViewInsertedEventArgs e) { Search(); } protected void RPARForm_ItemUpdated(object sender, FormViewUpdatedEventArgs e) { Search(); } protected void RPARForm_ItemDeleted(object sender, FormViewDeletedEventArgs e) { var keys = e.Keys; // 刪除相關差旅費紀錄 foreach (DictionaryEntry key in keys) { if (WDAC.GetStringValue(key.Key) == "RPREN") { rpadDao.DeleteByRpren(WDAC.GetStringValue(key.Value)); break; } } Search(); RPARGrid.DataBind(); if (RPARGrid.SelectedIndex > RPARGrid.Rows.Count - 1) { RPARGrid.SelectedIndex = RPARGrid.Rows.Count - 1; RPARGrid.DataBind(); } RPARForm.DataBind(); if (pnlRPAD.Visible) gvRPAD.DataBind(); } protected void cvRPTCT_ServerValidate(object source, ServerValidateEventArgs args) { int i; args.IsValid = args.Value != "" && Int32.TryParse(args.Value, out i) && i > 0; } protected void cvRPNUM_ServerValidate(object source, ServerValidateEventArgs args) { args.IsValid = args.Value != "" && bpsnDao.IsExist(args.Value, true); } protected void btnInsertRPAD_Click(object sender, EventArgs e) { //_RPREN = WDAC.GetStringValue(RPARGrid.SelectedValue); //_RPSTP = WDAC.GetStringValue(ViewState["RPSTP"]); //_RPEDP = WDAC.GetStringValue(ViewState["RPEDP"]); cvRPAD.Validate(); if (!cvRPAD.IsValid) return; DateTime rprdt, rpedt, rpdat; CheckDate(txtRPDAT.Text, out rpdat); var c_rprdt = (RPARForm.FindControl("lbRPAR_RPRDT") as ITextControl); var c_rpedt = (RPARForm.FindControl("lbRPAR_RPEDT") as ITextControl); if (c_rprdt != null) CheckDate(c_rprdt.Text, out rprdt); if (c_rpedt != null) CheckDate(c_rpedt.Text, out rpedt); rpadDao.InsertOne(UserId, _RPREN, txtRPSTP.Text, txtRPEDP.Text, WDAC.GetInt32Value(txtRPF01.Text), WDAC.GetInt32Value(txtRPF02.Text), WDAC.GetInt32Value(txtRPF03.Text), WDAC.GetInt32Value(txtRPF04.Text), WDAC.GetInt32Value(txtRPF05.Text), WDAC.GetInt32Value(txtRPF06.Text), WDAC.GetInt32Value(txtRPF07.Text), WDAC.GetInt32Value(txtRPF08.Text), 0, 0, rpdat, txtRPVCH.Text, txtRPDOC.Text); gvRPAD.DataBind(); RPARForm.DataBind(); RPARGrid.DataBind(); txtRPDAT.Text = _RPDAT; //txtRPSTP.Text = ""; //txtRPEDP.Text = ""; txtRPSTP.Text = _RPSTP; txtRPEDP.Text = _RPEDP; txtRPF01.Text = "0"; txtRPF02.Text = "0"; txtRPF03.Text = "0"; txtRPF04.Text = "0"; txtRPF05.Text = "0"; txtRPF06.Text = "0"; txtRPF07.Text = "0"; txtRPF08.Text = "0"; txtRPVCH.Text = "0"; txtRPDOC.Text = ""; } protected void dsRpad_ObjectCreating(object sender, ObjectDataSourceEventArgs e) { e.ObjectInstance = rpadDao; } protected void dsRpad_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) { //_RPREN = WDAC.GetStringValue(ViewState["RPREN"]); //e.InputParameters["rpren"] = _RPREN; } protected void dsRpad_Updated(object sender, ObjectDataSourceStatusEventArgs e) { RPARForm.DataBind(); RPARGrid.DataBind(); } protected void dsRpad_Deleted(object sender, ObjectDataSourceStatusEventArgs e) { RPARForm.DataBind(); RPARGrid.DataBind(); } protected void btnHideRPAD_Click(object sender, EventArgs e) { pnlRPAD.Visible = false; } /// /// 關帳檢查 /// /// 起始日 /// 結束日 /// True=通過檢查, False=不通過檢查 protected bool CheckCloseAccount(object rprdt, object rpedt) { DateTime rdt = WDAC.GetDateTimeValue(rprdt); DateTime edt = WDAC.GetDateTimeValue(rpedt); if (edt.Ticks != 0) return (關帳日期 < rdt && 關帳日期 < edt); else return (關帳日期 < rdt); } /// /// 是否可編輯 /// /// 起始日 /// 結束日 /// 已簽核次數 /// protected bool CanEdit(object rprdt, object rpedt, object rpano, object rpapd) { string ano = WDAC.GetStringValue(rpano); DateTime apd = WDAC.GetDateTimeValue(rpapd); return CheckCloseAccount(rprdt, rpedt) && (ano == "1") && (apd.Ticks == 0); } /// /// 是否可編輯 /// /// 單號 protected bool CanEdit(object rpren) { if (rpren == null) return false; RPARList d = rparDao.SelectOne(WDAC.GetStringValue(rpren)); if (d.Count > 0) return CanEdit(d[0].RPRDT, d[0].RPEDT, d[0].RPANO, d[0].RPAPD); else return false; } /// /// 是否可抽單 /// /// 起始日 /// 結束日 /// 本關關卡數 /// protected bool CanWithdraw(object rprdt, object rpedt, object rpano) { string ano = WDAC.GetStringValue(rpano); return CheckCloseAccount(rprdt, rpedt) && (ano != "D"); } /// /// 是否可抽單 /// /// 單號 protected bool CanWithdraw(object rpren) { if (rpren == null) return false; RPARList d = rparDao.SelectOne(WDAC.GetStringValue(rpren)); if (d.Count > 0) return CanWithdraw(d[0].RPRDT, d[0].RPEDT, d[0].RPANO); else return false; } protected void dsBSGP_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) { e.InputParameters["BSPYN"] = _RPPYN; } protected new string GetBPNME(object RPENO) { string rpeno = WDAC.GetStringValue(RPENO); if (rpeno.Length > 0 && rpeno.Substring(0, 1) == "Z") { return GetLookup("BPAP", rpeno, "BPNME", ""); } else { return GetLookup("BPSN", rpeno, "BPNME", ""); } } private void 發代理人郵件(string _RPREN) { RPARList t = rparDao.SelectOne(_RPREN); if (t.Count > 0) { string 差勤人 = GetLookup("BPSN", t[0].RPNUM, "BPNME"); string 代理人 = t[0].RPAGT; string 代理人電郵 = t[0].RPAGM; string 類別 = t[0].RPTYP; string 起日 = ""; string 迄日 = ""; string 起時 = t[0].RPRTM; string 迄時 = t[0].RPETM; string 備註 = t[0].RPDOC; string 事由 = t[0].RPRSN; int 時數 = t[0].RPTCT; if (t[0].RPRDT.Ticks > 0) 起日 = String.Format("{0:yyyy-MM-dd}", t[0].RPRDT); if (t[0].RPEDT.Ticks > 0) 迄日 = String.Format("{0:yyyy-MM-dd}", t[0].RPEDT); switch (類別.Substring(0, 1)) { // 請假 case RPAR_TYPE.T0_請假: 類別 = "請假"; break; // 差旅 case RPAR_TYPE.T3_出差: 類別 = "差旅"; break; default: return; } // 發送郵件 try { MailMessage mm = new MailMessage(); mm.Subject = String.Format("{1}代理人通知 [單號:{0}]", _RPREN, 類別); mm.To.Add(new MailAddress(代理人電郵)); mm.BodyEncoding = Encoding.UTF8; mm.IsBodyHtml = true; mm.Body = File.ReadAllText(Server.MapPath("~/Template/代理人通知.html")) .Replace("{類別}", 類別) .Replace("{單號}", _RPREN) .Replace("{差勤人}", 差勤人) .Replace("{事由}", 類別 == "請假" ? 事由 : 備註) .Replace("{起日}", 起日) .Replace("{起時}", 起時) .Replace("{迄日}", 迄日) .Replace("{迄時}", 迄時) ; Wellan.Service.WMailSender.GetInstance().Send(mm, string.Format("差勤代理人通知 單號:{0}", _RPREN)); } catch { } } } private void 發抽單通知郵件(string _RPREN) { // 取得這張單子目前的簽核資料 RPARList 單 = rparDao.SelectOne(_RPREN); DataTable 簽核 = rpabDao.SelectRpren(_RPREN); if (單.Count == 0 || 簽核.Rows.Count == 0) return; string 差勤人 = GetLookup("BPSN", 單[0].RPNUM, "BPNME"); string 代理人 = 單[0].RPAGT; string 代理人電郵 = 單[0].RPAGM; string 類別 = 單[0].RPTYP; string 起日 = ""; string 迄日 = ""; string 起時 = 單[0].RPRTM; string 迄時 = 單[0].RPETM; string 備註 = 單[0].RPDOC; string 事由 = 單[0].RPRSN; int 時數 = 單[0].RPTCT; if (單[0].RPRDT.Ticks > 0) 起日 = String.Format("{0:yyyy-MM-dd}", 單[0].RPRDT); if (單[0].RPEDT.Ticks > 0) 迄日 = String.Format("{0:yyyy-MM-dd}", 單[0].RPEDT); bool 要發代理人 = false; switch (類別.Substring(0, 1)) { // 請假 case RPAR_TYPE.T0_請假: 類別 = "請假"; 要發代理人 = true; break; // 加班 case RPAR_TYPE.T1_加班: 類別 = "加班"; break; // 差旅 case RPAR_TYPE.T3_出差: 類別 = "差旅"; 要發代理人 = true; break; default: return; } MailMessage mm = new MailMessage(); mm.Subject = String.Format("{1}單抽單通知 [單號:{0}]", _RPREN, 類別); // 請假、差旅要發給代理人 if (要發代理人) mm.To.Add(new MailAddress(代理人電郵)); // 除了抽單關與第一關之外,其他如果有簽准的都要發抽單通知 foreach (DataRow row in 簽核.Rows) { string rpapp = WDAC.GetStringValue(row["RPAPP"]); string rpano = WDAC.GetStringValue(row["RPANO"]); string rpeno = WDAC.GetStringValue(row["RPENO"]); if (rpapp != "Y" || rpano == "1" || rpano == "D") continue; if (rpeno.ToUpper().StartsWith("Z")) mm.To.Add(new MailAddress(bpapDao.GetEmail(rpeno))); else mm.To.Add(new MailAddress(bpsnDao.GetEmail(rpeno))); } mm.BodyEncoding = Encoding.UTF8; mm.IsBodyHtml = true; mm.Body = File.ReadAllText(Server.MapPath("~/Template/抽單通知.html")) .Replace("{類別}", 類別) .Replace("{單號}", _RPREN) .Replace("{差勤人}", 差勤人) .Replace("{事由}", 事由) .Replace("{起日}", 起日) .Replace("{起時}", 起時) .Replace("{迄日}", 迄日) .Replace("{迄時}", 迄時) ; // mm.Body = String.Format( // @" // // // // // //

{0}單抽單通知

// 您好!通知您以下人員{0}單已由申請人抽單。

// // // // // // //
單號{1}
人員{2}
事由{3}
起始時間{4} {5}
結束時間{6} {7}

// (本郵件由系統自動發送,請勿直接回覆) // //", 類別, _RPREN, 差勤人, 事由, 起日, 起時, 迄日, 迄時); // SmtpClient sc = new SmtpClient(); // 發送郵件 try { Wellan.Service.WMailSender.GetInstance().Send(mm, string.Format("差勤抽單 單號:{0}", _RPREN)); // sc.Send(mm); } catch { } //catch (Exception ex) //{ // WGuard1.WLogFile(Server.MapPath("~/LOG/MailFail_"), WGuard1.WLogType.Day, // string.Format("差勤單號:{0} 錯誤訊息:{1}", _RPREN, ex.Message)); //} //finally //{ // mm.Dispose(); //} } private void 發代理人差假衝突郵件(string _RPREN, string 類別, string 差勤人郵箱, string 代理人) { if (string.IsNullOrEmpty(差勤人郵箱)) return; switch (類別.Substring(0, 1)) { // 請假 case RPAR_TYPE.T0_請假: 類別 = "請假"; break; // 差旅 case RPAR_TYPE.T3_出差: 類別 = "差旅"; break; default: return; } MailMessage mm = new MailMessage(); mm.Subject = String.Format("{1}代理人請假/差旅通知 [單號:{0}]", _RPREN, 類別); mm.To.Add(new MailAddress(差勤人郵箱)); mm.BodyEncoding = Encoding.UTF8; mm.IsBodyHtml = true; mm.Body = File.ReadAllText(Server.MapPath("~/Template/代理人差假通知原差勤人.html")) .Replace("{類別}", 類別) .Replace("{單號}", _RPREN) .Replace("{代理人}", 代理人) ; // 發送郵件 try { Wellan.Service.WMailSender.GetInstance().Send(mm, string.Format("代理人請假/差旅通知 單號:{0}", _RPREN)); } catch { } } private void 發代理人差假衝突郵件給督導(string _RPREN, string 類別, string 督導郵箱, string 代理人, string 差勤人, string 代理人電話1, string 代理人電話2) { if (string.IsNullOrEmpty(督導郵箱)) return; switch (類別.Substring(0, 1)) { // 請假 case RPAR_TYPE.T0_請假: 類別 = "請假"; break; // 差旅 case RPAR_TYPE.T3_出差: 類別 = "差旅"; break; default: return; } MailMessage mm = new MailMessage(); mm.Subject = String.Format("{1}代理人請假/差旅通知 [單號:{0}]", _RPREN, 類別); mm.To.Add(new MailAddress(督導郵箱)); mm.BodyEncoding = Encoding.UTF8; mm.IsBodyHtml = true; mm.Body = File.ReadAllText(Server.MapPath("~/Template/代理人差假通知督導.html")) .Replace("{類別}", 類別) .Replace("{單號}", _RPREN) .Replace("{代理人}", 代理人) .Replace("{差勤人}", 差勤人) .Replace("{代理人電話}", String.Format("{0} {1}", 代理人電話1, 代理人電話2)); ; // 發送郵件 try { Wellan.Service.WMailSender.GetInstance().Send(mm, string.Format("代理人請假/差旅通知督導 單號:{0}", _RPREN)); } catch { } } protected void dsRpad_Updating(object sender, ObjectDataSourceMethodEventArgs e) { DateTime rpdat; CheckDate(WDAC.GetStringValue(e.InputParameters["rpdat"]), out rpdat); e.InputParameters["rpdat"] = rpdat; e.InputParameters["rpf09"] = 0; e.InputParameters["rpf10"] = 0; } protected void dsBPSE_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) { switch (rparType) { case RPAR_TYPE.T1_加班: e.InputParameters["BPTYP"] = "加班"; break; case RPAR_TYPE.T3_出差: e.InputParameters["BPTYP"] = "差旅"; break; } } protected string GetPhraseClientClick(object BPCNT) { string CID = ""; switch (rparType) { case RPAR_TYPE.T1_加班: CID = (RPARForm1.FindControl("txtRPAR_RPDOC") as Control).ClientID; break; case RPAR_TYPE.T3_出差: CID = (RPARForm3.FindControl("txtRPAR_RPDOC") as Control).ClientID; break; } if (CID.Length > 0) return String.Format("javascript:FillMessage(\"{0}\", \"{1}\");return false;", CID, BPCNT); else return "javascript:return false;"; } protected string Get關卡名稱(object RPANO, object RPAPN) { string rpano = WDAC.GetStringValue(RPANO); string rpapn = WDAC.GetStringValue(RPAPN); if (rpano == "1") return "第 1 關"; else if ((rpano == "2" && rpapn == "2") || (rpano == "3" && rpapn == "3")) return "第 2 關"; else if (rpano == "3" && rpapn == "2") return "長官關"; else if (rpano == "D") return "抽單"; else return rpano; } protected void ds補休明細_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) { e.InputParameters["rpnum"] = UserId; e.InputParameters["rprdt"] = DateTime.UtcNow.AddHours(8).Date; } protected string GetAttachLink(string RPREN) { return RparDAC.GetAttachLink(RPREN, Page); } protected void gvRPAD_RowDataBound(object sender, GridViewRowEventArgs e) { //GridView_RowDataBound_Shrink_ViewState(sender, e); } protected void gvRPAD_RowUpdating(object sender, GridViewUpdateEventArgs e) { DateTime rpdat; CheckDate(WDAC.GetStringValue(e.NewValues["RPDAT"]), out rpdat); e.Cancel = !RpadRpdat_Validate(rpdat); } protected void cvRPAD_ServerValidate(object source, ServerValidateEventArgs args) { args.IsValid = true; cvRPAD.ErrorMessage = ""; DateTime rpdat; CheckDate(txtRPDAT.Text, out rpdat); args.IsValid = RpadRpdat_Validate(rpdat); } protected bool RpadRpdat_Validate(DateTime rpdat) { DateTime rprdt, rpedt; var c_rprdt = (RPARForm.FindControl("lbRPAR_RPRDT") as ITextControl); var c_rpedt = (RPARForm.FindControl("lbRPAR_RPEDT") as ITextControl); if (c_rprdt != null) CheckDate(c_rprdt.Text, out rprdt); else rprdt = DateTime.MinValue; if (c_rpedt != null) CheckDate(c_rpedt.Text, out rpedt); else rpedt = DateTime.MinValue; // 檢查 rpdat 在 rprdt 與 rpedt 之間 if (rprdt > DateTime.MinValue && rpdat < rprdt || rpedt > DateTime.MinValue && rpdat > rpedt) { cvRPAD.IsValid = false; cvRPAD.ErrorMessage = "差旅費日期應在開始日期與結束日期之間"; return false; } cvRPAD.IsValid = true; cvRPAD.ErrorMessage = ""; return true; } }