2469 lines
91 KiB
C#
2469 lines
91 KiB
C#
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;
|
|
|
|
/// <summary>
|
|
/// 人員出缺勤紀錄 (員工自行輸入)
|
|
/// 請假處理
|
|
/// 加班處理
|
|
/// 電話費處理
|
|
/// 油料費處理
|
|
/// 差勤處理
|
|
/// </summary>
|
|
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
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 計算加班時數並分配至各時段
|
|
/// </summary>
|
|
/// <param name="p">加班記錄</param>
|
|
/// <param name="tot">累計總時數(分鐘)</param>
|
|
/// <returns>處理此筆記錄前的累計時數</returns>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 關帳檢查
|
|
/// </summary>
|
|
/// <param name="rprdt">起始日</param>
|
|
/// <param name="rpedt">結束日</param>
|
|
/// <returns>True=通過檢查, False=不通過檢查</returns>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 是否可編輯
|
|
/// </summary>
|
|
/// <param name="rprdt">起始日</param>
|
|
/// <param name="rpedt">結束日</param>
|
|
/// <param name="rpano">已簽核次數</param>
|
|
/// <returns></returns>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 是否可編輯
|
|
/// </summary>
|
|
/// <param name="rpren">單號</param>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 是否可抽單
|
|
/// </summary>
|
|
/// <param name="rprdt">起始日</param>
|
|
/// <param name="rpedt">結束日</param>
|
|
/// <param name="rpapn">本關關卡數</param>
|
|
/// <returns></returns>
|
|
protected bool CanWithdraw(object rprdt, object rpedt, object rpano)
|
|
{
|
|
string ano = WDAC.GetStringValue(rpano);
|
|
return CheckCloseAccount(rprdt, rpedt) && (ano != "D");
|
|
}
|
|
|
|
/// <summary>
|
|
/// 是否可抽單
|
|
/// </summary>
|
|
/// <param name="rpren">單號</param>
|
|
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(
|
|
// @"<html>
|
|
//<head>
|
|
// <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
|
|
// <style type='text/css'>
|
|
// body {{ font-family: Arial, Tahoma; font-size:12pt; }}
|
|
// table {{ background-color: #D1DDF1; width:600px; }}
|
|
// th {{ color:white; background-color: #507CD1; width:100px }}
|
|
// </style>
|
|
//</head>
|
|
//<body>
|
|
// <h3>{0}單抽單通知</h3>
|
|
// 您好!通知您以下人員{0}單已由申請人抽單。<br><br>
|
|
// <table border='1' cellpadding='4' cellspacing='0'>
|
|
// <tr><th>單號</th><td>{1}</td></tr>
|
|
// <tr><th>人員</th><td>{2}</td></tr>
|
|
// <tr><th>事由</th><td>{3}</td></tr>
|
|
// <tr><th>起始時間</th><td>{4} {5}</td></tr>
|
|
// <tr><th>結束時間</th><td>{6} {7}</td></tr>
|
|
// </table><br>
|
|
// (本郵件由系統自動發送,請勿直接回覆)
|
|
//</body>
|
|
//</html>", 類別, _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;
|
|
}
|
|
}
|