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);
}
}
}