914 lines
34 KiB
C#
914 lines
34 KiB
C#
using System;
|
|
using System.Data;
|
|
using System.Configuration;
|
|
using System.Collections;
|
|
using System.Web;
|
|
using System.Web.Security;
|
|
using System.Web.UI;
|
|
using System.Web.UI.WebControls;
|
|
using System.Web.UI.WebControls.WebParts;
|
|
using System.Web.UI.HtmlControls;
|
|
using System.Data.Common;
|
|
using Wellan.Data;
|
|
using Wellan.Common;
|
|
using System.Text;
|
|
using System.IO;
|
|
using System.Drawing;
|
|
using System.Net.Mail;
|
|
using System.Transactions;
|
|
|
|
/// <summary>
|
|
/// 人員出缺勤紀錄 (員工自行輸入)
|
|
/// 請假處理
|
|
/// 加班處理
|
|
/// 電話費處理
|
|
/// 油料費處理
|
|
/// 差勤處理
|
|
/// </summary>
|
|
public partial class forms_manager_fmRpar : Wellan.Web.UI.WUserControlBase
|
|
{
|
|
private string _RPPYN = "";
|
|
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 ";
|
|
private string from = " FROM RPAR ";
|
|
private FormView RPARForm;
|
|
private Panel RPARPanel;
|
|
private string rparType;
|
|
private BpsnDAC bpsnDao;
|
|
private RparDAC rparDao;
|
|
private DbConnection conn;
|
|
private string oldRPTYP;
|
|
private BhrdDAC bhrdDao;
|
|
private RpadDAC rpadDao;
|
|
private RyerDAC ryerDao;
|
|
private string _RPREN;
|
|
private string _RPSTP;
|
|
private string _RPEDP;
|
|
private GetData _getData;
|
|
private DateTime 關帳日期;
|
|
private int 可用補休;
|
|
private int 可用特休;
|
|
private TimeCalc timeCalc = new TimeCalc();
|
|
private bool 時數計算至小時;
|
|
|
|
public bool 可編輯
|
|
{
|
|
get;
|
|
set;
|
|
}
|
|
|
|
public string 單號
|
|
{
|
|
get { return _RPREN; }
|
|
set { _RPREN = value; }
|
|
}
|
|
|
|
protected void Page_Load(object sender, EventArgs e)
|
|
{
|
|
_RPREN = WDAC.GetStringValue(ViewState["RPREN"]);
|
|
_RPSTP = WDAC.GetStringValue(ViewState["RPSTP"]);
|
|
_RPEDP = WDAC.GetStringValue(ViewState["RPEDP"]);
|
|
//if (IsPostBack)
|
|
//{
|
|
// gvRPAD.DataBind();
|
|
//}
|
|
}
|
|
|
|
protected override void OnInit(EventArgs e)
|
|
{
|
|
base.OnInit(e);
|
|
dsRPARForm.ConnectionString = ConnectionString;
|
|
dsRPAR_RPTYP.ConnectionString = ConnectionString;
|
|
|
|
bpsnDao = new BpsnDAC(Query);
|
|
rparDao = new RparDAC(Query);
|
|
bhrdDao = new BhrdDAC(Query);
|
|
rpadDao = new RpadDAC(Query);
|
|
ryerDao = new RyerDAC(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");
|
|
dsRPAR_RPTYP.SelectParameters["BSCLS"].DefaultValue = rparType + "%";
|
|
_YY = GetIntParam("YY");
|
|
|
|
// 取得時數計算至小時
|
|
_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.BPOTT == "1";
|
|
|
|
// 取得上下班時間、午休時間設定資料
|
|
//上班時間 = WGuard1.WSetR("UNRPARTIME", 1);
|
|
//下班時間 = WGuard1.WSetR("UNRPARTIME", 2);
|
|
//午休開始 = WGuard1.WSetR("UNRPARTIME", 3);
|
|
//午休結束 = WGuard1.WSetR("UNRPARTIME", 4);
|
|
//上班分鐘數 = TimeCalc.計算分鐘數(上班時間, 下班時間) - TimeCalc.計算分鐘數(午休開始, 午休結束);
|
|
//午休分鐘數 = TimeCalc.計算分鐘數(午休開始, 午休結束);
|
|
|
|
// 補休時數
|
|
GetHours(DateTime.UtcNow.AddHours(8).Date);
|
|
|
|
Search();
|
|
}
|
|
|
|
// 查詢動作
|
|
private new void Search()
|
|
{
|
|
switch (rparType)
|
|
{
|
|
case RPAR_TYPE.T0_請假:
|
|
RPARForm = RPARForm0;
|
|
RPARPanel = Panel1;
|
|
break;
|
|
case RPAR_TYPE.T1_加班:
|
|
RPARForm = RPARForm1;
|
|
RPARPanel = Panel2;
|
|
break;
|
|
case RPAR_TYPE.T3_出差:
|
|
RPARForm = RPARForm3;
|
|
RPARPanel = Panel3;
|
|
break;
|
|
}
|
|
RPARForm.Visible = true;
|
|
RPARPanel.Visible = true;
|
|
|
|
dsRPARForm.SelectCommand = select + from + " WHERE RPREN=@RPREN ";
|
|
}
|
|
|
|
private new void CalcFields(SqlDataSourceCommandEventArgs e)
|
|
{
|
|
// 藉由人員編號以及日期,找出相應的派遣紀錄,填入相關欄位
|
|
/*
|
|
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"];
|
|
}
|
|
*/
|
|
|
|
// 電話費、油料費,填入類別
|
|
/*
|
|
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);
|
|
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";
|
|
|
|
string 起時;
|
|
string 迄時;
|
|
switch (rparType)
|
|
{
|
|
case RPAR_TYPE.T0_請假: // 請假,要計算缺勤扣款與請假時數
|
|
// 計算請假時數
|
|
DateTime rpedt = Convert.ToDateTime(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 ((rpedt.Date - rprdt.Date).Days + 1 >= 3)
|
|
e.Command.Parameters["@RPAPN"].Value = "3";
|
|
*/
|
|
break;
|
|
case RPAR_TYPE.T1_加班: // 加班,要計算加班費與前二、後二、假日加班時數
|
|
// 計算加班時數
|
|
起時 = e.Command.Parameters["@RPRTM"].Value.ToString();
|
|
迄時 = e.Command.Parameters["@RPETM"].Value.ToString();
|
|
|
|
rptct = timeCalc.計算加班時數(rpnum, rprdt, 起時, 迄時, RPAR_TYPE.休息日加班(rptyp));
|
|
e.Command.Parameters["@RPTCT"].Value = rptct;
|
|
|
|
// 計算加班費以及前二、後二、假日加班時數
|
|
int RPTC1 = WDAC.GetInt32Value(e.Command.Parameters["@RPTC1"].Value) * 60;
|
|
int RPTC2 = WDAC.GetInt32Value(e.Command.Parameters["@RPTC2"].Value) * 60;
|
|
int RPTC3 = WDAC.GetInt32Value(e.Command.Parameters["@RPTC3"].Value) * 60;
|
|
int RPTC4 = WDAC.GetInt32Value(e.Command.Parameters["@RPTC4"].Value) * 60;
|
|
int RPTC5 = WDAC.GetInt32Value(e.Command.Parameters["@RPTC5"].Value) * 60;
|
|
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;
|
|
if (rptct < RPTC1 + RPTC2 + RPTC3 + RPTC4 + RPTC5)
|
|
{
|
|
cvMessage.IsValid = false;
|
|
cvMessage.ErrorMessage = "各項時數之和 不可大於 加班時數!";
|
|
e.Cancel = true;
|
|
}
|
|
|
|
ExtraWork extraWork = new ExtraWork();
|
|
extraWork.Add(rptyp, rprdt, rptct, bpsrm, bpp02, bpbft, bpaft, bphol, bpovr, bpott, RPTC1, RPTC2, RPTC3, RPTC4, RPTC5);
|
|
e.Command.Parameters["@RPFTR"].Value =
|
|
extraWork.RPTA1 + extraWork.RPTA2 + extraWork.RPTA3 + extraWork.RPTA4 + extraWork.RPTA5;
|
|
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["@RPUST"].Value = 0;
|
|
|
|
break;
|
|
case RPAR_TYPE.T3_出差:
|
|
rpedt = Convert.ToDateTime(e.Command.Parameters["@RPEDT"].Value);
|
|
起時 = e.Command.Parameters["@RPRTM"].Value.ToString();
|
|
迄時 = e.Command.Parameters["@RPETM"].Value.ToString();
|
|
rptct = timeCalc.計算差旅時數(rpnum, rprdt, rpedt, 起時, 迄時);
|
|
e.Command.Parameters["@RPTCT"].Value = rptct;
|
|
break;
|
|
}
|
|
}
|
|
|
|
protected void dsRPARForm_Updating(object sender, SqlDataSourceCommandEventArgs e)
|
|
{
|
|
CalcFields(e);
|
|
if (e.Cancel)
|
|
return;
|
|
|
|
conn = Query.NewConnection(Query.ConnectionString);
|
|
conn.Open();
|
|
tran = conn.BeginTransaction();
|
|
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 == RPAR_TYPE.T0_請假)
|
|
{
|
|
// 舊資料如果是補休,要取消沖補休
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
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;
|
|
}
|
|
}
|
|
|
|
protected void RPARForm_ItemCommand(object sender, FormViewCommandEventArgs e)
|
|
{
|
|
switch (e.CommandName)
|
|
{
|
|
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;
|
|
gvRPAD.DataBind();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
protected void RPARForm_ModeChanged(object sender, EventArgs e)
|
|
{
|
|
switch (RPARForm.CurrentMode)
|
|
{
|
|
case FormViewMode.Edit:
|
|
pnlRPAD.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);
|
|
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.ReadOnly:
|
|
if (rparType == RPAR_TYPE.T3_出差 && pnlRPAD.Visible)
|
|
{
|
|
_RPEDP = (RPARForm.FindControl("lbRPAR_RPPLC") as ITextControl).Text;
|
|
ViewState["RPEDP"] = _RPEDP;
|
|
txtRPEDP.Text = _RPEDP;
|
|
}
|
|
break;
|
|
}
|
|
GetHours(DateTime.UtcNow.AddHours(8).Date);
|
|
}
|
|
|
|
protected new bool CheckInput(System.Collections.Specialized.IOrderedDictionary values)
|
|
{
|
|
cvMessage.ErrorMessage = "";
|
|
cvMessage.IsValid = true;
|
|
//BhrdDAC bhrd = new BhrdDAC();
|
|
string rptyp = WDAC.GetStringValue(values["RPTYP"]);
|
|
string rppyn = WDAC.GetStringValue(values["RPPYN"]);
|
|
string rpnum = WDAC.GetStringValue(values["RPNUM"]);
|
|
string rpren = WDAC.GetStringValue(values["RPREN"]);
|
|
|
|
bool result = true;
|
|
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(rppyn, sdt, edt))
|
|
{
|
|
result = false;
|
|
cvMessage.ErrorMessage += "此月份已關帳,不可輸入單據";
|
|
cvMessage.IsValid = false;
|
|
}
|
|
|
|
// 日期
|
|
if (result && 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;
|
|
}
|
|
|
|
// 計算時數
|
|
int rptct = timeCalc.計算請假總時數(rpnum, sdt, edt, stm, etm, rptyp, 時數計算至小時);
|
|
|
|
// 補休時數不足
|
|
if (rptyp == RPAR_TYPE.T00_補休 && 可用補休 < rptct)
|
|
{
|
|
result = false;
|
|
cvMessage.ErrorMessage += "補休時數不足!";
|
|
cvMessage.IsValid = false;
|
|
}
|
|
|
|
// 特休時數不足
|
|
if (rptyp == RPAR_TYPE.T01_特休 && 可用特休 < rptct)
|
|
{
|
|
result = false;
|
|
cvMessage.ErrorMessage += "特休時數不足!";
|
|
cvMessage.IsValid = false;
|
|
}
|
|
|
|
break;
|
|
case RPAR_TYPE.T1_加班: // 加班
|
|
values["RPRDT"] = CheckDate(values["RPRDT"], "請輸入正確的日期", ref result, cvMessage);
|
|
sdt = WDAC.GetDateTimeValue(values["RPRDT"]);
|
|
edt = WDAC.GetDateTimeValue(values["RPEDT"]);
|
|
stm = WDAC.GetStringValue(values["RPRTM"]);
|
|
etm = WDAC.GetStringValue(values["RPETM"]);
|
|
|
|
// 計算時數
|
|
rptct = timeCalc.計算加班時數(UserId, sdt, stm, etm, RPAR_TYPE.休息日加班(rparType));
|
|
|
|
// 關帳檢查
|
|
if (!CheckCloseAccount(rppyn, values["RPRDT"], new DateTime()))
|
|
{
|
|
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 (RPAR_TYPE.休息日加班(rptyp))
|
|
{
|
|
string message;
|
|
if (!rparDao.檢查休息日加班(rpnum, sdt, rpren, out message))
|
|
{
|
|
result = false;
|
|
cvMessage.ErrorMessage = message;
|
|
cvMessage.IsValid = false;
|
|
}
|
|
}
|
|
|
|
// 全月加班時數限制 46 小時
|
|
var ot_time = rparDao.Select當月加班時數(sdt, UserId, rpren) + rptct;
|
|
if (ot_time > 46 * 60)
|
|
{
|
|
result = false;
|
|
cvMessage.ErrorMessage = "加班日的同月加班時數已超過 46 小時";
|
|
cvMessage.IsValid = false;
|
|
}
|
|
|
|
// 計算加班時數
|
|
//rptct = timeCalc.計算加班時數(rpnum, WDAC.GetDateTimeValue(values["RPRDT"]), stm, etm, false);
|
|
//int 前二 = WDAC.GetInt32Value(values["RPTC1"]) * 60;
|
|
//int 後二 = WDAC.GetInt32Value(values["RPTC2"]) * 60;
|
|
//int 假日 = WDAC.GetInt32Value(values["RPTC3"]) * 60;
|
|
|
|
//if (rptct < 前二 + 後二 + 假日)
|
|
//{
|
|
// result = false;
|
|
// cvMessage.ErrorMessage = "前二時數 + 後二時數 + 假日時數 不可大於 加班時數!";
|
|
// cvMessage.IsValid = false;
|
|
//}
|
|
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(rppyn, values["RPRDT"], values["RPEDT"]))
|
|
{
|
|
result = false;
|
|
cvMessage.ErrorMessage += "此月份已關帳,不可輸入單據";
|
|
cvMessage.IsValid = false;
|
|
}
|
|
|
|
if (result && 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;
|
|
}
|
|
break;
|
|
}
|
|
|
|
ProcessCustomValidatorMessage(cvMessage);
|
|
return result;
|
|
}
|
|
|
|
protected void RPARForm_ItemUpdating(object sender, FormViewUpdateEventArgs e)
|
|
{
|
|
if (RPARForm.FindControl("ddlRPAR_RPTYP") != null)
|
|
e.NewValues["RPTYP"] = (RPARForm.FindControl("ddlRPAR_RPTYP") as DropDownList).SelectedValue;
|
|
|
|
e.Cancel = !CheckInput(e.NewValues);
|
|
|
|
// 記住舊類別,以便做請補休假的判斷
|
|
oldRPTYP = WDAC.GetStringValue(e.OldValues["RPTYP"]);
|
|
}
|
|
|
|
protected void RPARForm_ItemUpdated(object sender, FormViewUpdatedEventArgs e)
|
|
{
|
|
Search();
|
|
}
|
|
|
|
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)
|
|
{
|
|
DateTime rpdat;
|
|
CheckDate(txtRPDAT.Text, out rpdat);
|
|
|
|
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();
|
|
|
|
txtRPDAT.Text = "";
|
|
txtRPSTP.Text = _RPSTP;
|
|
txtRPEDP.Text = _RPEDP;
|
|
txtRPF01.Text = "";
|
|
txtRPF02.Text = "";
|
|
txtRPF03.Text = "";
|
|
txtRPF04.Text = "";
|
|
txtRPF05.Text = "";
|
|
txtRPF06.Text = "";
|
|
txtRPF07.Text = "";
|
|
txtRPF08.Text = "";
|
|
txtRPVCH.Text = "";
|
|
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();
|
|
}
|
|
|
|
protected void dsRpad_Deleted(object sender, ObjectDataSourceStatusEventArgs e)
|
|
{
|
|
RPARForm.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 rppyn, object rprdt, object rpedt)
|
|
{
|
|
DateTime rdt = WDAC.GetDateTimeValue(rprdt);
|
|
DateTime edt = WDAC.GetDateTimeValue(rpedt);
|
|
|
|
_getData = new GetData();
|
|
_getData.Query = Query;
|
|
BPAARecord bpaaRecord = new BPAARecord();
|
|
DataTable bpaa = _getData.GetBPAA_BPPYN(WDAC.GetStringValue(rppyn));
|
|
if (bpaa.Rows.Count == 0)
|
|
{
|
|
return false;
|
|
}
|
|
bpaaRecord.FillRecord(bpaa.Rows[0]);
|
|
// 關帳日期 = bpaaRecord.BPMSD.AddMonths(1).AddDays(-1);
|
|
關帳日期 = bpaaRecord.BPMSD;
|
|
|
|
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 rppyn, object rprdt, object rpedt, object rpano, object rpapd)
|
|
{
|
|
string ano = WDAC.GetStringValue(rpano);
|
|
DateTime apd = WDAC.GetDateTimeValue(rpapd);
|
|
return CheckCloseAccount(rppyn, 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].RPPYN, d[0].RPRDT, d[0].RPEDT, d[0].RPANO, d[0].RPAPD);
|
|
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", "");
|
|
}
|
|
}
|
|
|
|
protected void gvRPAD_DataBound(object sender, EventArgs e)
|
|
{
|
|
//btnInsertRPAD.Enabled = CanEdit(RPARGrid.SelectedValue);
|
|
}
|
|
|
|
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 dsRPARForm_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
|
|
{
|
|
e.Command.Parameters["RPREN"].Value = _RPREN;
|
|
}
|
|
|
|
protected string GetAttachLink(string RPREN)
|
|
{
|
|
return RparDAC.GetAttachLink(RPREN, Page);
|
|
//string f = string.Format("{0}\\{1}.jpg", Server.MapPath("~/UploadedPicture/RPAR_ATTACHMENT"), RPREN);
|
|
|
|
//if (File.Exists(f))
|
|
// return string.Format("<a href='{0}{1}.jpg' target='_blank'>附件檢視</a>",
|
|
// ResolveClientUrl("~/UploadedPicture/RPAR_ATTACHMENT/"), RPREN);
|
|
//else
|
|
// return "無附件";
|
|
}
|
|
}
|