using System; using System.Data; using System.Configuration; using System.Data.Common; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using Wellan.Data; using Wellan.Common; /// /// 補休補登以及沖補登 /// [DataObject] public class RbsaDAC : Wellan.Data.WDAC { public RbsaDAC() { } public RbsaDAC(string connectionConfig, string connectionConfigName) : this() { this._connectionConfig = connectionConfig; this._connectionConfigName = connectionConfigName; } public RbsaDAC(WQuery query) { this._query = query; } [DataObjectMethod(DataObjectMethodType.Select)] public DataTable Select(string RBPYN) { DbCommand cmd = Query.NewCommand(); cmd.CommandText = @"SELECT RBREN, RBENO, RBPYN, RBDAT, RBTCT / 60 AS RBTCT, RBUST FROM RBSA WHERE RBPYN=@RBPYN ORDER BY RBENO, RBDAT"; cmd.Parameters.Clear(); Query.AddParam(cmd, "RBPYN", RBPYN); return Query.Select(cmd); } [DataObjectMethod(DataObjectMethodType.Insert)] public void InsertOne(string RBENO, string RBPYN, DateTime RBDAT, int RBTCT, string TRUSR) { DbCommand cmd = Query.NewCommand(); cmd.CommandText = @"INSERT INTO RBSA (RBREN, RBENO, RBPYN, RBDAT, RBTCT, RBUST, TRDAT, TRMOD, TRUSR) VALUES (@RBREN, @RBENO, @RBPYN, @RBDAT, @RBTCT, 0, GETDATE(), 'INSERT', @TRUSR)"; cmd.Parameters.Clear(); Query.AddParam(cmd, "RBREN", NextRBREN(RBDAT)); Query.AddParam(cmd, "RBENO", RBENO); Query.AddParam(cmd, "RBPYN", RBPYN); Query.AddParam(cmd, "RBDAT", RBDAT); Query.AddParam(cmd, "RBTCT", RBTCT * 60); Query.AddParam(cmd, "TRUSR", TRUSR); Query.ExecuteNonQuery(cmd); } [DataObjectMethod(DataObjectMethodType.Update)] public void UpdateOne(string OLD_RBREN, string RBENO, string RBPYN, DateTime RBDAT, int RBTCT, string TRUSR) { DbCommand cmd = Query.NewCommand(); cmd.CommandText = @"UPDATE RBSA SET TRDAT = GETDATE() , TRMOD = 'UPDATE' , TRUSR = @TRUSR , RBENO = @RBENO , RBPYN = @RBPYN , RBDAT = @RBDAT , RBTCT = @RBTCT WHERE RBREN = @RBREN"; cmd.Parameters.Clear(); Query.AddParam(cmd, "TRUSR", TRUSR); Query.AddParam(cmd, "RBENO", RBENO); Query.AddParam(cmd, "RBPYN", RBPYN); Query.AddParam(cmd, "RBDAT", RBDAT); Query.AddParam(cmd, "RBTCT", RBTCT * 60); Query.AddParam(cmd, "RBREN", OLD_RBREN); Query.ExecuteNonQuery(cmd); } [DataObjectMethod(DataObjectMethodType.Delete)] public void DeleteOne(string OLD_RBREN) { DbCommand cmd = Query.NewCommand(); cmd.CommandText = @"DELETE FROM RBSA WHERE RBREN = @RBREN"; cmd.Parameters.Clear(); Query.AddParam(cmd, "RBREN", OLD_RBREN); Query.ExecuteNonQuery(cmd); } public string NextRBREN(DateTime RBDAT) { DbCommand cmd = Query.NewCommand(); cmd.CommandText = @"DECLARE @MAXRBREN NVARCHAR(10) DECLARE @YYMM NVARCHAR(6) DECLARE @SERIAL NVARCHAR(4) SELECT @MAXRBREN = ISNULL(MAX(RBREN), @RBREN1) FROM RBSA WHERE RBREN > @RBREN1 AND RBREN <= @RBREN2 SET @YYMM = SUBSTRING(@MAXRBREN, 1, 6) SET @SERIAL = SUBSTRING(@MAXRBREN, 7, 4) SELECT @YYMM + RIGHT('0000' + CAST(CAST(@SERIAL AS INT) + 1 AS NVARCHAR(4)), 4)"; cmd.Parameters.Clear(); Query.AddParam(cmd, "RBREN1", RBDAT.ToString("yyyyMM", WGuard1.InvariantCulture) + "0000"); Query.AddParam(cmd, "RBREN2", RBDAT.ToString("yyyyMM", WGuard1.InvariantCulture) + "9999"); return Query.ExecuteScalar(cmd).ToString(); } /// 員工編號 /// 請假日期 /// public int Get可用補休(string rbeno, DateTime rpdat) { // 取得員工在請假日期所在專案的補休期限設定 int otd = new GetData(Query).GetBPOTD_DATE_BPENO(rpdat, rbeno); DbCommand cmd = Query.NewCommand(); cmd.CommandText = @" SELECT SUM(RBTCT - ISNULL(RBUST, 0)) FROM RBSA WHERE RBENO = @RBENO AND RBDAT >= @RBDAT AND (RBUST IS NULL OR RBUST= dbo.BPSDY(@RBENO) -- 加班日期大於到職日的條件 "; AddParam(cmd, "RBENO", rbeno); AddParam(cmd, "RBDAT", rpdat.AddMonths(-otd)); AddParam(cmd, "TODAY", DateTime.UtcNow.AddHours(8).Date); return WDAC.GetInt32Value(Query.ExecuteScalar(cmd)); } /// /// 沖補休補登 /// /// 要參加的交易 /// 請假單號 /// 員工編號 /// 請假日期 /// 請假時數 /// 補休備註 /// 剩餘時數 public int 沖補休(DbTransaction tran, string rbren, string rbeno, DateTime rbdat, int rbtct, out string 備註) { 備註 = ""; // 取得員工在請假日期所在專案的補休期限設定 int otd = new GetData(Query).GetBPOTD_DATE_BPENO(rbdat, rbeno); // 取出可沖補休補登單 DbCommand cmd = Query.NewCommand(); cmd.CommandText = @"SELECT RBREN, RBENO, RBPYN, RBDAT, RBTCT, RBUST FROM RBSA WHERE RBENO = @RBENO AND RBDAT >= @RBDAT -- 補休6個月之內有效 AND RBDAT >= dbo.BPSDY(@RBENO) -- 到職日之後 AND RBDAT < @TODAY -- 今天之前 AND (RBUST IS NULL OR RBUST RbsaRbren = new List(); foreach (DataRow row in data.Rows) { // 一筆一筆的寫沖銷紀錄 string rbren1 = WDAC.GetStringValue(row["RBREN"]); int rbtct1 = WDAC.GetInt32Value(row["RBTCT"]); int rbust1 = WDAC.GetInt32Value(row["RBUST"]); DateTime rbdat1 = WDAC.GetDateTimeValue(row["RBDAT"]); int tct = rbtct > rbtct1 - rbust1 ? rbtct1 - rbust1 : rbtct; rbtct -= tct; // 新增補休補登沖帳檔 AddParam(cmdInsertRbsb, "RBREN", rbren); AddParam(cmdInsertRbsb, "RBREX", rbren1); AddParam(cmdInsertRbsb, "RBTCT", tct); AddParam(cmdInsertRbsb, "TRUSR", rbeno); Query.ExecuteNonQuery(tran.Connection, tran, cmdInsertRbsb); 備註 += String.Format("{0:MM/dd}-{1}、", rbdat1, tct / 60); if (!RbsaRbren.Contains(rbren1)) RbsaRbren.Add(rbren1); if (rbtct <= 0) break; } // 重新加總 RBSA 的已用時數 foreach (string rbren1 in RbsaRbren) { AddParam(cmdUpdateRbsa, "RBREN", rbren1); Query.ExecuteNonQuery(tran.Connection, tran, cmdUpdateRbsa); } // 回傳未沖完的時數 return rbtct; } public void 取消沖補休(DbTransaction tran, string rbren) { // 取出本張單據沖銷的紀錄 DbCommand cmd = Query.NewCommand(); cmd.CommandText = @"SELECT RBREN, RBREX, RBTCT FROM RBSB WHERE RBREN=@RBREN"; AddParam(cmd, "RBREN", rbren); DataTable data = Query.Select(cmd, tran); DbCommand cmdDeleteRbsb = Query.NewCommand(); cmdDeleteRbsb.CommandText = @"DELETE FROM RBSB WHERE RBREN = @RBREN AND RBREX = @RBREX"; DbCommand cmdUpdateRbsa = Query.NewCommand(); cmdUpdateRbsa.CommandText = @"UPDATE RBSA SET RBUST = (SELECT SUM(RBTCT) FROM RBSB WHERE RBREX=RBSA.RBREN) WHERE RBREN = @RBREN"; // 用來儲存要重新加總的 RBSA 的 RBREN,以免 RBSA 重複 UPDATE 被 LOCK List RbsaRbren = new List(); // 還原被沖銷單據的被沖銷時數 foreach (DataRow row in data.Rows) { string rprex1 = WDAC.GetStringValue(row["RBREX"]); int rptct1 = WDAC.GetInt32Value(row["RBTCT"]); AddParam(cmdDeleteRbsb, "RBREN", rbren); AddParam(cmdDeleteRbsb, "RBREX", rprex1); Query.ExecuteNonQuery(tran.Connection, tran, cmdDeleteRbsb); if (!RbsaRbren.Contains(rprex1)) RbsaRbren.Add(rprex1); } // 重新加總 RBSA 的已用時數 foreach (string rbren1 in RbsaRbren) { AddParam(cmdUpdateRbsa, "RBREN", rbren1); Query.ExecuteNonQuery(tran.Connection, tran, cmdUpdateRbsa); } } }