using System;
using System.Data;
using System.Configuration;
using System.Data.Common;
using System.Collections;
using System.Collections.Generic;
using Wellan.Data;
using Wellan.Common;
using System.Transactions;
using System.ComponentModel;
using System.Text;
using System.IO;
using System.Web;
using System.Linq;
using System.Web.UI;
///
/// 人員請假、加班、出差紀錄
///
[DataObject]
public class RparDAC : Wellan.Data.WDAC
{
//private string _tableName = "RPAR";
//private string _select =
// @"SELECT TRDAT, TRMOD, TRUSR, RPREN, RPNUM, RAITM, RPCNM, RPPYN, RPRDT, RPEDT,
// RPTYP, RPTCT, RPFTR, RPDOC, APPNO, RPADT, RPAPN, RPANO, RPAPP, RPAPD,
// RPAPU, RPAGT, RPRTM, RPETM, RPUST, RPTC1, RPTC2, RPTC3, RPRSN, RPAGM,
// RPPLC ";
//private string _insert =
// @" TRDAT, TRMOD, TRUSR, RPREN, RPNUM, RAITM, RPCNM, RPPYN, RPRDT, RPEDT,
// RPTYP, RPTCT, RPFTR, RPDOC, APPNO, RPADT, RPAPN, RPANO, RPAPP, RPAPD,
// RPAPU, RPAGT, RPRTM, RPETM, RPUST, RPTC1, RPTC2, RPTC3, RPRSN, RPAGM,
// RPPLC ";
//private string _insertValue =
// @" @TRDAT, @TRMOD, @TRUSR, @RPREN, @RPNUM, @RAITM, @RPCNM, @RPPYN, @RPRDT, @RPEDT,
// @RPTYP, @RPTCT, @RPFTR, @RPDOC, @APPNO, @RPADT, @RPAPN, @RPANO, @RPAPP, @RPAPD,
// @RPAPU, @RPAGT, @RPRTM, @RPETM, @RPUST, @RPTC1, @RPTC2, @RPTC3, @RPRSN, @RPAGM,
// @RPPLC ";
//private string _from = " from RPAR ";
//private string _where = " where 1=1 ";
//private string _order = " order by RPREN ";
private string 補休類別Where = " (RPTYP = '11' OR RPTYP = '13' OR RPTYP = '15') ";
private string 事假類別Where = " (RPTYP = '02' OR RPTYP = '0B') ";
private string 病假類別Where = " (RPTYP = '03') ";
public RparDAC()
{
}
public RparDAC(string connectionConfig, string connectionConfigName)
: this()
{
this._connectionConfig = connectionConfig;
this._connectionConfigName = connectionConfigName;
}
public RparDAC(WQuery query)
{
this._query = query;
}
/*
public DataTable SelectOne(string rpren)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"SELECT TRDAT, TRMOD, TRUSR, RPREN, RPNUM, RAITM, RPCNM, RPPYN, RPRDT, RPEDT,
RPTYP, RPTCT / 60 AS RPTCT, RPFTR, RPDOC, APPNO, RPAPP, RPAPD, RPAPU,
RPADT, RPAPN, RPANO, RPAGT, RPRTM, RPETM, RPUST, RPTC1 / 60 AS RPTC1,
RPTC2 / 60 AS RPTC2, RPTC3 / 60 AS RPTC3, RPRSN, RPAGM, RPPLC
FROM RPAR WHERE RPREN=@RPREN";
AddParam(cmd, "RPREN", rpren);
return Query.Select(cmd);
}
*/
[DataObjectMethod(DataObjectMethodType.Select)]
public RPARList SelectOne(String RPREN)
{
RPARList result = new RPARList();
IDataList list = result as IDataList;
DbCommand cmdSelect = Query.NewCommand();
cmdSelect.CommandText =
@"SELECT
RPREN, RPNUM, RAITM, RPCNM, RPPYN, RPRDT, RPEDT, RPTYP, RPFTR, RPDOC,
APPNO, RPADT, RPAPN, RPANO, RPAPP, RPAPD, RPAPU, RPAGT, RPAGM, RPRTM,
RPETM, RPUST, RPRSN, RPPLC, RPFPC, RPFAD, RPKMS, TRDAT, TRMOD, TRUSR,
CAST(RPTCT AS INT) / 60 AS RPTCT,
ISNULL(CAST(RPTCT AS INT) % 60, 0) AS RPTMT,
ISNULL(RPTC1, 0) / 60 AS RPTC1,
ISNULL(RPTC1, 0) % 60 AS RPTM1,
ISNULL(RPTC2, 0) / 60 AS RPTC2,
ISNULL(RPTC2, 0) % 60 AS RPTM2,
ISNULL(RPTC3, 0) / 60 AS RPTC3,
ISNULL(RPTC3, 0) % 60 AS RPTM3,
ISNULL(RPTC4, 0) / 60 AS RPTC4,
ISNULL(RPTC4, 0) % 60 AS RPTM4,
ISNULL(RPTC5, 0) / 60 AS RPTC5,
ISNULL(RPTC5, 0) % 60 AS RPTM5
FROM RPAR WHERE RPREN=@RPREN";
AddParam(cmdSelect, "RPREN", RPREN);
Query.Select(cmdSelect, ref list);
return result;
}
///
/// 取出某人某天的加班單
///
///
///
///
[DataObjectMethod(DataObjectMethodType.Select)]
public RPARList SelectOverTimeOneDay(String RPNUM, DateTime RPRDT)
{
RPARList result = new RPARList();
IDataList list = result as IDataList;
DbCommand cmdSelect = Query.NewCommand();
cmdSelect.CommandText =
@"SELECT
RPREN, RPNUM, RAITM, RPCNM, RPPYN, RPRDT, RPEDT, RPTYP, RPFTR, RPDOC,
APPNO, RPADT, RPAPN, RPANO, RPAPP, RPAPD, RPAPU, RPAGT, RPAGM, RPRTM,
RPETM, RPUST, RPRSN, RPPLC, RPFPC, RPFAD, RPKMS, TRDAT, TRMOD, TRUSR,
RPTCT, RPTC1, RPTC2, RPTC3, RPTC4, RPTC5, 0 RPTMT, 0 RPTM1, 0 RPTM2, 0 RPTM3, 0 RPTM4, 0 RPTM5
FROM RPAR
WHERE RPNUM=@RPNUM
AND RPRDT=@RPRDT
AND RPTYP LIKE '1%'
AND ((RPAPN IS NOT NULL AND RPAPN<>'D' AND (RPAPP IS NULL OR RPAPP<>'N')) OR (RPAPN IS NULL))
ORDER BY RPRTM";
AddParam(cmdSelect, "RPNUM", RPNUM);
AddParam(cmdSelect, "RPRDT", RPRDT);
Query.Select(cmdSelect, ref list);
return result;
}
///
/// 更新加班時數
///
///
///
///
///
///
public void UpdateOverTimeHours(string RPREN, int RPTCT, int RPTC1, int RPTC2, int RPTC3, int RPTC4, int RPTC5,
int RPTA1, int RPTA2, int RPTA3, int RPTA4, int RPTA5)
{
DbCommand cmdUpdate = Query.NewCommand();
cmdUpdate.CommandText =
@"UPDATE RPAR SET RPTCT=@RPTCT, RPTC1=@RPTC1, RPTC2=@RPTC2, RPTC3=@RPTC3, RPTC4=@RPTC4, RPTC5=@RPTC5,
RPFTR=@RPFTR, RPTA1=@RPTA1, RPTA2=@RPTA2, RPTA3=@RPTA3, RPTA4=@RPTA4, RPTA5=@RPTA5
WHERE RPREN=@RPREN";
AddParam(cmdUpdate, "RPREN", RPREN);
AddParam(cmdUpdate, "RPTCT", RPTCT);
AddParam(cmdUpdate, "RPTC1", RPTC1);
AddParam(cmdUpdate, "RPTC2", RPTC2);
AddParam(cmdUpdate, "RPTC3", RPTC3);
AddParam(cmdUpdate, "RPTC4", RPTC4);
AddParam(cmdUpdate, "RPTC5", RPTC5);
AddParam(cmdUpdate, "RPFTR", RPTA1 + RPTA2 + RPTA3 + RPTA4 + RPTA5);
AddParam(cmdUpdate, "RPTA1", RPTA1);
AddParam(cmdUpdate, "RPTA2", RPTA2);
AddParam(cmdUpdate, "RPTA3", RPTA3);
AddParam(cmdUpdate, "RPTA4", RPTA4);
AddParam(cmdUpdate, "RPTA5", RPTA5);
Query.ExecuteNonQuery(cmdUpdate);
}
/// 員工編號
/// 請假日期
///
public int Get可用補休(string rpnum, DateTime rprdt)
{
// 取得補休補登的可用時數
RbsaDAC rbsaDao = new RbsaDAC(Query);
// 取得員工在請假日期所在專案的補休期限設定
int otd = new GetData(Query).GetBPOTD_DATE_BPENO(rprdt, rpnum);
// 取得加班補休的可用時數
DbCommand cmd = Query.NewCommand();
cmd.CommandText = String.Format(@"
SELECT SUM(RPTCT - ISNULL(RPUST, 0))
FROM RPAR
WHERE RPNUM = @RPNUM
AND {0}
AND RPRDT >= @RPRDT
AND ((RPAPN IS NOT NULL AND RPAPN<>'D' AND RPAPN=RPANO AND RPAPP='Y') OR (RPAPN IS NULL))
AND (RPUST IS NULL OR RPUST= dbo.BPSDY(@RPNUM) -- 20150803 增加加班日期需大於等於到職日期的條件
AND RPRDT < @TODAY -- 20160429 增加加班日期需小於今天的條件
", 補休類別Where);
AddParam(cmd, "RPNUM", rpnum);
AddParam(cmd, "RPRDT", rprdt.AddMonths(-otd));
AddParam(cmd, "TODAY", DateTime.UtcNow.AddHours(8).Date);
return rbsaDao.Get可用補休(rpnum, rprdt) + WDAC.GetInt32Value(Query.ExecuteScalar(cmd));
}
/// 員工編號
/// 請假日期
///
public int Get已請事假(string rpnum, DateTime rprdt, string rprenExclude)
{
return Get年度已請假時數(rpnum, rprdt, 事假類別Where, rprenExclude);
}
/// 員工編號
/// 請假日期
///
public int Get已請病假(string rpnum, DateTime rprdt, string rprenExclude)
{
return Get年度已請假時數(rpnum, rprdt, 病假類別Where, rprenExclude);
}
public int Get年度已請假時數(string rpnum, DateTime rprdt, string 請假類別Where, string rprenExclude)
{
var yearBegin = new DateTime(rprdt.Year, 1, 1);
var yearEnd = new DateTime(rprdt.Year, 12, 31);
DbCommand cmd = Query.NewCommand();
cmd.CommandText = String.Format(@"
SELECT *
FROM RPAR
WHERE RPNUM = @RPNUM
AND {0}
AND ((RPRDT >= @DATE_1 AND RPRDT < @DATE_2) OR (RPEDT >= @DATE_1 AND RPEDT < @DATE_2))
-- AND ((RPAPN IS NOT NULL AND RPAPN <> 'D') OR (RPAPN IS NULL))
AND ((RPAPN IS NOT NULL AND RPAPN <> 'D' AND RPAPP <> 'N') OR (RPAPN IS NULL))
AND RPRDT >= dbo.BPSDY(@RPNUM)
", 請假類別Where);
AddParam(cmd, "RPNUM", rpnum);
AddParam(cmd, "DATE_1", yearBegin);
AddParam(cmd, "DATE_2", yearEnd.AddDays(1));
var d = Query.Select(cmd);
// 抓加班時數計算方式
BpaaDAC bpaa = new BpaaDAC(Query);
DataTable d1 = Query.Select(cmd);
TimeCalc timeCalc = new TimeCalc();
int 請假 = 0;
foreach (DataRow r1 in d1.Rows)
{
string rpren = GetStringValue(r1["RPREN"]);
if (rpren == rprenExclude)
continue;
string rppyn = GetStringValue(r1["RPPYN"]);
DateTime 起日 = GetDateTimeValue(r1["RPRDT"]);
DateTime 迄日 = GetDateTimeValue(r1["RPEDT"]);
string 起時 = GetStringValue(r1["RPRTM"]);
string 迄時 = GetStringValue(r1["RPETM"]);
string 類別 = GetStringValue(r1["RPTYP"]);
string bpott = bpaa.GetOverTimeType(rppyn);
if (起日 >= yearBegin && 起日 <= yearEnd && 迄日 >= yearBegin && 迄日 <= yearEnd)
請假 += GetInt32Value(r1["RPTCT"]);
else
{
DateTime 日期 = 起日;
while (日期 <= 迄日)
{
if (日期 >= yearBegin && 日期 <= yearEnd)
請假 += timeCalc.計算請假當日時數(rpnum, 日期, 起日, 迄日, 起時, 迄時, 類別, bpott == "1");
日期 = 日期.AddDays(1);
}
}
}
return 請假;
}
[DataObjectMethod(DataObjectMethodType.Select)]
public DataTable Get可用補休明細(string rpnum, DateTime rprdt)
{
// 取得員工在請假日期所在專案的補休期限設定
int otd = new GetData(Query).GetBPOTD_DATE_BPENO(rprdt, rpnum);
// 取得補休補登的可用時數
RbsaDAC rbsaDao = new RbsaDAC(Query);
// 20150803 增加加班日期需大於等於到職日期的條件
DbCommand cmd = Query.NewCommand();
cmd.CommandText = String.Format(@"
SELECT RPRDT AS 日期, '加班' AS 類別,
FLOOR(ISNULL(RPTCT, 0) / 60) AS 可補時數,
FLOOR(ISNULL(RPUST, 0) / 60) AS 已補時數,
ISNULL(RPTCT, 0) - FLOOR(ISNULL(RPTCT, 0) / 60) * 60 AS 可補分數,
ISNULL(RPUST, 0) - FLOOR(ISNULL(RPUST, 0) / 60) * 60 AS 已補分數,
DATEADD(MONTH, @OTD, RPRDT) AS 補休期限
FROM RPAR
WHERE RPNUM=@RPNUM
AND {0}
AND RPRDT >= @RPRDT
AND ((RPAPN IS NOT NULL AND RPAPN<>'D' AND RPAPN=RPANO AND RPAPP='Y') OR (RPAPN IS NULL))
AND (RPUST IS NULL OR RPUST= dbo.BPSDY(@RPNUM) -- 加班日期需大於等於到職日期
AND RPRDT < @TODAY -- 20160429 增加加班日期需小於今天的條件
UNION ALL
SELECT RBDAT AS 日期, '補休補登' AS 類別,
FLOOR(ISNULL(RBTCT, 0) / 60) AS 可補時數,
FLOOR(ISNULL(RBUST, 0) / 60) AS 已補時數,
ISNULL(RBTCT, 0) - FLOOR(ISNULL(RBTCT, 0) / 60) * 60 AS 可補分數,
ISNULL(RBUST, 0) - FLOOR(ISNULL(RBUST, 0) / 60) * 60 AS 已補分數,
DATEADD(MONTH, @OTD, RBDAT) AS 補休期限
FROM RBSA
WHERE RBENO = @RPNUM
AND RBDAT >= @RPRDT
AND (RBUST IS NULL OR RBUST= dbo.BPSDY(@RPNUM) -- 補休補登日期需大於等於到職日期
AND RBDAT < @TODAY -- 20160429 增加加班日期需小於今天的條件
ORDER BY 日期", 補休類別Where);
AddParam(cmd, "RPNUM", rpnum);
AddParam(cmd, "RPRDT", rprdt.AddMonths(-otd));
AddParam(cmd, "TODAY", DateTime.UtcNow.AddHours(8).Date);
AddParam(cmd, "OTD", otd);
return Query.Select(cmd);
}
///
/// 沖補休
///
/// 請假單號
/// 員工編號
/// 請假日期
/// 請假時數
/// 沖補休備註
public string 沖補休(DbTransaction tran, string rpren, string rpnum, DateTime rprdt, int rptct)
{
string result = "";
// 取得員工在請假日期所在專案的補休期限設定
int otd = new GetData(Query).GetBPOTD_DATE_BPENO(rprdt, rpnum);
// 先呼叫補休補登的沖補休
RbsaDAC rbsaDao = new RbsaDAC(Query);
rptct = rbsaDao.沖補休(tran, rpren, rpnum, rprdt, rptct, out result);
if (rptct > 0)
{
// 取出可沖單號
DbCommand cmd = Query.NewCommand();
cmd.CommandText = String.Format(
@"SELECT RPREN, RPTCT, RPUST, RPRDT
FROM RPAR
WHERE RPNUM = @RPNUM
AND {0}
AND RPRDT >= @RPRDT -- 補休6個月之內有效
AND ((RPAPN IS NOT NULL AND RPAPN <> 'D' AND RPAPN = RPANO AND RPAPP = 'Y') OR (RPAPN IS NULL))
AND (RPUST IS NULL OR RPUST < RPTCT)
AND RPRDT >= dbo.BPSDY(@RPNUM) -- 到職日之後
AND RPRDT < @TODAY -- 今天之前
ORDER BY RPRDT, RPREN", 補休類別Where);
AddParam(cmd, "RPNUM", rpnum);
AddParam(cmd, "RPRDT", rprdt.AddMonths(-otd));
AddParam(cmd, "TODAY", DateTime.UtcNow.AddHours(8).Date);
DataTable data = Query.Select(cmd, tran);
// 準備新增補休沖銷紀錄 SQL
DbCommand cmdInsertRpac = Query.NewCommand();
cmdInsertRpac.CommandText =
@"INSERT INTO RPAC
(RPREN, RPREX, RPTCT, TRDAT, TRMOD, TRUSR)
VALUES
(@RPREN, @RPREX, @RPTCT, GETDATE(), 'INSERT', @TRUSR)";
// 準備回填已沖時數 SQL
DbCommand cmdUpdateRpar = Query.NewCommand();
cmdUpdateRpar.CommandText =
@"UPDATE RPAR
SET RPUST = (SELECT SUM(RPTCT) FROM RPAC WHERE RPREX=RPAR.RPREN)
WHERE RPREN = @RPREN";
// 用來儲存要重新加總的 RPAR 的 RPREN,以免 RPAR 重複 UPDATE 被 LOCK
List RbarRpren = new List();
foreach (DataRow row in data.Rows)
{
// 一筆一筆的寫沖銷紀錄
string rpren1 = WDAC.GetStringValue(row["RPREN"]);
int rptct1 = WDAC.GetInt32Value(row["RPTCT"]);
int rpust1 = WDAC.GetInt32Value(row["RPUST"]);
DateTime rprdt1 = WDAC.GetDateTimeValue(row["RPRDT"]);
int tct = rptct > rptct1 - rpust1 ? rptct1 - rpust1 : rptct;
rptct -= tct;
AddParam(cmdInsertRpac, "RPREN", rpren);
AddParam(cmdInsertRpac, "RPREX", rpren1);
AddParam(cmdInsertRpac, "RPTCT", tct);
AddParam(cmdInsertRpac, "TRUSR", rpnum);
Query.ExecuteNonQuery(tran.Connection, tran, cmdInsertRpac);
result += String.Format("{0:MM/dd}-{1}:{2}、", rprdt1, tct / 60, tct % 60);
if (!RbarRpren.Contains(rpren1))
RbarRpren.Add(rpren1);
if (rptct <= 0)
break;
}
// 重新加總 RPAR 的已用時數
foreach (string rpren1 in RbarRpren)
{
AddParam(cmdUpdateRpar, "RPREN", rpren1);
Query.ExecuteNonQuery(tran.Connection, tran, cmdUpdateRpar);
}
}
if (result.Length > 0)
return result.Substring(0, result.Length - 1);
else
return result;
}
public void 取消沖補休(DbTransaction tran, string rpren)
{
// 先呼叫補休補登的取消沖補休
RbsaDAC rbsaDao = new RbsaDAC(Query);
rbsaDao.取消沖補休(tran, rpren);
// 取出本張單據沖銷的紀錄
DbCommand cmd = Query.NewCommand();
cmd.CommandText = @"SELECT RPREN, RPREX, RPTCT FROM RPAC WHERE RPREN=@RPREN";
AddParam(cmd, "RPREN", rpren);
DataTable data = Query.Select(cmd, tran);
DbCommand cmdDeleteRpac = Query.NewCommand();
cmdDeleteRpac.CommandText = @"DELETE FROM RPAC
WHERE RPREN = @RPREN AND RPREX = @RPREX";
DbCommand cmdUpdateRpar = Query.NewCommand();
cmdUpdateRpar.CommandText = @"UPDATE RPAR
SET RPUST = (SELECT SUM(RPTCT) FROM RPAC WHERE RPREX=RPAR.RPREN)
WHERE RPREN = @RPREN";
// 用來儲存要重新加總的 RPAR 的 RPREN,以免 RPAR 重複 UPDATE 被 LOCK
List RbarRpren = new List();
foreach (DataRow row in data.Rows)
{
// 還原被沖銷單據的被沖銷時數
string rprex1 = WDAC.GetStringValue(row["RPREX"]);
int rptct1 = WDAC.GetInt32Value(row["RPTCT"]);
AddParam(cmdDeleteRpac, "RPREN", rpren);
AddParam(cmdDeleteRpac, "RPREX", rprex1);
Query.ExecuteNonQuery(tran.Connection, tran, cmdDeleteRpac);
if (!RbarRpren.Contains(rprex1))
RbarRpren.Add(rprex1);
}
// 重新加總 RPAR 的已用時數
foreach (string rpren1 in RbarRpren)
{
AddParam(cmdUpdateRpar, "RPREN", rpren1);
Query.ExecuteNonQuery(tran.Connection, tran, cmdUpdateRpar);
}
}
///
/// 送簽
///
/// 單號
/// 目前關卡
/// 簽核人員
public void 送簽(DbTransaction tran, object RPREN, object RPANO, object RPAPU)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"UPDATE RPAR
SET RPANO = @RPANO,
RPAPP = NULL,
RPAPD = NULL,
RPAPU = @RPAPU,
TRDAT = GETDATE(),
TRMOD = 'UPDATE',
TRUSR = @RPAPU
WHERE RPREN = @RPREN";
AddParam(cmd, "RPANO", RPANO);
AddParam(cmd, "RPAPU", RPAPU);
AddParam(cmd, "RPREN", RPREN);
Query.ExecuteNonQuery(tran.Connection, tran, cmd);
}
///
/// 抽單
///
/// 單號
/// 簽核人員
public void 抽單(DbTransaction tran, object RPREN, object RPAPU)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"UPDATE RPAR
SET RPAPN = 'D',
RPANO = 'D',
RPAPP = NULL,
RPAPD = NULL,
RPAPU = @RPAPU,
TRDAT = GETDATE(),
TRMOD = 'UPDATE',
TRUSR = @RPAPU
WHERE RPREN = @RPREN";
AddParam(cmd, "RPAPU", RPAPU);
AddParam(cmd, "RPREN", RPREN);
Query.ExecuteNonQuery(tran.Connection, tran, cmd);
}
///
/// 取消抽單
///
/// 單號
/// 應簽關數
/// 前關關卡
/// 前關簽核結果
/// 前關簽核日期
/// 前關簽核人員
public void 取消抽單(DbTransaction tran, string RPREN, string RPAPN, string RPANO, string RPAPP, DateTime RPAPD, string RPAPU)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"UPDATE RPAR
SET RPAPN = @RPAPN,
RPANO = @RPANO,
RPAPP = @RPAPP,
RPAPD = @RPAPD,
RPAPU = @RPAPU,
TRDAT = GETDATE(),
TRMOD = 'UPDATE',
TRUSR = @RPAPU
WHERE RPREN = @RPREN";
AddParam(cmd, "RPAPN", RPAPN);
AddParam(cmd, "RPANO", RPANO);
AddParam(cmd, "RPAPP", RPAPP);
if (RPAPD.Ticks > 0)
AddParam(cmd, "RPAPD", RPAPD);
else
AddParam(cmd, "RPAPD", DBNull.Value);
AddParam(cmd, "RPAPU", RPAPU);
AddParam(cmd, "RPREN", RPREN);
Query.ExecuteNonQuery(tran.Connection, tran, cmd);
}
///
/// 簽核
///
/// 單號
/// 本關簽核結果
/// 簽核日期
public void 簽核(DbTransaction tran, string rpren, string rpapp, DateTime rpapd)
{
// 先取出這張單據的資料,用以判斷是何種單據
RPARList d = SelectOne(rpren);
if (d.Count > 0)
{
string rptyp = GetStringValue(d[0].RPTYP);
string rpapn = GetStringValue(d[0].RPAPN);
// 如果不核准或是核准的是抽單
if (rpapp == "N" || (rpapp == "Y" && rpapn == "D"))
{
// 補休,要將補休沖回去
if (rptyp == RPAR_TYPE.T00_補休)
{
取消沖補休(tran, rpren);
}
// 特休,要將特休沖回去
if (rptyp == RPAR_TYPE.T01_特休)
{
new RyerDAC(Query).取消沖特休(tran, rpren);
}
}
}
// 更新簽核結果
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"UPDATE RPAR
SET RPAPP = @RPAPP,
RPAPD = @RPAPD,
TRDAT = GETDATE(),
TRMOD = 'UPDATE',
TRUSR = RPAPU
WHERE RPREN = @RPREN";
AddParam(cmd, "RPAPP", rpapp);
AddParam(cmd, "RPAPD", rpapd);
AddParam(cmd, "RPREN", rpren);
Query.ExecuteNonQuery(tran.Connection, tran, cmd);
}
///
/// 退回上一關
///
/// 單號
public void 退回上一關(DbTransaction tran, object RPREN, object 上一關簽核人)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"UPDATE RPAR
SET RPANO = RPANO - 1,
RPAPP = NULL,
RPAPD = NULL,
RPAPU = @RPAPU,
TRDAT = GETDATE(),
TRMOD = 'UPDATE',
TRUSR = RPAPU
WHERE RPREN = @RPREN";
AddParam(cmd, "RPAPU", 上一關簽核人);
AddParam(cmd, "RPREN", RPREN);
Query.ExecuteNonQuery(tran.Connection, tran, cmd);
}
///
/// 取消本關
///
/// 單號
public void 取消本關(DbTransaction tran, object RPREN)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"UPDATE RPAR
SET RPAPP = NULL,
RPAPD = NULL,
TRDAT = GETDATE(),
TRMOD = 'UPDATE',
TRUSR = RPAPU
WHERE RPREN = @RPREN";
AddParam(cmd, "RPREN", RPREN);
Query.ExecuteNonQuery(tran.Connection, tran, cmd);
}
[DataObjectMethod(DataObjectMethodType.Select)]
public DataTable Select未簽核ByUser(string UserId, string RPTYP, string RPNUM)
{
DbCommand cmd = Query.NewCommand();
var wheres = new List();
if (!string.IsNullOrEmpty(RPTYP))
{
var rptypWhere = new List();
foreach (var rptyp in RPTYP.Split(','))
{
rptypWhere.Add(string.Format(" RPTYP LIKE '{0}' ", rptyp));
}
wheres.Add(string.Format(" AND ({0}) ", string.Join(" OR ", rptypWhere.ToArray())));
}
if (!string.IsNullOrEmpty(RPNUM))
{
var rpnumWhere = new List();
foreach (var rpnum in RPNUM.Split(','))
{
rpnumWhere.Add(string.Format("'{0}'", rpnum));
}
wheres.Add(string.Format(" AND RPNUM IN ({0}) ", string.Join(",", rpnumWhere.ToArray())));
}
cmd.CommandText = string.Format(
@"SELECT
A.RPREN, A.RPNUM, A.RAITM, A.RPCNM, A.RPPYN, A.RPRDT, A.RPEDT, A.RPTYP,
A.RPFTR, A.RPDOC, A.RPAPP, A.RPAPD, A.RPAPU, A.RPADT, A.RPAPN,
A.RPANO, A.RPAGT, A.RPRTM, A.RPETM, A.RPUST,
A.RPRSN, A.RPAGM, A.RPPLC, B.BPPYM,
B.BPOTT,
CAST(A.RPTCT AS INT) / 60 AS RPTCT,
ISNULL(CAST(A.RPTCT AS INT) % 60, 0) AS RPTMT,
ISNULL(A.RPTC1, 0) / 60 AS RPTC1,
ISNULL(A.RPTC1, 0) % 60 AS RPTM1,
ISNULL(A.RPTC2, 0) / 60 AS RPTC2,
ISNULL(A.RPTC2, 0) % 60 AS RPTM2,
ISNULL(A.RPTC3, 0) / 60 AS RPTC3,
ISNULL(A.RPTC3, 0) % 60 AS RPTM3,
ISNULL(A.RPTC4, 0) / 60 AS RPTC4,
ISNULL(A.RPTC4, 0) % 60 AS RPTM4,
ISNULL(A.RPTC5, 0) / 60 AS RPTC5,
ISNULL(A.RPTC5, 0) % 60 AS RPTM5,
A.TRDAT
FROM RPAR A INNER JOIN BPAA B ON A.RPPYN=B.BPPYN
WHERE RPAPU=@RPAPU AND RPAPD IS NULL {0}
ORDER BY A.RPRDT DESC", string.Join(" ", wheres.ToArray()));
AddParam(cmd, "RPAPU", UserId);
return Query.Select(cmd);
}
[DataObjectMethod(DataObjectMethodType.Select)]
public DataTable Select已簽核ByUser(string UserId)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"SELECT A.RPREN, A.RPNUM, A.RAITM, A.RPCNM, A.RPPYN, A.RPRDT, A.RPEDT, A.RPTYP,
A.RPFTR, A.RPDOC, A.RPAPP, A.RPAPD, A.RPAPU, A.RPADT, A.RPAPN,
A.RPANO, A.RPAGT, A.RPRTM, A.RPETM, A.RPUST,
A.RPRSN, A.RPAGM, A.RPPLC, B.BPPYM, C.RPAPP AS CRPAPP, C.RPDAT AS CRPDAT, C.RPENO AS CRPENO,
B.BPOTT,
CAST(A.RPTCT AS INT) / 60 AS RPTCT,
ISNULL(CAST(A.RPTCT AS INT) % 60, 0) AS RPTMT,
ISNULL(A.RPTC1, 0) / 60 AS RPTC1,
ISNULL(A.RPTC1, 0) % 60 AS RPTM1,
ISNULL(A.RPTC2, 0) / 60 AS RPTC2,
ISNULL(A.RPTC2, 0) % 60 AS RPTM2,
ISNULL(A.RPTC3, 0) / 60 AS RPTC3,
ISNULL(A.RPTC3, 0) % 60 AS RPTM3,
ISNULL(A.RPTC4, 0) / 60 AS RPTC4,
ISNULL(A.RPTC4, 0) % 60 AS RPTM4,
ISNULL(A.RPTC5, 0) / 60 AS RPTC5,
ISNULL(A.RPTC5, 0) % 60 AS RPTM5
FROM RPAR A INNER JOIN BPAA B ON A.RPPYN=B.BPPYN
INNER JOIN RPAB C ON A.RPREN=C.RPREN
WHERE C.RPENO=@RPENO
AND
(
( C.RPAPN = C.RPANO AND C.RPDAT IS NOT NULL) -- 最後一關且已簽
OR (A.RPANO='2' AND C.RPANO='1' AND A.RPAPD IS NULL) -- 是上關且本關未簽
OR (A.RPANO='3' AND C.RPANO='2' AND A.RPAPD IS NULL) -- 是上關且本關未簽
OR (A.RPAPP='N') -- 不核准
)
ORDER BY A.RPRDT DESC";
AddParam(cmd, "RPENO", UserId);
return Query.Select(cmd);
}
[DataObjectMethod(DataObjectMethodType.Select)]
public DataTable Select我的申請(string UserId, DateTime Date1, DateTime Date2, string RPTYP, string RPAPP)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"SELECT A.RPREN, A.RPNUM, A.RAITM, A.RPCNM, A.RPPYN, A.RPRDT, A.RPEDT, A.RPTYP,
A.RPFTR, A.RPDOC, A.RPAPP, A.RPAPD, A.RPAPU, A.RPADT, A.RPAPN,
A.RPANO, A.RPAGT, A.RPRTM, A.RPETM, A.RPUST,
A.RPRSN, A.RPAGM, A.RPPLC, C.RPENO AS CRPENO,
B.BPOTT,
CAST(A.RPTCT AS INT) / 60 AS RPTCT,
ISNULL(CAST(A.RPTCT AS INT) % 60, 0) AS RPTMT,
ISNULL(A.RPTC1, 0) / 60 AS RPTC1,
ISNULL(A.RPTC1, 0) % 60 AS RPTM1,
ISNULL(A.RPTC2, 0) / 60 AS RPTC2,
ISNULL(A.RPTC2, 0) % 60 AS RPTM2,
ISNULL(A.RPTC3, 0) / 60 AS RPTC3,
ISNULL(A.RPTC3, 0) % 60 AS RPTM3,
ISNULL(A.RPTC4, 0) / 60 AS RPTC4,
ISNULL(A.RPTC4, 0) % 60 AS RPTM4,
ISNULL(A.RPTC5, 0) / 60 AS RPTC5,
ISNULL(A.RPTC5, 0) % 60 AS RPTM5
FROM RPAR A
INNER JOIN BPAA B ON A.RPPYN=B.BPPYN
INNER JOIN RPAB C ON A.RPREN=C.RPREN AND C.RPANO=A.RPANO
WHERE A.RPNUM = @RPENO
AND A.RPRDT >= @RPRDT1 AND A.RPRDT < @RPRDT2
AND A.RPTYP LIKE @RPTYP ";
switch (RPAPP)
{
case "YES":
cmd.CommandText += " AND A.RPAPP = 'Y' ";
break;
case "NO":
cmd.CommandText += " AND A.RPAPP = 'N' ";
break;
case "NULL":
cmd.CommandText += " AND (A.RPAPP = '' OR A.RPAPP IS NULL) ";
break;
default:
break;
}
cmd.CommandText += " ORDER BY A.RPRDT DESC";
AddParam(cmd, "RPENO", UserId);
AddParam(cmd, "RPRDT1", Date1);
AddParam(cmd, "RPRDT2", Date2.AddDays(1));
AddParam(cmd, "RPTYP", RPTYP);
return Query.Select(cmd);
}
[DataObjectMethod(DataObjectMethodType.Select)]
public DataTable Select我的督導專案(string UserId, DateTime Date1, DateTime Date2, string RPTYP, string RPPYN, List RPNUM, bool all)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText = string.Format(
@"SELECT A.RPREN, A.RPNUM, A.RAITM, A.RPCNM, A.RPPYN, A.RPRDT, A.RPEDT, A.RPTYP,
A.RPFTR, A.RPDOC, A.RPAPP, A.RPAPD, A.RPAPU, A.RPADT, A.RPAPN,
A.RPANO, A.RPAGT, A.RPRTM, A.RPETM, A.RPUST,
A.RPRSN, A.RPAGM, A.RPPLC, B.BPPYM,
B.BPOTT,
CAST(A.RPTCT AS INT) / 60 AS RPTCT,
ISNULL(CAST(A.RPTCT AS INT) % 60, 0) AS RPTMT,
ISNULL(A.RPTC1, 0) / 60 AS RPTC1,
ISNULL(A.RPTC1, 0) % 60 AS RPTM1,
ISNULL(A.RPTC2, 0) / 60 AS RPTC2,
ISNULL(A.RPTC2, 0) % 60 AS RPTM2,
ISNULL(A.RPTC3, 0) / 60 AS RPTC3,
ISNULL(A.RPTC3, 0) % 60 AS RPTM3,
ISNULL(A.RPTC4, 0) / 60 AS RPTC4,
ISNULL(A.RPTC4, 0) % 60 AS RPTM4,
ISNULL(A.RPTC5, 0) / 60 AS RPTC5,
ISNULL(A.RPTC5, 0) % 60 AS RPTM5
FROM RPAR A
INNER JOIN BPAA B ON A.RPPYN=B.BPPYN
WHERE EXISTS (SELECT BSPYN FROM BSGP WHERE BSENO=@RPENO AND BSLVL IN ('1', '3') AND BSFLW='差勤' AND BSPYN=A.RPPYN)
AND {0} ", RPTYP.Contains("%") ? string.Format("A.RPTYP LIKE '{0}'", RPTYP) : string.Format("A.RPTYP IN ({0})", RPTYP));
if (RPPYN != null && RPPYN.Length > 0)
cmd.CommandText += string.Format(" AND A.RPPYN IN ({0}) ", RPPYN);
else
return new DataTable();
if (RPNUM != null && RPNUM.Count > 0)
cmd.CommandText += String.Format(" AND A.RPNUM IN ({0}) ", WDAC.GetIN(RPNUM));
if (Date1.Ticks > 0 && Date2.Ticks > 0)
{
cmd.CommandText += " AND A.RPRDT >= @RPRDT1 AND A.RPRDT < @RPRDT2 ";
}
else if (Date1.Ticks > 0 && Date2.Ticks == 0)
{
cmd.CommandText += " AND A.RPRDT >= @RPRDT1 ";
}
else if (Date1.Ticks == 0 && Date2.Ticks > 0)
{
cmd.CommandText += " AND A.RPRDT < @RPRDT2 ";
}
if (!all)
{
cmd.CommandText += " AND A.RPAPN <> 'D' AND A.RPAPN = A.RPANO AND A.RPAPP = 'Y' ";
}
cmd.CommandText += " ORDER BY A.RPRDT DESC ";
AddParam(cmd, "RPENO", UserId);
AddParam(cmd, "RPRDT1", Date1);
AddParam(cmd, "RPRDT2", Date2.AddDays(1));
return Query.Select(cmd);
}
[DataObjectMethod(DataObjectMethodType.Select)]
public DataTable Select我的督導專案人員(string UserId, DateTime Date1, DateTime Date2, string RPTYP, string RPPYN)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText = string.Format(
@"SELECT DISTINCT A.RPNUM, A.RPNUM + ' ' + C.BPNME AS BPNME
FROM RPAR A
INNER JOIN BPAA B ON A.RPPYN=B.BPPYN
INNER JOIN BPSNView C ON A.RPNUM=C.BPENO
WHERE EXISTS (SELECT BSPYN FROM BSGP WHERE BSENO=@RPENO AND BSLVL IN ('1', '3') AND BSFLW='差勤' AND BSPYN=A.RPPYN)
AND A.RPRDT >= @RPRDT1 AND A.RPRDT < @RPRDT2
AND {0} ", RPTYP.Contains("%") ? string.Format("A.RPTYP LIKE '{0}'", RPTYP) : string.Format("A.RPTYP IN ({0})", RPTYP));
if (RPPYN != null && RPPYN.Length > 0)
cmd.CommandText += string.Format(" AND A.RPPYN IN ({0}) ", RPPYN);
cmd.CommandText += " ORDER BY A.RPNUM ";
AddParam(cmd, "RPENO", UserId);
AddParam(cmd, "RPRDT1", Date1);
AddParam(cmd, "RPRDT2", Date2.AddDays(1));
return Query.Select(cmd);
}
public DataTable Select報表資料_013(DateTime 年月, string 年度專案, string 類型)
{
DateTime 月初 = 年月.AddDays(-年月.Day + 1);
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"SELECT A.RPREN, A.RPNUM, A.RPPYN, A.RPRDT, A.RPEDT, A.RPTYP, A.RPTCT, A.RPFTR, A.RPDOC,
A.RPAPP, A.RPAPD, A.RPAPU, A.RPADT, A.RPAPN, A.RPANO, A.RPAGT, A.RPRTM, A.RPETM,
A.RPUST, A.RPTC1, A.RPTC2, A.RPTC3, A.RPTC4, A.RPTC5, A.RPRSN, A.RPAGM, A.RPPLC,
B.BPNME, C.RABRH, C.RAJNO, D.BSRMK AS 站別, E.BPJME AS 職稱
FROM RPAR A
LEFT OUTER JOIN BPSNView B ON B.BPENO = A.RPNUM
LEFT OUTER JOIN RASN C ON A.RPPYN = C.RAPYN AND A.RPNUM = C.RANUM
LEFT OUTER JOIN BCLS D ON D.BSPAR = 'BPSNBRH' AND D.BSCLS = C.RABRH
LEFT OUTER JOIN BPJA E ON E.BPPYN = C.RAPYN AND E.BPJNO = C.RAJNO
WHERE RPPYN = @RPPYN
AND RPRDT >= @RPRDT1 AND RPRDT < @RPRDT2
AND RPTYP LIKE @RPTYP
AND RPAPN <> 'D'
AND RPAPN = RPANO
AND RPAPP = 'Y'
ORDER BY RPNUM, RPRDT, RPREN";
AddParam(cmd, "RPPYN", 年度專案);
AddParam(cmd, "RPRDT1", 月初);
AddParam(cmd, "RPRDT2", 月初.AddMonths(1));
switch (類型)
{
case "請假":
AddParam(cmd, "RPTYP", "0%");
break;
case "加班":
AddParam(cmd, "RPTYP", "1%");
break;
case "差旅":
AddParam(cmd, "RPTYP", "3%");
break;
}
return Query.Select(cmd);
}
public DataTable Select報表資料_013By人員(DateTime 年月, string 人員編號, string 類型)
{
DateTime 月初 = 年月.AddDays(-年月.Day + 1);
string SQL = @"
SELECT DISTINCT A.RPREN, A.RPNUM, A.RPPYN, A.RPRDT, A.RPEDT, A.RPTYP, A.RPTCT, A.RPFTR, A.RPDOC,
A.RPAPP, A.RPAPD, A.RPAPU, A.RPADT, A.RPAPN, A.RPANO, A.RPAGT, A.RPRTM, A.RPETM,
A.RPUST, A.RPTC1, A.RPTC2, A.RPTC3, A.RPTC4, A.RPTC5, A.RPRSN, A.RPAGM, A.RPPLC,
B.BPNME, C.RABRH, C.RAJNO, D.BSSCR AS 站別, E.BPJME AS 職稱, F.BSSCR AS 類別,
COALESCE(G.BPNME, H.BPNME) AS 審核人員,
0 AS RPAC1, 0 AS RPAC2, 0 AS RPAC3, 0 AS RPAC4, 0 AS RPAC5
FROM RPAR A
LEFT OUTER JOIN BPSNView B ON B.BPENO = A.RPNUM
LEFT OUTER JOIN RASN C ON A.RPPYN = C.RAPYN AND A.RPNUM = C.RANUM AND (C.RASDT <= A.RPRDT AND (C.RAEDT >= A.RPRDT OR C.RAEDT IS NULL))
LEFT OUTER JOIN BCLS D ON D.BSPAR = 'BPSNBRH' AND D.BSCLS = C.RABRH
LEFT OUTER JOIN BPJA E ON E.BPPYN = C.RAPYN AND E.BPJNO = C.RAJNO
LEFT OUTER JOIN BCLS F ON F.BSPAR = 'RPARTYP' AND F.BSCLS = A.RPTYP
LEFT OUTER JOIN BPAP G ON A.RPAPU = G.BPENO
LEFT OUTER JOIN BPSNView H ON A.RPAPU = H.BPENO
WHERE RPNUM = @RPNUM
AND (
(RPRDT >= @RPRDT1 AND RPRDT < @RPRDT2)
OR (RPEDT >= @RPRDT1 AND RPEDT < @RPRDT2)
OR (RPRDT < @RPRDT1 AND RPEDT >= @RPRDT2)
)
AND RPTYP LIKE @RPTYP
AND RPAPN <> 'D'
AND RPAPN = RPANO
AND RPAPP = 'Y'
{0}
ORDER BY RPRDT, RPREN";
DbCommand cmd = Query.NewCommand();
cmd.CommandText = String.Format(SQL, "");
AddParam(cmd, "RPNUM", 人員編號);
AddParam(cmd, "RPRDT1", 月初);
AddParam(cmd, "RPRDT2", 月初.AddMonths(1));
switch (類型)
{
case "請假":
AddParam(cmd, "RPTYP", "0%");
break;
case "加班":
AddParam(cmd, "RPTYP", "1%");
break;
case "公差":
AddParam(cmd, "RPTYP", "3%");
break;
case "差旅費":
cmd.CommandText = String.Format(SQL, " AND RPFTR > 0 ");
AddParam(cmd, "RPTYP", "3%");
break;
}
DataTable d = Query.Select(cmd);
if (d.Rows.Count > 0)
{
// 計算加班費
ExtraWork extraWork = new ExtraWork();
GetData calc = new GetData();
calc.Query = Query;
int bpsrm;
int bpp02;
double bpbft;
double bpaft;
double bphol;
string bpovr;
string bplve;
string bpott;
foreach (DataRow i in d.Rows)
{
// 取得該人員該專案該日期的薪資、加班費比例、加班費計算公式
calc.GetRASN_Date_Bppyn_Bpeno_Overwork_Rate(
WDAC.GetDateTimeValue(i["RPRDT"]),
WDAC.GetStringValue(i["RPPYN"]),
WDAC.GetStringValue(i["RPNUM"]),
out bpsrm, out bpp02, out bpbft,
out bpaft, out bphol, out bpovr,
out bplve, out bpott);
extraWork.Clear();
extraWork.Add(
WDAC.GetStringValue(i["RPTYP"]),
WDAC.GetDateTimeValue(i["RPRDT"]),
WDAC.GetInt32Value(i["RPTCT"]),
bpsrm, bpp02, bpbft, bpaft, bphol, bpovr, bpott,
WDAC.GetInt32Value(i["RPTC1"]),
WDAC.GetInt32Value(i["RPTC2"]),
WDAC.GetInt32Value(i["RPTC3"]),
WDAC.GetInt32Value(i["RPTC4"]),
WDAC.GetInt32Value(i["RPTC5"]));
i.BeginEdit();
i["RPAC1"] = extraWork.RPTA1;
i["RPAC2"] = extraWork.RPTA2;
i["RPAC3"] = extraWork.RPTA3;
i["RPAC4"] = extraWork.RPTA4;
i["RPAC5"] = extraWork.RPTA5;
i.EndEdit();
}
}
return d;
}
[DataObjectMethod(DataObjectMethodType.Select)]
public DataTable Select出勤資料(DateTime 起日, DateTime 迄日, string 年度專案, string 人員編號)
{
TimeCalc timeCalc = new TimeCalc();
RtmeDAC rtmeDao = new RtmeDAC(Query);
// 1. 準備輸出架構
DataTable result = new DataTable();
result.Columns.Add("日期", typeof(DateTime));
result.Columns.Add("人員編號", typeof(String));
result.Columns.Add("人員姓名", typeof(String));
result.Columns.Add("站別編號", typeof(String));
result.Columns.Add("站別名稱", typeof(String));
result.Columns.Add("職稱", typeof(String));
result.Columns.Add("上班時間", typeof(String));
result.Columns.Add("上班IP", typeof(String));
result.Columns.Add("下班時間", typeof(String));
result.Columns.Add("下班IP", typeof(String));
result.Columns.Add("請假時數", typeof(Int32));
result.Columns.Add("加班時數", typeof(Int32));
result.Columns.Add("出差時數", typeof(Int32));
result.Columns.Add("請假分數", typeof(Int32));
result.Columns.Add("加班分數", typeof(Int32));
result.Columns.Add("出差分數", typeof(Int32));
result.Columns.Add("出差外出時間", typeof(String));
result.Columns.Add("出差外出IP", typeof(String));
result.Columns.Add("出差返回時間", typeof(String));
result.Columns.Add("出差返回IP", typeof(String));
result.Columns.Add("備註", typeof(String));
// 2. 抓專案人員以及打卡資料
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"SELECT A.RANUM, C.BPNME, A.RABRH, G.BSRMK AS 單位, H.BPJME AS 職稱
FROM RASN A
INNER JOIN BPSNView C ON C.BPENO=A.RANUM
LEFT OUTER JOIN BCLS G ON G.BSPAR='BPSNBRH' AND G.BSCLS=A.RABRH
LEFT OUTER JOIN BPJA H ON H.BPPYN=A.RAPYN AND H.BPJNO=A.RAJNO
WHERE A.RAPYN = @BPPYN
AND ( (A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM2)
OR (A.RASDT <= @YYMM1 AND A.RAEDT IS NULL)
OR (A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2)
OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM2)
OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT IS NULL)
OR (A.RASDT >= @YYMM1 AND A.RASDT <= @YYMM2 AND A.RAEDT >= @YYMM1 AND A.RAEDT <= @YYMM2) )
GROUP BY A.RANUM, C.BPNME, A.RABRH, G.BSRMK, H.BPJME
ORDER BY A.RANUM";
AddParam(cmd, "BPPYN", 年度專案);
AddParam(cmd, "YYMM1", 起日.Date);
AddParam(cmd, "YYMM2", 迄日.Date);
DataTable d = Query.Select(cmd);
DateTime 日期 = 起日;
// 抓加班時數計算方式
BpaaDAC bpaa = new BpaaDAC(Query);
string bpott = bpaa.GetOverTimeType(年度專案);
// 2. 計算差勤單資料,拆到每一天
// 2.1. 準備取當天差勤資料的 SQL
DbCommand cmd1 = Query.NewCommand();
cmd1.CommandText =
// @"SELECT RPPYN, RPNUM, RPTYP, RPRDT, RPEDT, RPRTM, RPETM, RPTCT
// FROM RPAR A
// WHERE RPPYN=@RPPYN
// AND RPNUM=@RPNUM
// AND ((RPRDT = @YYMM1 AND RPEDT IS NULL)
// OR (RPRDT <= @YYMM1 AND RPEDT >= @YYMM1))
// AND ((RPAPN IS NULL)
// OR (RPAPN<>'D' AND RPAPN=RPANO AND RPAPP='Y'))";
// @"SELECT RPPYN, RPNUM, RPTYP, RPRDT, RPEDT, RPRTM, RPETM, RPTCT
// FROM RPAR A
// WHERE RPPYN=@RPPYN
// AND RPNUM=@RPNUM
// AND ((RPRDT = @YYMM1 AND RPEDT IS NULL)
// OR (RPRDT <= @YYMM1 AND RPEDT >= @YYMM1))
// AND ((RPAPN IS NULL) OR (RPAPN<>'D'))";
@"SELECT RPPYN, RPNUM, RPTYP, RPRDT, RPEDT, RPRTM, RPETM, RPTCT
FROM RPAR A
WHERE RPPYN=@RPPYN
AND RPNUM=@RPNUM
AND ((RPRDT = @YYMM1 AND RPEDT IS NULL)
OR (RPRDT <= @YYMM1 AND RPEDT >= @YYMM1))
AND ((RPAPN IS NULL) OR ((RPAPN<>'D') AND (RPAPN=RPANO) AND (RPAPP<>'N')))";
// 2.2. 準備取當天打卡資料的 SQL
DbCommand cmd2 = Query.NewCommand();
cmd2.CommandText =
@"SELECT RCC01, RCC02, RCC07, RCC08, RCP01, RCP02, RCP07, RCP08 FROM RCRD
WHERE RCDAT = @RCDAT
AND RCUSR = @RCUSR";
while (日期 <= 迄日)
{
// 2.2 計算當天資料
foreach (DataRow r in d.Rows)
{
// 若有人員編號條件,於此處過濾
if (人員編號.Length > 0)
{
if (人員編號.CompareTo(r["RANUM"]) != 0)
continue;
}
// 取差勤資料,並計算
AddParam(cmd1, "RPPYN", 年度專案);
AddParam(cmd1, "YYMM1", 日期);
AddParam(cmd1, "RPNUM", r["RANUM"]);
DataTable d1 = Query.Select(cmd1);
int 請假 = 0;
int 加班 = 0;
int 差旅 = 0;
List 備註 = new List();
foreach (DataRow r1 in d1.Rows)
{
string RPNUM = GetStringValue(r1["RPNUM"]);
DateTime 差勤起日 = GetDateTimeValue(r1["RPRDT"]);
DateTime 差勤迄日 = GetDateTimeValue(r1["RPEDT"]);
string 差勤起時 = GetStringValue(r1["RPRTM"]);
string 差勤迄時 = GetStringValue(r1["RPETM"]);
string 類別 = GetStringValue(r1["RPTYP"]);
switch (類別.Substring(0, 1))
{
case RPAR_TYPE.T0_請假:
請假 += timeCalc.計算請假當日時數(RPNUM, 日期, 差勤起日, 差勤迄日, 差勤起時, 差勤迄時, 類別, bpott == "1");
break;
case RPAR_TYPE.T1_加班:
加班 += timeCalc.計算加班時數(RPNUM, 日期, 差勤起時, 差勤迄時, RPAR_TYPE.休息日加班(類別));
break;
case RPAR_TYPE.T3_出差:
差旅 += timeCalc.計算差旅當日時數(RPNUM, 日期, 差勤起日, 差勤迄日, 差勤起時, 差勤迄時);
break;
}
}
// 取打卡資料
AddParam(cmd2, "RCDAT", 日期);
AddParam(cmd2, "RCUSR", r["RANUM"]);
DataTable d2 = Query.Select(cmd2);
DataRow newRow = result.NewRow();
newRow["日期"] = 日期;
newRow["人員編號"] = r["RANUM"];
newRow["人員姓名"] = r["BPNME"];
newRow["站別編號"] = r["RABRH"];
newRow["站別名稱"] = r["單位"];
newRow["職稱"] = r["職稱"];
if (d2.Rows.Count > 0)
{
newRow["上班時間"] = d2.Rows[0]["RCC01"];
newRow["上班IP"] = d2.Rows[0]["RCP01"];
newRow["下班時間"] = d2.Rows[0]["RCC02"];
newRow["下班IP"] = d2.Rows[0]["RCP02"];
newRow["出差外出時間"] = d2.Rows[0]["RCC07"];
newRow["出差外出IP"] = d2.Rows[0]["RCP07"];
newRow["出差返回時間"] = d2.Rows[0]["RCC08"];
newRow["出差返回IP"] = d2.Rows[0]["RCP08"];
if (WDAC.GetStringValue(d2.Rows[0]["RCP01"]) == "補打卡")
備註.Add("補打上班卡");
if (WDAC.GetStringValue(d2.Rows[0]["RCP02"]) == "補打卡")
備註.Add("補打下班卡");
}
else
{
newRow["上班時間"] = "";
newRow["上班IP"] = "";
newRow["下班時間"] = "";
newRow["下班IP"] = "";
newRow["出差外出時間"] = "";
newRow["出差外出IP"] = "";
newRow["出差返回時間"] = "";
newRow["出差返回IP"] = "";
}
// 取班表資料
var btmeItem = rtmeDao.SelectBtmeDay(GetStringValue(r["RANUM"]), 日期);
if (btmeItem != null)
{
備註.Add(string.Format("值{0}{1}-{2}", btmeItem.BTNME, btmeItem.BTSTM, btmeItem.BTETM));
}
newRow["請假時數"] = 請假 / 60;
newRow["請假分數"] = 請假 % 60;
newRow["加班時數"] = 加班 / 60;
newRow["加班分數"] = 加班 % 60;
newRow["出差時數"] = 差旅 / 60;
newRow["出差分數"] = 差旅 % 60;
newRow["備註"] = string.Join("/", 備註.ToArray());
result.Rows.Add(newRow);
}
日期 = 日期.AddDays(1);
}
return result;
}
[DataObjectMethod(DataObjectMethodType.Select)]
public DataTable Select出勤資料By人員(DateTime 日期, string 人員編號)
{
TimeCalc timeCalc = new TimeCalc();
// 1. 抓專案人員以及打卡資料
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"SELECT A.RANUM
, C.BPNME
, A.RAPYN
, A.RABRH, G.BSSCR AS 單位, H.BPJME AS 職稱
, B.RCC01, B.RCC02, B.RCP01, B.RCP02, B.RCC07, B.RCC08
, 0 AS 請假時數, 0 AS 請假分數, 0 AS 加班時數, 0 AS 加班分數, 0 AS 出差時數, 0 AS 出差分數
, 0 AS 請假, 0 AS 加班, 0 AS 出差
FROM RASN A
INNER JOIN BPSNView C ON C.BPENO=A.RANUM
LEFT OUTER JOIN RCRD B ON B.RCUSR=A.RANUM AND B.RCDAT=@YYMM1
LEFT OUTER JOIN BCLS G ON G.BSPAR='BPSNBRH' AND G.BSCLS=A.RABRH
LEFT OUTER JOIN BPJA H ON H.BPPYN=A.RAPYN AND H.BPJNO=A.RAJNO
WHERE A.RANUM = @RANUM
AND (
(A.RASDT <= @YYMM1 AND A.RAEDT >= @YYMM1)
OR (A.RASDT <= @YYMM1 AND A.RAEDT IS NULL)
)
GROUP BY A.RANUM, C.BPNME, A.RAPYN, A.RABRH, G.BSSCR, H.BPJME, B.RCC01, B.RCC02, B.RCP01, B.RCP02, B.RCC07, B.RCC08
ORDER BY A.RANUM";
AddParam(cmd, "RANUM", 人員編號);
AddParam(cmd, "YYMM1", 日期);
DataTable d = Query.Select(cmd);
// 抓加班時數計算方式
BpaaDAC bpaa = new BpaaDAC(Query);
// 2. 抓差勤單資料,拆到每一天
DbCommand cmd1 = Query.NewCommand();
cmd1.CommandText =
@"SELECT RPPYN, RPNUM, RPTYP, RPRDT, RPEDT, RPRTM, RPETM, RPTCT
FROM RPAR A
WHERE RPNUM=@RPNUM
AND ((RPRDT = @YYMM1 AND RPEDT IS NULL)
OR (RPRDT <= @YYMM1 AND RPEDT >= @YYMM1))
AND ((RPAPN IS NULL)
OR (RPAPN<>'D' AND RPAPN=RPANO AND RPAPP='Y'))";
AddParam(cmd1, "RPNUM", 人員編號);
AddParam(cmd1, "YYMM1", 日期);
foreach (DataRow r in d.Rows)
{
AddParam(cmd1, "RPNUM", r["RANUM"]);
DataTable d1 = Query.Select(cmd1);
int 請假 = 0;
int 加班 = 0;
int 差旅 = 0;
foreach (DataRow r1 in d1.Rows)
{
string rpnum = GetStringValue(r1["RPNUM"]);
string rppyn = GetStringValue(r1["RPPYN"]);
string bpott = bpaa.GetOverTimeType(rppyn);
DateTime 起日 = GetDateTimeValue(r1["RPRDT"]);
DateTime 迄日 = GetDateTimeValue(r1["RPEDT"]);
string 起時 = GetStringValue(r1["RPRTM"]);
string 迄時 = GetStringValue(r1["RPETM"]);
string 類別 = GetStringValue(r1["RPTYP"]);
switch (類別.Substring(0, 1))
{
case RPAR_TYPE.T0_請假:
請假 += timeCalc.計算請假當日時數(rpnum, 日期, 起日, 迄日, 起時, 迄時, 類別, bpott == "1");
break;
case RPAR_TYPE.T1_加班:
加班 += timeCalc.計算加班時數(rpnum, 日期, 起時, 迄時, "13,14".Contains(類別));
break;
case RPAR_TYPE.T3_出差:
差旅 += timeCalc.計算差旅當日時數(rpnum, 日期, 起日, 迄日, 起時, 迄時);
break;
}
}
r.BeginEdit();
r["請假時數"] = 請假 / 60;
r["請假分數"] = 請假 % 60;
r["加班時數"] = 加班 / 60;
r["加班分數"] = 加班 % 60;
r["出差時數"] = 差旅 / 60;
r["出差分數"] = 差旅 % 60;
r["請假"] = 請假;
r["加班"] = 加班;
r["出差"] = 差旅;
r.EndEdit();
}
return d;
}
//public void 回填加班時數(string 單號, int 前二加班, int 後二加班, int 假日加班)
//{
// DbCommand cmd = Query.NewCommand();
// cmd.CommandText =
// @"UPDATE RPAR SET
// RPTC1 = @RPTC1,
// RPTC2 = @RPTC2,
// RPTC3 = @RPTC3
// WHERE RPREN = @RPREN";
// AddParam(cmd, "RPTC1", 前二加班);
// AddParam(cmd, "RPTC2", 後二加班);
// AddParam(cmd, "RPTC3", 假日加班);
// AddParam(cmd, "RPREN", 單號);
// Query.ExecuteNonQuery(cmd);
//}
public void 回填加班費(string 單號, int RPTA1, int RPTA2, int RPTA3, int RPTA4, int RPTA5, DbTransaction tran)
{
DbCommand cmd = Query.NewCommand();
if (tran != null)
{
cmd.Connection = tran.Connection;
cmd.Transaction = tran;
}
cmd.CommandText =
@"UPDATE RPAR SET
RPTA1 = @RPTA1,
RPTA2 = @RPTA2,
RPTA3 = @RPTA3,
RPTA4 = @RPTA4,
RPTA5 = @RPTA5,
RPFTR = @RPFTR
WHERE RPREN = @RPREN";
AddParam(cmd, "RPTA1", RPTA1);
AddParam(cmd, "RPTA2", RPTA2);
AddParam(cmd, "RPTA3", RPTA3);
AddParam(cmd, "RPTA4", RPTA4);
AddParam(cmd, "RPTA5", RPTA5);
AddParam(cmd, "RPFTR", RPTA1 + RPTA2 + RPTA3 + RPTA4 + RPTA5);
AddParam(cmd, "RPREN", 單號);
if (tran != null)
{
cmd.ExecuteNonQuery();
}
else
{
Query.ExecuteNonQuery(cmd);
}
}
public void 回填缺勤扣款(string 單號, int RPFTR, DbTransaction tran)
{
DbCommand cmd = Query.NewCommand();
if (tran != null)
{
cmd.Connection = tran.Connection;
cmd.Transaction = tran;
}
cmd.CommandText =
@"UPDATE RPAR SET
RPFTR = @RPFTR
WHERE RPREN = @RPREN";
AddParam(cmd, "RPFTR", RPFTR);
AddParam(cmd, "RPREN", 單號);
if (tran != null)
{
cmd.ExecuteNonQuery();
}
else
{
Query.ExecuteNonQuery(cmd);
}
}
public bool 代理人不在(string 代理人姓名, string 代理人電郵, DateTime 起日, DateTime 迄日, string 起時, string 迄時)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"SELECT COUNT(1) FROM
(
SELECT A.RPNUM, A.RPTYP, B.BPNME, B.BPEML,
CONVERT(VARCHAR(8), A.RPRDT, 112) + '-' + ISNULL(A.RPRTM, '00:00') AS START_DT,
CONVERT(VARCHAR(8), A.RPEDT, 112) + '-' + ISNULL(A.RPETM, '24:00') AS END_DT
FROM RPAR A
LEFT JOIN BPSNView B ON A.RPNUM=B.BPENO
WHERE A.RPRDT >= '2016/1/1'
AND ((A.RPTYP >= '00' AND A.RPTYP <= '0Z') OR (A.RPTYP >= '30' AND A.RPTYP <= '3Z'))
AND B.BPNME = @RPAGT
AND B.BPEML = @RPAGM
AND A.RPANO <> 'D'
AND A.RPAPP <> 'N'
) AS TMP1
WHERE ((START_DT <= @SDT AND END_DT > @SDT) OR (START_DT < @EDT AND END_DT >= @EDT))";
AddParam(cmd, "SDT", String.Format(WGuard1.InvariantCulture, "{0:yyyyMMdd}-{1}", 起日, 起時));
AddParam(cmd, "EDT", String.Format(WGuard1.InvariantCulture, "{0:yyyyMMdd}-{1}", 迄日, 迄時));
AddParam(cmd, "RPAGT", 代理人姓名);
AddParam(cmd, "RPAGM", 代理人電郵);
return WDAC.GetInt32Value(Query.ExecuteScalar(cmd)) > 0;
}
public DataTable 我是代理人的單據(string 員工姓名, string 員工電郵, DateTime 起日, DateTime 迄日, string 起時, string 迄時,
bool check請假, bool check差勤)
{
string sql請假 = "A.RPTYP >= '00' AND A.RPTYP <= '0Z'";
if (!check請假)
sql請假 = "1=0";
string sql差勤 = "A.RPTYP >= '30' AND A.RPTYP <= '3Z'";
if (!check差勤)
sql差勤 = "1=0";
DbCommand cmd = Query.NewCommand();
cmd.CommandText = String.Format(
@"SELECT * FROM
(
SELECT A.RPPYN, A.RPREN, A.RPNUM, A.RPTYP, C.BSSCR, B.BPNME, B.BPEML, B.BPMB1, B.BPMB2,
CONVERT(VARCHAR(8), A.RPRDT, 112) + '-' + ISNULL(A.RPRTM, '00:00') AS START_DT,
CONVERT(VARCHAR(8), A.RPEDT, 112) + '-' + ISNULL(A.RPETM, '24:00') AS END_DT
FROM RPAR A
JOIN BPSNView B ON A.RPNUM = B.BPENO
JOIN BCLS C ON A.RPTYP = C.BSCLS AND C.BSPAR='RPARTYP'
WHERE A.RPRDT >= '2016/1/1'
AND (({0}) OR ({1}))
AND A.RPAGT = @RPAGT
AND A.RPAGM = @RPAGM
AND A.RPANO <> 'D'
AND A.RPAPP <> 'N'
) AS TMP1
WHERE ((START_DT <= @SDT AND END_DT > @SDT) OR (START_DT < @EDT AND END_DT >= @EDT))",
sql請假, sql差勤);
AddParam(cmd, "SDT", String.Format(WGuard1.InvariantCulture, "{0:yyyyMMdd}-{1}", 起日, 起時));
AddParam(cmd, "EDT", String.Format(WGuard1.InvariantCulture, "{0:yyyyMMdd}-{1}", 迄日, 迄時));
AddParam(cmd, "RPAGT", 員工姓名);
AddParam(cmd, "RPAGM", 員工電郵);
return Query.Select(cmd);
}
public DataTable 我是代理人的單據(string 員工姓名, string 員工電郵, DateTime 起日, DateTime 迄日, string 起時, string 迄時)
{
return 我是代理人的單據(員工姓名, 員工電郵, 起日, 迄日, 起時, 迄時, true, true);
}
public bool 檢查休息日加班(string BPENO, DateTime RPRDT, string RPREN, out string message)
{
message = "";
var holiday_type = new BhrdDAC().GetDayHolidayType(RPRDT);
if (holiday_type != HolidayType.Holiday && holiday_type != HolidayType.ElasticRest)
{
message = "只有例假日、休息日、彈性休假日可以申請休息日加班!";
return false;
}
DateTime sun;
DateTime sat;
if (RPRDT.DayOfWeek == DayOfWeek.Sunday)
{
sun = RPRDT;
sat = RPRDT.AddDays(-1);
}
else
{
sun = RPRDT.AddDays(1);
sat = RPRDT;
}
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"SELECT COUNT(DISTINCT RPRDT)
FROM RPAR
WHERE (RPRDT = @SAT OR RPRDT = @SUN)
AND RPNUM = @BPENO
AND (RPTYP = '13' OR RPTYP = '14')
AND (RPAPN IS NULL OR (RPAPN <> 'D' AND (RPAPP IS NULL OR RPAPP <> 'N')))
AND RPRDT <> @RPRDT";
AddParam(cmd, "SAT", sat);
AddParam(cmd, "SUN", sun);
AddParam(cmd, "BPENO", BPENO);
AddParam(cmd, "RPRDT", RPRDT);
if (WDAC.GetInt32Value(Query.ExecuteScalar(cmd)) > 0)
{
message = "不可連續兩天申請休息日加班!";
return false;
}
return true;
}
public DataTable 代理人提醒(DateTime 代理日期)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"SELECT A.RPPYN, A.RPREN, A.RPNUM, A.RPTYP, A.RPAGT, A.RPAGM,
A.RPRDT, A.RPRTM, A.RPEDT, A.RPETM, A.RPRSN, A.RPDOC,
B.BPNME, B.BPEML, C.BSSCR
FROM RPAR A
JOIN BPSNView B ON A.RPNUM = B.BPENO
JOIN BCLS C ON A.RPTYP = C.BSCLS AND C.BSPAR='RPARTYP'
WHERE A.RPRDT = @RPRDT
AND ((A.RPTYP >= '00' AND A.RPTYP <= '0Z') OR (A.RPTYP >= '30' AND A.RPTYP <= '3Z'))
AND A.RPAGT IS NOT NULL
AND A.RPAGT <> ''
AND A.RPANO <> 'D'
AND A.RPAPP <> 'N' ";
AddParam(cmd, "RPRDT", 代理日期);
return Query.Select(cmd);
}
public DataTable 取得督導(string 單號)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"SELECT A.RPENO, B.BPNME, B.BPEML
FROM RPAB A
LEFT JOIN BPSNView B ON A.RPENO = B.BPENO
WHERE A.RPREN <> '' AND A.RPREN IS NOT NULL AND A.RPREN = @RPREN
AND A.RPANO = '1' ";
AddParam(cmd, "RPREN", 單號);
return Query.Select(cmd);
}
public List<差勤日報表Item> 取得差勤日報表資料(string 年度接單編號, DateTime 起日, DateTime 迄日, string 類別)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"SELECT DISTINCT A.RPPYN 年度接單編號, A.RPNUM 員工編號, B.BPNME 員工姓名
, A.RPTYP 類別, C.BSSCR 類別名稱
, A.RPRDT 起日, A.RPRTM 起時, A.RPEDT 迄日, A.RPETM 迄時
, CAST(A.RPTCT AS INT) / 60 時數, CAST(A.RPTCT AS INT) % 60 分數
, D.RABRH 站別編號, E.BSSCR 站別名稱, A.RPPLC 出差地點
FROM RPAR A
JOIN BPSNView B ON A.RPNUM=B.BPENO
JOIN BCLS C ON A.RPTYP=C.BSCLS AND C.BSPAR='RPARTYP'
JOIN RASN D ON A.RPPYN=D.RAPYN AND A.RPNUM=D.RANUM
AND ((D.RASDT BETWEEN @SDT AND @EDT)
OR (D.RAEDT BETWEEN @SDT AND @EDT)
OR (D.RASDT <= @SDT AND (D.RAEDT >= @EDT OR D.RAEDT IS NULL)))
JOIN BCLS E ON D.RABRH=E.BSCLS AND E.BSPAR='BPSNBRH'
WHERE A.RPRDT > '2016/1/1'
AND A.RPPYN = @RPPYN
AND ((A.RPRDT BETWEEN @SDT AND @EDT) OR (A.RPEDT BETWEEN @SDT AND @EDT) OR (A.RPRDT <= @SDT AND A.RPEDT >= @EDT))
AND A.RPANO <> 'D'
AND A.RPAPP <> 'N'
AND A.RPTYP LIKE @RPTYP
ORDER BY A.RPPYN, A.RPNUM ";
AddParam(cmd, "RPPYN", 年度接單編號);
AddParam(cmd, "SDT", 起日);
AddParam(cmd, "EDT", 迄日);
AddParam(cmd, "RPTYP", 類別 + "%");
return Query.Select<差勤日報表Item>(cmd);
}
public List<補休明細Item> 取得補休明細資料(string 員工編號)
{
var today = DateTime.UtcNow.AddHours(8).Date;
// 取得員工在請假日期所在專案的補休期限設定
int otd = new GetData(Query).GetBPOTD_DATE_BPENO(today, 員工編號);
DbCommand cmd = Query.NewCommand();
cmd.CommandText = String.Format(
@"SELECT '補登' 類別, RBENO 員工編號, RBREN 單號, RBDAT 日期,
(CAST(RBTCT AS INT) - ISNULL(CAST(RBUST AS INT), 0)) / 60 可用時數,
(CAST(RBTCT AS INT) - ISNULL(CAST(RBUST AS INT), 0)) % 60 可用分數,
DATEADD(month, 6, RBDAT) 有效期限
FROM RBSA
WHERE 1=1
AND RBENO = @員工編號
AND RBDAT >= @起始日期 -- 補休6個月之內有效
AND RBDAT >= dbo.BPSDY(RBSA.RBENO) -- 到職日之後
AND RBDAT < @TODAY -- 今天之前
AND (RBUST IS NULL OR RBUST= @起始日期 -- 補休6個月之內有效
AND ((RPAPN IS NOT NULL AND RPAPN <> 'D' AND RPAPN = RPANO AND RPAPP = 'Y') OR (RPAPN IS NULL)) -- 非抽單且已經簽核完畢或無須簽核的單子
AND (RPUST IS NULL OR RPUST < RPTCT) -- 尚未使用完畢
AND RPRDT >= dbo.BPSDY(RPAR.RPNUM) -- 到職日之後
AND RPRDT < @TODAY -- 今天之前
ORDER BY 類別, 有效期限 ", 補休類別Where);
AddParam(cmd, "員工編號", 員工編號);
AddParam(cmd, "起始日期", today.AddMonths(-otd));
AddParam(cmd, "TODAY", today);
return Query.Select<補休明細Item>(cmd);
}
///
/// 檢查輸入資料是否重複
///
/// 單號
/// 員工編號
/// 開始日期
/// 結束日期
/// 開始時間
/// 結束時間
///
public bool 加班單是否重複(string RPREN, string RPNUM, DateTime? RPRDT, DateTime? RPEDT, string RPRTM, string RPETM)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText = "SELECT COUNT(*) FROM RPAR WHERE RPREN <> @RPREN AND RPTYP LIKE '1%' AND RPAPN <> 'D' AND (RPAPP IS NULL OR RPAPP <> 'N') ";
AddParam(cmd, "RPREN", RPREN);
if (!string.IsNullOrEmpty(RPNUM))
{
cmd.CommandText += " AND RPNUM = @RPNUM ";
AddParam(cmd, "RPNUM", RPNUM);
}
if (RPRDT.HasValue)
{
cmd.CommandText += " AND RPRDT = @RPRDT ";
AddParam(cmd, "RPRDT", RPRDT);
}
if (RPEDT.HasValue)
{
cmd.CommandText += " AND RPEDT = @RPEDT ";
AddParam(cmd, "RPEDT", RPEDT);
}
if (!string.IsNullOrEmpty(RPRTM))
{
cmd.CommandText += " AND RPRTM = @RPRTM ";
AddParam(cmd, "RPRTM", RPRTM);
}
if (!string.IsNullOrEmpty(RPETM))
{
cmd.CommandText += " AND RPETM = @RPETM";
AddParam(cmd, "RPETM", RPETM);
}
return WDAC.GetInt32Value(Query.ExecuteScalar(cmd)) > 0;
}
///
/// 取得當月加班時數(包含未簽核完成)
///
///
///
///
public int Select當月加班時數(DateTime 年月, string 人員編號, string 排除單號)
{
DateTime 月初 = 年月.AddDays(-年月.Day + 1);
string SQL = @"
SELECT ISNULL(SUM(A.RPTCT), 0)
FROM RPAR A
WHERE RPNUM = @RPNUM
AND (
(RPRDT >= @RPRDT1 AND RPRDT < @RPRDT2)
OR (RPEDT >= @RPRDT1 AND RPEDT < @RPRDT2)
OR (RPRDT < @RPRDT1 AND RPEDT >= @RPRDT2)
)
AND RPTYP LIKE '1%' -- 加班單
AND RPAPN <> 'D' -- 排除抽單
AND (RPAPP <> 'N' OR RPAPP IS NULL) -- 排除簽核不通過
AND RPREN <> @EXT_RPREN -- 排除某單號
";
DbCommand cmd = Query.NewCommand();
cmd.CommandText = String.Format(SQL, "");
AddParam(cmd, "RPNUM", 人員編號);
AddParam(cmd, "RPRDT1", 月初);
AddParam(cmd, "RPRDT2", 月初.AddMonths(1));
AddParam(cmd, "EXT_RPREN", 排除單號);
return WDAC.GetInt32Value(Query.ExecuteScalar(cmd));
}
public static string GetAttachLink(string RPREN, Page page)
{
var link = "";
var allFiles = Directory.GetFiles(PublicVariable.RPARAttachPath).ToList();
var f = allFiles.Find(p => Path.GetFileName(p).StartsWith(RPREN + "."));
if (!String.IsNullOrEmpty(f) && File.Exists(f))
{
link += string.Format("檢視附件1 ",
page.ResolveClientUrl("~/UploadedPicture/RPAR_ATTACHMENT/"), Path.GetFileName(f));
}
f = allFiles.Find(p => Path.GetFileName(p).StartsWith(RPREN + "_2."));
if (!String.IsNullOrEmpty(f) && File.Exists(f))
{
link += string.Format("檢視附件2 ",
page.ResolveClientUrl("~/UploadedPicture/RPAR_ATTACHMENT/"), Path.GetFileName(f));
}
f = allFiles.Find(p => Path.GetFileName(p).StartsWith(RPREN + "_3."));
if (!String.IsNullOrEmpty(f) && File.Exists(f))
{
link += string.Format("檢視附件3 ",
page.ResolveClientUrl("~/UploadedPicture/RPAR_ATTACHMENT/"), Path.GetFileName(f));
}
if (link.Length > 0)
{
return link;
}
else
return "無附件";
}
private static bool GetAttachExists(string RPREN, string fileNo)
{
var allFiles = Directory.GetFiles(PublicVariable.RPARAttachPath).ToList();
return !String.IsNullOrEmpty(allFiles.Find(p => Path.GetFileName(p).StartsWith(RPREN + fileNo + ".")));
}
public static bool GetAttach1Exists(string RPREN)
{
return GetAttachExists(RPREN, "");
}
public static bool GetAttach2Exists(string RPREN)
{
return GetAttachExists(RPREN, "_2");
}
public static bool GetAttach3Exists(string RPREN)
{
return GetAttachExists(RPREN, "_3");
}
private static void DeleteAttach(string RPREN, string fileNo)
{
var allFiles = Directory.GetFiles(PublicVariable.RPARAttachPath).ToList();
var file = allFiles.Find(p => Path.GetFileName(p).StartsWith(RPREN + fileNo + "."));
if (!String.IsNullOrEmpty(file) && File.Exists(file))
File.Delete(file);
}
public static void DeleteAttach1(string RPREN)
{
DeleteAttach(RPREN, "");
}
public static void DeleteAttach2(string RPREN)
{
DeleteAttach(RPREN, "_2");
}
public static void DeleteAttach3(string RPREN)
{
DeleteAttach(RPREN, "_3");
}
///
/// 打卡是否正常
///
/// 日期
/// 員工編號
/// 派駐專案
/// 是否要上班
/// 上班打卡
/// 下班打卡
/// 外出打卡
/// 返回打卡
///
public 打卡檢查Item IsPunchcardNormal(DateTime date
, string bpeno
, string rapyn
, bool isDuty
, string rcc01
, string rcc02
, string rcc07
, string rcc08)
{
// 不檢查打卡的
var cmdNoCheck = Query.NewCommand(
@"SELECT COUNT(*)
FROM NO_PUNCH_CHECK
WHERE CATEGORY = 'BPENO' AND VALUE = @BPENO
OR CATEGORY = 'RAPYN' AND VALUE = RIGHT(@RAPYN, LEN(VALUE))");
Query.AddParam(cmdNoCheck, "BPENO", bpeno);
Query.AddParam(cmdNoCheck, "RAPYN", rapyn);
if (GetInt32Value(Query.ExecuteScalar(cmdNoCheck)) > 0)
{
return new 打卡檢查Item();
}
TimeCalc timeCalc = new TimeCalc();
if (isDuty)
{
// 取得員工當日班表
timeCalc.Init(bpeno, date);
// 有打卡
if (!string.IsNullOrEmpty(rcc01) && !string.IsNullOrEmpty(rcc02))
{
// 計算打卡分鐘數
var onDutyMinutes = TimeCalc.計算分鐘數(rcc01, rcc02) - timeCalc.計算午休分鐘數(rcc01, rcc02);
// 若有外出打卡要扣除
if (!string.IsNullOrEmpty(rcc07) && !string.IsNullOrEmpty(rcc08))
{
onDutyMinutes -= TimeCalc.計算分鐘數(rcc07, rcc08) - timeCalc.計算午休分鐘數(rcc07, rcc08);
}
// 如果打卡分鐘數不夠
if (onDutyMinutes < timeCalc.上班分鐘數)
{
// 加上請假出差分鐘數
DataTable tableRpar = Select出勤資料By人員(date, bpeno);
foreach (DataRow rowRpar in tableRpar.Rows)
{
onDutyMinutes += WDAC.GetInt32Value(rowRpar["請假"]);
onDutyMinutes += WDAC.GetInt32Value(rowRpar["出差"]);
}
// 若分鐘數還不夠,列入發郵件
if (onDutyMinutes < timeCalc.上班分鐘數)
{
return new 打卡檢查Item(false, 打卡檢查Item.時數不足);
}
}
}
// 沒有打卡
else
{
// 取得請假與差旅單
DataTable tableRpar = Select出勤資料By人員(date, bpeno);
var offDutyMinutes = 0;
foreach (DataRow rowRpar in tableRpar.Rows)
{
offDutyMinutes += WDAC.GetInt32Value(rowRpar["請假"]);
offDutyMinutes += WDAC.GetInt32Value(rowRpar["出差"]);
}
// 若分鐘數還不夠,列入發郵件
if (offDutyMinutes < timeCalc.上班分鐘數)
{
return new 打卡檢查Item(false, 打卡檢查Item.時數不足);
}
}
}
// 檢查是否連續七天打卡
RcrdDAC rcrdDao = new RcrdDAC(Query);
if (rcrdDao.PunchDaysIn7Days(date, bpeno, true) >= 7)
return new 打卡檢查Item(false, 打卡檢查Item.打卡異常);
return new 打卡檢查Item();
}
private const string RparGridColumns =
@"TRDAT, TRMOD, TRUSR, RPREN, RPNUM, RAITM, RPCNM, RPPYN, RPRDT, RPEDT, RPTYP, FLOOR(RPTCT / 60) AS RPTCT, RPFTR, RPDOC,
APPNO, RPAPP, RPAPD, RPAPU, RPADT, RPAPN, RPANO, RPAGT, RPRTM, RPETM, RPUST, RPTC1, RPTC2, RPTC3,
RPRSN, RPAGM, ISNULL(RPTCT - FLOOR(RPTCT / 60) * 60, 0) AS RPTMT";
private const string RparGridWhere = " WHERE ((RPAPN IS NULL) OR ((RPAPN<>'D') AND (RPAPN=RPANO))) ";
///
/// 差勤紀錄 Grid 分頁查詢
///
[DataObjectMethod(DataObjectMethodType.Select)]
public DataTable SelectPage(int startRowIndex, int maximumRows, string RPPYN, string RPNUM1, string RPNUM2, string RPRDT1, string RPRDT2, string rparType)
{
DbCommand cmd = Query.NewCommand();
StringBuilder filter = new StringBuilder();
BuildRparGridFilter(filter, cmd, RPPYN, RPNUM1, RPNUM2, RPRDT1, RPRDT2, rparType);
cmd.CommandText = String.Format(
@"SELECT * FROM
(
SELECT {0}, ROW_NUMBER() OVER (ORDER BY RPREN) AS ROWID
FROM RPAR {1} {2}
) AS TMP
WHERE ROWID BETWEEN @STARTROWINDEX + 1 AND @STARTROWINDEX + @MAXIMUMROWS
ORDER BY ROWID",
RparGridColumns, RparGridWhere, filter.ToString());
cmd.Parameters.Add(Query.NewParameter("STARTROWINDEX", startRowIndex));
cmd.Parameters.Add(Query.NewParameter("MAXIMUMROWS", maximumRows));
return Query.Select(cmd);
}
///
/// 差勤紀錄 Grid 查詢筆數
///
[DataObjectMethod(DataObjectMethodType.Select)]
public int SelectCount(string RPPYN, string RPNUM1, string RPNUM2, string RPRDT1, string RPRDT2, string rparType)
{
DbCommand cmd = Query.NewCommand();
StringBuilder filter = new StringBuilder();
BuildRparGridFilter(filter, cmd, RPPYN, RPNUM1, RPNUM2, RPRDT1, RPRDT2, rparType);
cmd.CommandText = String.Format("SELECT COUNT(*) FROM RPAR {0} {1}", RparGridWhere, filter.ToString());
return WDAC.GetInt32Value(Query.ExecuteScalar(cmd));
}
private void BuildRparGridFilter(StringBuilder sb, DbCommand cmd, string RPPYN, string RPNUM1, string RPNUM2, string RPRDT1, string RPRDT2, string rparType)
{
switch (rparType)
{
case "0":
sb.Append(" AND RPTYP LIKE '0%' ");
break;
case "1":
sb.Append(" AND RPTYP LIKE '1%' ");
break;
case "21":
sb.Append(" AND RPTYP = '21' ");
break;
case "22":
sb.Append(" AND RPTYP = '22' ");
break;
case "3":
sb.Append(" AND RPTYP LIKE '3%' ");
break;
}
if (!string.IsNullOrEmpty(RPPYN))
{
sb.Append(" AND RPPYN = @RPPYN1 ");
cmd.Parameters.Add(Query.NewParameter("RPPYN1", RPPYN));
}
AppendRparRange(sb, cmd, "RPNUM", RPNUM1, RPNUM2, true);
AppendRparRange(sb, cmd, "RPRDT", RPRDT1, RPRDT2, false);
}
private void AppendRparRange(StringBuilder sb, DbCommand cmd, string field, string value1, string value2, bool like)
{
bool has1 = !string.IsNullOrEmpty(value1);
bool has2 = !string.IsNullOrEmpty(value2);
if (has1 && has2)
{
sb.AppendFormat(" AND {0} >= @{0}1 AND {0} <= @{0}2 ", field);
cmd.Parameters.Add(Query.NewParameter(field + "1", value1));
cmd.Parameters.Add(Query.NewParameter(field + "2", value2));
}
else if (has1)
{
if (like)
{
sb.AppendFormat(" AND {0} LIKE @{0}1 ", field);
cmd.Parameters.Add(Query.NewParameter(field + "1", value1 + "%"));
}
else
{
sb.AppendFormat(" AND {0} >= @{0}1 ", field);
cmd.Parameters.Add(Query.NewParameter(field + "1", value1));
}
}
else if (has2)
{
if (like)
{
sb.AppendFormat(" AND {0} LIKE @{0}2 ", field);
cmd.Parameters.Add(Query.NewParameter(field + "2", value2 + "%"));
}
else
{
sb.AppendFormat(" AND {0} <= @{0}2 ", field);
cmd.Parameters.Add(Query.NewParameter(field + "2", value2));
}
}
}
///
/// 差勤紀錄 Grid 分頁查詢 (員工本人)
///
[DataObjectMethod(DataObjectMethodType.Select)]
public DataTable SelectWorkerPage(int startRowIndex, int maximumRows, string RPNUM_FIXED, string RPRDT1, string RPRDT2, string rparType)
{
DbCommand cmd = Query.NewCommand();
StringBuilder filter = new StringBuilder();
BuildWorkerGridFilter(filter, cmd, RPNUM_FIXED, RPRDT1, RPRDT2, rparType);
cmd.CommandText = String.Format(
@"SELECT * FROM
(
SELECT {0}, ROW_NUMBER() OVER (ORDER BY RPREN) AS ROWID
FROM RPAR {1}
) AS TMP
WHERE ROWID BETWEEN @STARTROWINDEX + 1 AND @STARTROWINDEX + @MAXIMUMROWS
ORDER BY ROWID",
RparGridColumns, filter.ToString());
cmd.Parameters.Add(Query.NewParameter("STARTROWINDEX", startRowIndex));
cmd.Parameters.Add(Query.NewParameter("MAXIMUMROWS", maximumRows));
return Query.Select(cmd);
}
///
/// 差勤紀錄 Grid 查詢筆數 (員工本人)
///
[DataObjectMethod(DataObjectMethodType.Select)]
public int SelectWorkerCount(string RPNUM_FIXED, string RPRDT1, string RPRDT2, string rparType)
{
DbCommand cmd = Query.NewCommand();
StringBuilder filter = new StringBuilder();
BuildWorkerGridFilter(filter, cmd, RPNUM_FIXED, RPRDT1, RPRDT2, rparType);
cmd.CommandText = String.Format("SELECT COUNT(*) FROM RPAR {0}", filter.ToString());
return WDAC.GetInt32Value(Query.ExecuteScalar(cmd));
}
private void BuildWorkerGridFilter(StringBuilder sb, DbCommand cmd, string RPNUM_FIXED, string RPRDT1, string RPRDT2, string rparType)
{
sb.Append(" WHERE RPNUM = @RPNUM_FIXED ");
cmd.Parameters.Add(Query.NewParameter("RPNUM_FIXED", RPNUM_FIXED));
switch (rparType)
{
case "0":
sb.Append(" AND RPTYP LIKE '0%' AND RPADT IS NOT NULL ");
break;
case "1":
sb.Append(" AND RPTYP LIKE '1%' AND RPADT IS NOT NULL ");
break;
case "3":
sb.Append(" AND RPTYP LIKE '3%' AND RPADT IS NOT NULL ");
break;
}
AppendRparRange(sb, cmd, "RPRDT", RPRDT1, RPRDT2, false);
}
}
public class 差勤日報表Item
{
public string 年度接單編號 { get; set; }
public string 員工編號 { get; set; }
public string 員工姓名 { get; set; }
public string 類別 { get; set; }
public string 類別名稱 { get; set; }
public DateTime 起日 { get; set; }
public string 起時 { get; set; }
public DateTime 迄日 { get; set; }
public string 迄時 { get; set; }
public double 時數 { get; set; }
public double 分數 { get; set; }
public string 站別編號 { get; set; }
public string 站別名稱 { get; set; }
public string 出差地點 { get; set; }
}
public class 補休明細Item
{
public string 類別 { get; set; }
public string 員工編號 { get; set; }
public string 單號 { get; set; }
public DateTime 日期 { get; set; }
public double 可用時數 { get; set; }
public double 可用分數 { get; set; }
public DateTime 有效期限 { get; set; }
}
public class 打卡檢查Item
{
public bool 正常 { get; set; }
public string 異常訊息 { get; set; }
public const string 時數不足 = "打卡時數 + 請假時數 + 差勤時數不足當天應上班時數";
public const string 打卡異常 = "連續 7 天打卡";
public 打卡檢查Item()
{
this.正常 = true;
this.異常訊息 = String.Empty;
}
public 打卡檢查Item(bool 正常, string 異常訊息) : this()
{
this.正常 = 正常;
this.異常訊息 = 異常訊息;
}
}