Files
sryang 577060bc78 chore: 首次簽入 Thinkyu ASP.NET 專案
- 加入 Visual Studio / ASP.NET .gitignore
- 排除建置輸出、IDE 設定、NuGet packages、大型 MSI 安裝檔
2026-09-10 09:42:37 +08:00

788 lines
30 KiB
C#

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;
using NPOI.SS.Formula.Functions;
using System.IdentityModel.Claims;
using Microsoft.Win32;
/// <summary>
/// 年度特休
/// </summary>
[DataObject]
public class RyerDAC : Wellan.Data.WDAC
{
public RyerDAC()
{
}
public RyerDAC(string connectionConfig, string connectionConfigName)
: this()
{
this._connectionConfig = connectionConfig;
this._connectionConfigName = connectionConfigName;
}
public RyerDAC(WQuery query)
{
this._query = query;
}
[DataObjectMethod(DataObjectMethodType.Select)]
public DataTable SelectProject(int RYYERFrom, int RYYERTo, string RAPYN, string RANUM)
{
string select = @"SELECT A.RANUM AS RYENO
, A.BPYER AS RYYER
, B.BPNME
, B.BPSDY
, B.BPEDY
, C.RYYST
, '' AS RYYST_H
, '' AS RYYST_M
, ISNULL(C.RYYXT, 0) AS RYYXT
, '' AS RYYXT_D
, ISNULL(C.RYTOT, 0) / 60 AS RYTOT
, ISNULL(C.RYH01, 0) / 60 AS RYH01
, ISNULL(C.RYH02, 0) / 60 AS RYH02
, ISNULL(C.RYH03, 0) / 60 AS RYH03
, ISNULL(C.RYH04, 0) / 60 AS RYH04
, ISNULL(C.RYH05, 0) / 60 AS RYH05
, ISNULL(C.RYH06, 0) / 60 AS RYH06
, ISNULL(C.RYH07, 0) / 60 AS RYH07
, ISNULL(C.RYH08, 0) / 60 AS RYH08
, ISNULL(C.RYH09, 0) / 60 AS RYH09
, ISNULL(C.RYH10, 0) / 60 AS RYH10
, ISNULL(C.RYH11, 0) / 60 AS RYH11
, ISNULL(C.RYH12, 0) / 60 AS RYH12
, ISNULL(C.RYD01, 1) AS RYD01
, ISNULL(C.RYD02, 1) AS RYD02
, ISNULL(C.RYD03, 1) AS RYD03
, ISNULL(C.RYD04, 1) AS RYD04
, ISNULL(C.RYD05, 1) AS RYD05
, ISNULL(C.RYD06, 1) AS RYD06
, ISNULL(C.RYD07, 1) AS RYD07
, ISNULL(C.RYD08, 1) AS RYD08
, ISNULL(C.RYD09, 1) AS RYD09
, ISNULL(C.RYD10, 1) AS RYD10
, ISNULL(C.RYD11, 1) AS RYD11
, ISNULL(C.RYD12, 1) AS RYD12
, '' AS RYVLD
, '' AS RYUST
, '' AS RYLFT
, '' AS RYPLF
, ISNULL(C.RYSLY, 0) AS RYSLY
, ISNULL(C.RYNXT, 0) AS RYNXT
, '' AS RYSLY_H
, '' AS RYSLY_M
, '' AS RYNXT_H
, '' AS RYNXT_M
, C.RYRMK";
if (RAPYN == "103JYB00001" || RAPYN == "103TYB00001")
{
RYYERTo = RYYERFrom;
}
DbCommand cmd = Query.NewCommand();
if (RYYERFrom != RYYERTo)
{
cmd.CommandText = string.Format(
@"{0}
FROM (SELECT DISTINCT RASN.RANUM, BPAA.BPYER + @CY11 BPYER
FROM RASN
JOIN BPAA on RASN.RAPYN = BPAA.BPPYN
WHERE (BPYER + @CY11 >= @RYYER_FROM AND BPYER + @CY11 <= @RYYER_TO)
AND (RASN.RAPYN = @RAPYN OR @RAPYN = '') -- 跨年度查詢忽略專案條件
AND (RASN.RANUM = @RANUM OR @RANUM = '')
) A
JOIN BPSNView B ON A.RANUM=B.BPENO -- AND (B.BPEDY IS NULL OR YEAR(B.BPEDY) = BPYER)
LEFT JOIN RYER C ON A.RANUM=C.RYENO AND A.BPYER = C.RYYER
ORDER BY (CASE WHEN BPEDY IS NULL THEN 0 ELSE 1 END), RYENO, BPYER"
, select);
}
else
{
cmd.CommandText = string.Format(
@"{0}
FROM (SELECT DISTINCT RASN.RANUM, @RYYER_FROM BPYER
FROM RASN
WHERE (RASN.RAPYN = @RAPYN OR @RAPYN = '')
AND (RASN.RANUM = @RANUM OR @RANUM = '')
-- AND (RASN.RAEDT IS NULL OR YEAR(RASN.RAEDT) = @RYYER_FROM) -- 加上專案結束日為空或年度=查詢年度
) A
JOIN BPSNView B ON A.RANUM=B.BPENO -- AND (B.BPEDY IS NULL OR YEAR(B.BPEDY) = BPYER)
LEFT JOIN RYER C ON A.RANUM=C.RYENO AND A.BPYER = C.RYYER
ORDER BY (CASE WHEN BPEDY IS NULL THEN 0 ELSE 1 END), RYENO, BPYER"
, select);
}
cmd.Parameters.Clear();
Query.AddParam(cmd, "CY11", WGuard1.CY11);
Query.AddParam(cmd, "RANUM", RANUM);
Query.AddParam(cmd, "RAPYN", RAPYN);
Query.AddParam(cmd, "RYYER_FROM", RYYERFrom);
Query.AddParam(cmd, "RYYER_TO", RYYERTo);
DataTable result = Query.Select(cmd);
var nowtime = DateTime.UtcNow.AddHours(8);
int month = nowtime.Month;
int day = nowtime.Day;
foreach (DataRow r in result.Rows)
{
var ryyer = WDAC.GetInt32Value(r["RYYER"]);
var ryeno = WDAC.GetStringValue(r["RYENO"]);
if (ryyer < nowtime.Year)
{
month = 12;
day = 31;
}
r.BeginEdit();
int 年初特休 = Get年初特休(ryeno, ryyer);
int 可用特休 = Get可用特休(ryeno, ryyer, month, day);
int 至今生效特休 = Get至今生效特休(ryeno, ryyer, month, day);
int 已休時數 = 年初特休 + 至今生效特休 - 可用特休;
int 上年未休 = Get可用特休(ryeno, ryyer - 1, 12, 31);
r["RYYST_H"] = String.Format("{0}", GetInt32Value(GetInt32Value(r["RYYST"]) / 60));
r["RYYST_M"] = String.Format("{0:00}", GetInt32Value(GetInt32Value(r["RYYST"]) % 60));
r["RYYXT_D"] = String.Format("{0}:{1:00}", GetInt32Value(GetInt32Value(r["RYYXT"]) / 60), GetInt32Value(r["RYYXT"]) % 60);
r["RYVLD"] = String.Format("{0}:{1:00}", GetInt32Value(至今生效特休 / 60), 至今生效特休 % 60);
r["RYUST"] = String.Format("{0}:{1:00}", GetInt32Value(已休時數 / 60), 已休時數 % 60);
r["RYLFT"] = String.Format("{0}:{1:00}", GetInt32Value(可用特休 / 60), 可用特休 % 60);
r["RYPLF"] = String.Format("{0}:{1:00}", GetInt32Value(上年未休 / 60), 上年未休 % 60);
r["RYSLY_H"] = String.Format("{0}", GetInt32Value(GetInt32Value(r["RYSLY"]) / 60));
r["RYSLY_M"] = String.Format("{0:00}", GetInt32Value(r["RYSLY"]) % 60);
r["RYNXT_H"] = String.Format("{0}", GetInt32Value(GetInt32Value(r["RYNXT"]) / 60));
r["RYNXT_M"] = String.Format("{0:00}", GetInt32Value(r["RYNXT"]) % 60);
r.EndEdit();
r.AcceptChanges();
}
return result;
}
/// <summary>
/// 取得某人某年還有多少特休
/// </summary>
/// <param name="RYENO">員工編號</param>
/// <param name="year">年</param>
/// <param name="month">月</param>
/// <param name="day">日</param>
/// <param name="addYearBegin">加入年初已生效時數</param>
/// <param name="substrateOffHours">減去本年已休時數</param>
public int DoGet可用特休(string RYENO, int year, int month, int day, bool addYearBegin, bool substrateOffHours)
{
// 取得總時數
if (month < 1) month = 1;
if (month > 12) month = 12;
List<string> monthsql = new List<string>();
if (addYearBegin)
{
monthsql.Add("ISNULL(RYYST, 0)"); // 年初生效時數
monthsql.Add("ISNULL(RYYXT, 0)"); // 上年遞延時數
}
for (int i = 1; i < month; i++)
{
monthsql.Add(string.Format("ISNULL(RYH{0:00}, 0)", i));
}
monthsql.Add(string.Format("ISNULL(CASE WHEN @RYDAY >= ISNULL(RYD{0:00}, 1) THEN RYH{0:00} ELSE 0 END, 0)", month));
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
string.Format(@"SELECT {0}
FROM RYER
WHERE RYYER=@RYYER
AND RYENO=@RYENO", string.Join("+", monthsql.ToArray()));
cmd.Parameters.Clear();
Query.AddParam(cmd, "RYYER", year);
Query.AddParam(cmd, "RYENO", RYENO);
Query.AddParam(cmd, "RYDAY", day);
int 總時數 = GetInt32Value(Query.ExecuteScalar(cmd));
// 取得已休時數
int 已休時數 = 0;
if (substrateOffHours)
{
cmd.CommandText =
@"SELECT ISNULL(SUM(RPTCT), 0)
FROM RPAR
WHERE RPNUM = @RYENO
AND RPTYP = '01'
AND YEAR(RPRDT) = @RYYER
AND YEAR(RPEDT) = @RYYER
AND (MONTH(RPRDT) < @RYMON or MONTH(RPRDT) = @RYMON AND DAY(RPRDT) <= @RYDAY)
AND (RPAPN IS NULL OR RPAPN <> 'D' AND (RPAPP IS NULL OR RPAPP <> 'N'))";
cmd.Parameters.Clear();
Query.AddParam(cmd, "RYENO", RYENO);
Query.AddParam(cmd, "RYYER", year);
Query.AddParam(cmd, "RYMON", month);
Query.AddParam(cmd, "RYDAY", day);
已休時數 += GetInt32Value(Query.ExecuteScalar(cmd));
}
return 總時數 - 已休時數;
}
public int Get可用特休(string RYENO, int year, int month, int day)
{
return DoGet可用特休(RYENO, year, month, day, true, true);
}
public int Get至今生效特休(string RYENO, int year, int month, int day)
{
return DoGet可用特休(RYENO, year, month, day, false, false);
}
public int Get年初特休(string RYENO, int year)
{
return DoGet可用特休(RYENO, year, 1, 0, true, false);
}
public int Get上年結轉(string RYENO, int year)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"SELECT RYNXT
FROM RYER
WHERE RYYER=@RYYER
AND RYENO=@RYENO";
cmd.Parameters.Clear();
Query.AddParam(cmd, "RYYER", year - 1);
Query.AddParam(cmd, "RYENO", RYENO);
return GetInt32Value(Query.ExecuteScalar(cmd));
}
[DataObjectMethod(DataObjectMethodType.Update)]
public void UpdateOne(
string old_ryeno
, int old_ryyer
, int rytot
, string trusr
, int ryyst
, int ryh01
, int ryh02
, int ryh03
, int ryh04
, int ryh05
, int ryh06
, int ryh07
, int ryh08
, int ryh09
, int ryh10
, int ryh11
, int ryh12
, int ryd01
, int ryd02
, int ryd03
, int ryd04
, int ryd05
, int ryd06
, int ryd07
, int ryd08
, int ryd09
, int ryd10
, int ryd11
, int ryd12
, int rysly
, int rynxt
, string ryrmk
)
{
DbCommand cmd = Query.NewCommand();
if (!CheckExists(old_ryeno, old_ryyer))
{
cmd.CommandText =
@"INSERT INTO RYER
(TRDAT, TRMOD, TRUSR, RYENO, RYYER, RYTOT, RYUST, RYYST,
RYH01, RYH02, RYH03, RYH04, RYH05, RYH06, RYH07, RYH08, RYH09, RYH10, RYH11, RYH12,
RYD01, RYD02, RYD03, RYD04, RYD05, RYD06, RYD07, RYD08, RYD09, RYD10, RYD11, RYD12,
RYSLY, RYNXT, RYRMK
)
VALUES
(GETDATE(), 'INSERT', @TRUSR, @RYENO, @RYYER, @RYTOT, 0, @RYYST,
@RYH01, @RYH02, @RYH03, @RYH04, @RYH05, @RYH06, @RYH07, @RYH08, @RYH09, @RYH10, @RYH11, @RYH12,
@RYD01, @RYD02, @RYD03, @RYD04, @RYD05, @RYD06, @RYD07, @RYD08, @RYD09, @RYD10, @RYD11, @RYD12,
@RYSLY, @RYNXT, @RYRMK
)";
cmd.Parameters.Clear();
Query.AddParam(cmd, "TRUSR", trusr);
Query.AddParam(cmd, "RYENO", old_ryeno);
Query.AddParam(cmd, "RYYER", old_ryyer);
Query.AddParam(cmd, "RYTOT", rytot);
Query.AddParam(cmd, "RYYST", ryyst);
Query.AddParam(cmd, "RYH01", ryh01);
Query.AddParam(cmd, "RYH02", ryh02);
Query.AddParam(cmd, "RYH03", ryh03);
Query.AddParam(cmd, "RYH04", ryh04);
Query.AddParam(cmd, "RYH05", ryh05);
Query.AddParam(cmd, "RYH06", ryh06);
Query.AddParam(cmd, "RYH07", ryh07);
Query.AddParam(cmd, "RYH08", ryh08);
Query.AddParam(cmd, "RYH09", ryh09);
Query.AddParam(cmd, "RYH10", ryh10);
Query.AddParam(cmd, "RYH11", ryh11);
Query.AddParam(cmd, "RYH12", ryh12);
Query.AddParam(cmd, "RYD01", ryd01);
Query.AddParam(cmd, "RYD02", ryd02);
Query.AddParam(cmd, "RYD03", ryd03);
Query.AddParam(cmd, "RYD04", ryd04);
Query.AddParam(cmd, "RYD05", ryd05);
Query.AddParam(cmd, "RYD06", ryd06);
Query.AddParam(cmd, "RYD07", ryd07);
Query.AddParam(cmd, "RYD08", ryd08);
Query.AddParam(cmd, "RYD09", ryd09);
Query.AddParam(cmd, "RYD10", ryd10);
Query.AddParam(cmd, "RYD11", ryd11);
Query.AddParam(cmd, "RYD12", ryd12);
Query.AddParam(cmd, "RYSLY", rysly);
Query.AddParam(cmd, "RYNXT", rynxt);
Query.AddParam(cmd, "RYRMK", ryrmk);
Query.ExecuteNonQuery(cmd);
}
else
{
cmd.CommandText =
@"UPDATE RYER
SET TRDAT = GETDATE() ,
TRMOD = 'UPDATE' ,
TRUSR = @TRUSR ,
RYTOT = @RYTOT ,
RYYST = @RYYST ,
RYH01 = @RYH01 ,
RYH02 = @RYH02 ,
RYH03 = @RYH03 ,
RYH04 = @RYH04 ,
RYH05 = @RYH05 ,
RYH06 = @RYH06 ,
RYH07 = @RYH07 ,
RYH08 = @RYH08 ,
RYH09 = @RYH09 ,
RYH10 = @RYH10 ,
RYH11 = @RYH11 ,
RYH12 = @RYH12 ,
RYD01 = @RYD01 ,
RYD02 = @RYD02 ,
RYD03 = @RYD03 ,
RYD04 = @RYD04 ,
RYD05 = @RYD05 ,
RYD06 = @RYD06 ,
RYD07 = @RYD07 ,
RYD08 = @RYD08 ,
RYD09 = @RYD09 ,
RYD10 = @RYD10 ,
RYD11 = @RYD11 ,
RYD12 = @RYD12 ,
RYSLY = @RYSLY ,
RYNXT = @RYNXT ,
RYRMK = @RYRMK
WHERE RYENO = @OLD_RYENO
AND RYYER = @OLD_RYYER";
cmd.Parameters.Clear();
Query.AddParam(cmd, "TRUSR", trusr);
Query.AddParam(cmd, "RYTOT", rytot);
Query.AddParam(cmd, "RYYST", ryyst);
Query.AddParam(cmd, "RYH01", ryh01);
Query.AddParam(cmd, "RYH02", ryh02);
Query.AddParam(cmd, "RYH03", ryh03);
Query.AddParam(cmd, "RYH04", ryh04);
Query.AddParam(cmd, "RYH05", ryh05);
Query.AddParam(cmd, "RYH06", ryh06);
Query.AddParam(cmd, "RYH07", ryh07);
Query.AddParam(cmd, "RYH08", ryh08);
Query.AddParam(cmd, "RYH09", ryh09);
Query.AddParam(cmd, "RYH10", ryh10);
Query.AddParam(cmd, "RYH11", ryh11);
Query.AddParam(cmd, "RYH12", ryh12);
Query.AddParam(cmd, "RYD01", ryd01);
Query.AddParam(cmd, "RYD02", ryd02);
Query.AddParam(cmd, "RYD03", ryd03);
Query.AddParam(cmd, "RYD04", ryd04);
Query.AddParam(cmd, "RYD05", ryd05);
Query.AddParam(cmd, "RYD06", ryd06);
Query.AddParam(cmd, "RYD07", ryd07);
Query.AddParam(cmd, "RYD08", ryd08);
Query.AddParam(cmd, "RYD09", ryd09);
Query.AddParam(cmd, "RYD10", ryd10);
Query.AddParam(cmd, "RYD11", ryd11);
Query.AddParam(cmd, "RYD12", ryd12);
Query.AddParam(cmd, "RYSLY", rysly);
Query.AddParam(cmd, "RYNXT", rynxt);
Query.AddParam(cmd, "RYRMK", ryrmk);
Query.AddParam(cmd, "OLD_RYENO", old_ryeno);
Query.AddParam(cmd, "OLD_RYYER", old_ryyer);
Query.ExecuteNonQuery(cmd);
}
}
[DataObjectMethod(DataObjectMethodType.Delete)]
public void DeleteOne(string OLD_RYENO, int OLD_RYYER)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"UPDATE FROM RYER
WHERE RYENO = @RYENO
AND RYYER = @RYYER";
cmd.Parameters.Clear();
Query.AddParam(cmd, "RYENO", OLD_RYENO);
Query.AddParam(cmd, "RYYER", OLD_RYYER);
Query.ExecuteNonQuery(cmd);
}
public bool CheckExists(string RYENO, int RYYER)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"SELECT COUNT(1) FROM RYER
WHERE RYENO = @RYENO
AND RYYER = @RYYER";
cmd.Parameters.Clear();
Query.AddParam(cmd, "RYENO", RYENO);
Query.AddParam(cmd, "RYYER", RYYER);
return GetInt32Value(Query.ExecuteScalar(cmd)) > 0;
}
/// <summary>
/// 沖特休
/// </summary>
/// <param name="RYENO">員工編號</param>
/// <param name="RYYER">年</param>
/// <param name="特休">特休分鐘數</param>
/// <param name="tran"></param>
public void 沖特休(string RYENO, int RYYER, int 特休, DbTransaction tran)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText =
@"UPDATE RYER
SET RYUST = ISNULL(RYUST, 0) + @RYUST
WHERE RYENO=@RYENO AND RYYER=@RYYER";
cmd.Parameters.Clear();
Query.AddParam(cmd, "RYENO", RYENO);
Query.AddParam(cmd, "RYYER", RYYER);
Query.AddParam(cmd, "RYUST", 特休);
if (tran != null)
{
cmd.Connection = tran.Connection;
cmd.Transaction = tran;
cmd.ExecuteNonQuery();
}
else
{
Query.ExecuteNonQuery(cmd);
}
}
public void 取消沖特休(DbTransaction tran, string _RPREN)
{
DbCommand cmd = Query.NewCommand();
cmd.CommandText = @"SELECT RPNUM, RPRDT, RPTCT FROM RPAR WHERE RPREN=@RPREN";
Query.AddParam(cmd, "RPREN", _RPREN);
DataTable t = Query.Select(cmd, tran);
if (t.Rows.Count > 0)
{
string User = WDAC.GetStringValue(t.Rows[0]["RPNUM"]);
DateTime 舊日期 = WDAC.GetDateTimeValue(t.Rows[0]["RPRDT"]);
int 舊時數 = WDAC.GetInt32Value(t.Rows[0]["RPTCT"]);
沖特休(User, 舊日期.Year, -舊時數, tran);
}
}
/// <summary>
/// 結算特休
/// </summary>
/// <param name="ryeno">員工編號</param>
/// <param name="ryyer">年度</param>
/// <param name="trusr">操作人員</param>
public string Final(
string ryeno
, int ryyer
, string trusr
)
{
var rasnDao = new RasnDAC(Query);
var rsajDao = new RsajDAC(Query);
var bpaaDao = new BpaaDAC(Query);
MWEB unmweb = new MWEB();
DbCommand cmd = Query.NewCommand();
// 取出今年
cmd.CommandText = @"select * from RYER where RYENO=@RYENO AND RYYER=@RYYER";
cmd.Parameters.Clear();
Query.AddParam(cmd, "RYENO", ryeno);
Query.AddParam(cmd, "RYYER", ryyer);
var thisYear = Query.Select(cmd);
if (thisYear.Rows.Count <= 0)
{
throw new Exception("找不到可結算的資料");
}
var thisRecord = thisYear.Rows[0];
if (GetInt32Value(thisRecord["RYNXT"]) + GetInt32Value(thisRecord["RYSLY"]) != Get可用特休(ryeno, ryyer, 12, 31))
{
throw new Exception("折算薪資時數 + 遞延下年時數 應等於 本年未休時數");
}
// 計算下年時數
// 取得派駐專案
var project = rasnDao.SelectRecentByDate(ryeno, new DateTime(ryyer, 12, 01));
var rapyn = GetStringValue(project.Rows[0]["RAPYN"]);
// 取得派駐專案的年初特休計算方式
var alt = bpaaDao.GetYearBeginAnnualLeaveType(rapyn);
// 年初時數
var ryyst = 0;
if (alt == "S")
{
ryyst = GetInt32Value(thisRecord["RYYST"]);
for (int m = 1; m <= 12; m++)
{
var ryhmm = GetInt32Value(thisRecord[string.Format("RYH{0:D2}", m)]);
ryyst += ryhmm > 0 ? ryhmm : 0;
}
}
var ryyxt = GetInt32Value(thisRecord["RYNXT"]); // 遞延下年時數
var rysly = GetInt32Value(thisRecord["RYSLY"]); // 結算薪資時數
// 若未輸入離職日期
var bpsnDao = new BpsnDAC(Query);
var bpedy = bpsnDao.GetBPEDY(ryeno);
if (bpedy.Ticks == 0)
{
if (!CheckExists(ryeno, ryyer + 1))
{
cmd.CommandText =
@"INSERT INTO RYER
(TRDAT, TRMOD, TRUSR, RYENO, RYYER, RYTOT, RYUST, RYYST,
RYH01, RYH02, RYH03, RYH04, RYH05, RYH06, RYH07, RYH08, RYH09, RYH10, RYH11, RYH12,
RYD01, RYD02, RYD03, RYD04, RYD05, RYD06, RYD07, RYD08, RYD09, RYD10, RYD11, RYD12,
RYSLY, RYNXT, RYRMK, RYYXT
)
VALUES
(GETDATE(), 'INSERT', @TRUSR, @RYENO, @RYYER, @RYTOT, 0, @RYYST,
@RYH01, @RYH02, @RYH03, @RYH04, @RYH05, @RYH06, @RYH07, @RYH08, @RYH09, @RYH10, @RYH11, @RYH12,
@RYD01, @RYD02, @RYD03, @RYD04, @RYD05, @RYD06, @RYD07, @RYD08, @RYD09, @RYD10, @RYD11, @RYD12,
@RYSLY, @RYNXT, @RYRMK, @RYYXT
)";
cmd.Parameters.Clear();
Query.AddParam(cmd, "TRUSR", trusr);
Query.AddParam(cmd, "RYENO", ryeno);
Query.AddParam(cmd, "RYYER", ryyer + 1);
Query.AddParam(cmd, "RYTOT", ryyst);
Query.AddParam(cmd, "RYYST", ryyst);
Query.AddParam(cmd, "RYH01", 0);
Query.AddParam(cmd, "RYH02", 0);
Query.AddParam(cmd, "RYH03", 0);
Query.AddParam(cmd, "RYH04", 0);
Query.AddParam(cmd, "RYH05", 0);
Query.AddParam(cmd, "RYH06", 0);
Query.AddParam(cmd, "RYH07", 0);
Query.AddParam(cmd, "RYH08", 0);
Query.AddParam(cmd, "RYH09", 0);
Query.AddParam(cmd, "RYH10", 0);
Query.AddParam(cmd, "RYH11", 0);
Query.AddParam(cmd, "RYH12", 0);
Query.AddParam(cmd, "RYD01", 1);
Query.AddParam(cmd, "RYD02", 1);
Query.AddParam(cmd, "RYD03", 1);
Query.AddParam(cmd, "RYD04", 1);
Query.AddParam(cmd, "RYD05", 1);
Query.AddParam(cmd, "RYD06", 1);
Query.AddParam(cmd, "RYD07", 1);
Query.AddParam(cmd, "RYD08", 1);
Query.AddParam(cmd, "RYD09", 1);
Query.AddParam(cmd, "RYD10", 1);
Query.AddParam(cmd, "RYD11", 1);
Query.AddParam(cmd, "RYD12", 1);
Query.AddParam(cmd, "RYSLY", 0);
Query.AddParam(cmd, "RYNXT", 0);
Query.AddParam(cmd, "RYRMK", "");
Query.AddParam(cmd, "RYYXT", ryyxt);
Query.ExecuteNonQuery(cmd);
}
else
{
cmd.CommandText =
@"UPDATE RYER
SET TRDAT = GETDATE() ,
TRMOD = 'UPDATE' ,
TRUSR = @TRUSR ,
RYTOT = @RYTOT ,
RYYST = @RYYST ,
RYSLY = @RYSLY ,
RYNXT = @RYNXT ,
RYYXT = @RYYXT
WHERE RYENO = @OLD_RYENO
AND RYYER = @OLD_RYYER";
cmd.Parameters.Clear();
Query.AddParam(cmd, "TRUSR", trusr);
Query.AddParam(cmd, "RYTOT", ryyst);
Query.AddParam(cmd, "RYYST", ryyst);
Query.AddParam(cmd, "RYSLY", 0);
Query.AddParam(cmd, "RYNXT", 0);
Query.AddParam(cmd, "RYYXT", ryyxt);
Query.AddParam(cmd, "OLD_RYENO", ryeno);
Query.AddParam(cmd, "OLD_RYYER", ryyer + 1);
Query.ExecuteNonQuery(cmd);
}
var finalDate = new DateTime(ryyer, 12, 01);
// 取得派駐專案
project = rasnDao.SelectRecentByDate(ryeno, finalDate);
if (project.Rows.Count == 0)
{
throw new Exception("人員無派遣紀錄,無法結算");
}
rapyn = GetStringValue(project.Rows[0]["RAPYN"]);
// 取得結算單號
var finalREN = rsajDao.GetAnnualLeaveSalaryREN(finalDate, ryeno, rapyn);
// 若結算單號已存在,需要有權限的人員才可以執行
if (!string.IsNullOrEmpty(finalREN) && !unmweb.CheckRight("RYER_FINAL", WRightName.Execute, UserId))
{
throw new Exception("已經結算過,你沒有權限再次結算");
}
WriteAnnualLeaveSalary(ryeno, finalDate, rysly, false);
return "年度結算";
}
// 離職日期是今年才要結算
else if (bpedy.Year == ryyer)
{
var finalDate = new DateTime(bpedy.Year, bpedy.Month, 01);
// 取得派駐專案
project = rasnDao.SelectRecentByDate(ryeno, finalDate);
if (project.Rows.Count == 0)
{
throw new Exception("人員無派遣紀錄,無法結算");
}
rapyn = GetStringValue(project.Rows[0]["RAPYN"]);
// 取得結算單號
var finalREN = rsajDao.GetAnnualLeaveSalaryREN(finalDate, ryeno, rapyn);
// 若結算單號已存在,需要有權限的人員才可以執行
if (!string.IsNullOrEmpty(finalREN) && !unmweb.CheckRight("RYER_FINAL", WRightName.Execute, UserId))
{
throw new Exception("已經結算過,你沒有權限再次結算");
}
WriteAnnualLeaveSalary(ryeno, finalDate, rysly, true);
return "離職結算";
}
//
throw new Exception("離職日期年度不是本年,不予結算");
}
/// <summary>
/// 寫入特休薪資結算
/// </summary>
/// <param name="ryeno">人員編號</param>
/// <param name="date">結算日期</param>
/// <param name="rysly">結算時數</param>
/// <param name="isQuit">是否離職</param>
internal void WriteAnnualLeaveSalary(string ryeno, DateTime date, int rysly, bool isQuit)
{
var rasnDao = new RasnDAC(Query);
var rsajDao = new RsajDAC(Query);
GetData getData = new GetData();
Calculate calc = new Calculate();
getData.Query = Query;
// 取得派駐專案
var project = rasnDao.SelectRecentByDate(ryeno, date);
if (project.Rows.Count == 0)
{
throw new Exception("人員無派遣紀錄,無法結算");
}
var rapyn = GetStringValue(project.Rows[0]["RAPYN"]);
// 取得月薪
// 取得計算公式
int bpsrm; // 月薪
int bpp02; // 伙食津貼
double dumm1; // 前二加班比率
double dumm2; // 後二加班比率
double dumm3; // 假日加班比率
string bpovr; // 加班費公式
string dumm4; // 請假扣款公式
string dumm5; // 加班費計算方式
// 取得月薪、伙食津貼、前二加班比率、後二加班比率、假日加班比率、加班費公式、請假扣款公式
getData.GetRASN_Date_Bppyn_Bpeno_Overwork_Rate(
date, rapyn, ryeno, out bpsrm, out bpp02, out dumm1, out dumm2, out dumm3, out bpovr, out dumm4, out dumm5);
// 計算特休薪資
var rsamt = GetInt32Value(Math.Truncate(calc.CalcOverTime(bpsrm, bpp02, rysly, 1.0, 1.0, bpovr)));
// 寫入離職當月薪資加減項
var rsdoc = isQuit
? string.Format("{0}離職特休結算{1}小時", date.ToString("yyyyMMdd", WGuard1.TaiwanCulture), (int)(rysly / 60))
: string.Format("{0}年度特休結算{1}小時", date.ToString("yyyy", WGuard1.TaiwanCulture), (int)(rysly / 60));
var rsajRen = rsajDao.WriteAnnualLeaveSalary(date, ryeno, rapyn, rsamt, rsdoc);
}
}
public class RyerSaveItem
{
public int result;
public string message;
public string userid;
public string ryeno;
public int ryyer;
public int? ryyst;
public int? ryyst_h;
public int? ryyst_m;
public int ryyxt;
public string ryyxt_d;
public int ryh01;
public int ryh02;
public int ryh03;
public int ryh04;
public int ryh05;
public int ryh06;
public int ryh07;
public int ryh08;
public int ryh09;
public int ryh10;
public int ryh11;
public int ryh12;
public int ryd01;
public int ryd02;
public int ryd03;
public int ryd04;
public int ryd05;
public int ryd06;
public int ryd07;
public int ryd08;
public int ryd09;
public int ryd10;
public int ryd11;
public int ryd12;
public int? rysly;
public int? rysly_h;
public int? rysly_m;
public int? rynxt;
public int? rynxt_h;
public int? rynxt_m;
public string ryrmk;
public string ryvld;
public string ryust;
public string rylft;
public string ryeny;
public int rymmy;
public int ryslq;
public string ryenq;
public int rymmq;
}