chore: 首次簽入 Thinkyu ASP.NET 專案
- 加入 Visual Studio / ASP.NET .gitignore - 排除建置輸出、IDE 設定、NuGet packages、大型 MSI 安裝檔
This commit is contained in:
@@ -0,0 +1,280 @@
|
||||
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;
|
||||
|
||||
/// <summary>
|
||||
/// 補休補登以及沖補登
|
||||
/// </summary>
|
||||
[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();
|
||||
}
|
||||
|
||||
/// <param name="rbeno">員工編號</param>
|
||||
/// <param name="rpdat">請假日期</param>
|
||||
/// <returns></returns>
|
||||
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<RBTCT)
|
||||
AND RBDAT < @TODAY -- 20160429 增加加班日期需小於今天的條件
|
||||
AND RBDAT >= 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));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 沖補休補登
|
||||
/// </summary>
|
||||
/// <param name="tran">要參加的交易</param>
|
||||
/// <param name="rbren">請假單號</param>
|
||||
/// <param name="rbeno">員工編號</param>
|
||||
/// <param name="rbdat">請假日期</param>
|
||||
/// <param name="rbtct">請假時數</param>
|
||||
/// <param name="備註">補休備註</param>
|
||||
/// <returns>剩餘時數</returns>
|
||||
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<RBTCT)
|
||||
ORDER BY RBDAT, RBREN";
|
||||
AddParam(cmd, "RBENO", rbeno);
|
||||
AddParam(cmd, "RBDAT", rbdat.AddMonths(-otd));
|
||||
AddParam(cmd, "TODAY", DateTime.UtcNow.AddHours(8).Date);
|
||||
DataTable data = Query.Select(cmd, tran);
|
||||
|
||||
// 準備新增補休補登沖帳檔 SQL
|
||||
DbCommand cmdInsertRbsb = Query.NewCommand();
|
||||
cmdInsertRbsb.CommandText =
|
||||
@"INSERT INTO RBSB
|
||||
(RBREN, RBREX, RBTCT, TRDAT, TRMOD, TRUSR)
|
||||
VALUES
|
||||
(@RBREN, @RBREX, @RBTCT, GETDATE(), 'INSERT', @TRUSR)";
|
||||
|
||||
// 準備回填已沖時數 SQL
|
||||
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<string> RbsaRbren = new List<string>();
|
||||
|
||||
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<string> RbsaRbren = new List<string>();
|
||||
|
||||
// 還原被沖銷單據的被沖銷時數
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user