using Mono.Security.Cryptography; using System; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Security.Cryptography; using System.Text; using System.Web.UI; using System.Web.UI.WebControls; using Wellan.Data; /// /// 每月出勤薪資匯總計算 /// public partial class forms_summary_fmSalaryCalc : Wellan.Web.UI.WUserControlBase { /// /// 計算年月 /// private DateTime aYYMM; private DbConnection conn; private DbCommand cmdInsertSACD; private DbCommand cmdDeleteSACD; private DbCommand cmdDeleteAllSACD; private DbCommand cmdSelectSACD; private DbCommand cmdUpdateSACD; private DbCommand cmdCloseBPAA; private string _BPPYN; protected string _BPYMM; private GetData _getData; private Bhif bhif; private Blif blif; private Blra blra; private SsmsDAC ssmsDao; private RcrdDAC rcrdDao; private RparDAC rparDao; protected void Page_Load(object sender, EventArgs e) { } protected override void OnInit(EventArgs e) { base.OnInit(e); _getData = new GetData(); _getData.Query = Query; conn = Query.NewConnection(); ssmsDao = new SsmsDAC(Query); ssmsDao.TRUSR = UserId; #region INIT SQLCOMMAND cmdInsertSACD = Query.NewCommand( @"INSERT INTO SACD (SAPYN, SAYMM, SAACC, SAAMT, SADOC, TRDAT, TRMOD, TRUSR) VALUES (@SAPYN, @SAYMM, @SAACC, @SAAMT, @SADOC, GETDATE(), 'INSERT', 'X001')"); cmdInsertSACD.Parameters.Add(Query.NewParameter("SAPYN", DbType.String)); cmdInsertSACD.Parameters.Add(Query.NewParameter("SAYMM", DbType.DateTime)); cmdInsertSACD.Parameters.Add(Query.NewParameter("SAACC", DbType.String)); cmdInsertSACD.Parameters.Add(Query.NewParameter("SAAMT", DbType.Int32)); cmdInsertSACD.Parameters.Add(Query.NewParameter("SADOC", DbType.String)); cmdInsertSACD.Connection = conn; cmdDeleteSACD = Query.NewCommand( @"DELETE FROM SACD WHERE SAPYN=@SAPYN AND SAYMM=@SAYMM AND SAACC=@SAACC"); cmdDeleteSACD.Parameters.Add(Query.NewParameter("SAPYN", DbType.String)); cmdDeleteSACD.Parameters.Add(Query.NewParameter("SAYMM", DbType.DateTime)); cmdDeleteSACD.Parameters.Add(Query.NewParameter("SAACC", DbType.String)); cmdDeleteSACD.Connection = conn; cmdDeleteAllSACD = Query.NewCommand( @"DELETE FROM SACD WHERE SAPYN=@SAPYN AND SAYMM=@SAYMM"); cmdDeleteAllSACD.Parameters.Add(Query.NewParameter("SAPYN", DbType.String)); cmdDeleteAllSACD.Parameters.Add(Query.NewParameter("SAYMM", DbType.DateTime)); cmdDeleteAllSACD.Connection = conn; cmdSelectSACD = Query.NewCommand( @"SELECT COUNT(1) FROM SACD WHERE SAPYN=@SAPYN AND SAYMM=@SAYMM AND SAACC=@SAACC"); cmdSelectSACD.Parameters.Add(Query.NewParameter("SAPYN", DbType.String)); cmdSelectSACD.Parameters.Add(Query.NewParameter("SAYMM", DbType.DateTime)); cmdSelectSACD.Parameters.Add(Query.NewParameter("SAACC", DbType.String)); cmdSelectSACD.Connection = conn; cmdUpdateSACD = Query.NewCommand( @"UPDATE SACD SET SAAMT=@SAAMT WHERE SAPYN=@SAPYN AND SAYMM=@SAYMM AND SAACC=@SAACC"); cmdUpdateSACD.Parameters.Add(Query.NewParameter("SAAMT", DbType.Int32)); cmdUpdateSACD.Parameters.Add(Query.NewParameter("SAPYN", DbType.String)); cmdUpdateSACD.Parameters.Add(Query.NewParameter("SAYMM", DbType.DateTime)); cmdUpdateSACD.Parameters.Add(Query.NewParameter("SAACC", DbType.String)); cmdUpdateSACD.Connection = conn; cmdCloseBPAA = Query.NewCommand("UPDATE BPAA SET BPMSD=@BPMSD WHERE BPPYN=@BPPYN"); cmdCloseBPAA.Parameters.Add(Query.NewParameter("BPMSD", DbType.DateTime)); cmdCloseBPAA.Parameters.Add(Query.NewParameter("BPPYN", DbType.String)); cmdCloseBPAA.Connection = conn; #endregion _BPPYN = GetStringParam("BPPYN"); _BPYMM = GetStringParam("BPYMM"); if (_BPPYN != "" && _BPYMM != "") { cvMessage.IsValid = true; cvMessage.ErrorMessage = ""; MultiView1.ActiveViewIndex = 1; pnBPSXX.Visible = true; bool result = true; aYYMM = CheckDate(_BPYMM + "01", "請輸入正確的年月", ref result, cvMessage); if (!result) return; ddlRSPYN.DataSource = new BpaaDAC().GetBpaaWithTY(aYYMM.Year); ddlRSPYN.DataBind(); //ddlRSPYN.SQL = "SELECT BPPYN, BPPYM FROM BPAA WHERE BPYER=" + (aYYMM.Year - WGuard1.CY11).ToString() + " ORDER BY BPPYN"; ddlRSPYN.SelectedValue = _BPPYN; lbYYMM.Text = _BPYMM; } else { SetClientFocus(txtYYMM); } } protected bool CheckProjectRight() { // 檢查此使用者是否有權限處理這個專案 BprmDAC bprm = new BprmDAC(Query); if (!bprm.GetRight(ddlRSPYN.SelectedValue, UserId)) { //MultiView1.Visible = false; cvMessage.ErrorMessage = "對不起,你沒有處理這個專案的權限!"; cvMessage.IsValid = false; return false; } return true; } /// /// 計算薪資 /// /// 起始日期 /// 結束日期 /// 月薪 /// 伙食津貼 /// 本月天數 /// 本月月初日 /// 本月月底日 /// 到職天數 /// 本月薪資 /// 本月伙食津貼 /// 薪資破月計算方式(1=除以30, 2=除以實際日數) protected void CalcSalary(DateTime startDate, DateTime endDate, int bpsrm, int bpp02, int monthEndDay, ref DateTime thisMonthStartDay, ref DateTime thisMonthEndDay, ref int thisMonthDays, ref int monthSalary, ref int foodBonus, string bpsal) { int startDay = startDate <= aYYMM ? 1 : startDate.Day; int endDay = (endDate.Ticks == 0) || (aYYMM.Year != endDate.Year || aYYMM.Month != endDate.Month) ? monthEndDay : endDate.Day; if (thisMonthStartDay.Ticks == 0) thisMonthStartDay = aYYMM.AddDays(startDay - 1); thisMonthEndDay = aYYMM.AddDays(endDay - 1); // 決定月天數 (1=30日, 2=該月實際日數) int calcMonthDays = 30; if (bpsal == "2") { calcMonthDays = monthEndDay; } // 若破月,則以 (月薪 / 月天數) * 天數 來計算 if (startDay != 1 || endDay != monthEndDay) { int thisPartDays = endDay - startDay + 1; thisMonthDays += thisPartDays; // 本月開始日是月初,且本月結束日是月底的話,修正天數 if (thisMonthStartDay == aYYMM && thisMonthEndDay == aYYMM.AddMonths(1).AddDays(-1)) { thisMonthDays -= thisPartDays; thisPartDays = calcMonthDays - thisMonthDays; thisMonthDays = calcMonthDays; } // 若累積起來的天數超過月天數,修正這部份的天數 if (thisMonthDays > calcMonthDays) { thisPartDays -= thisMonthDays - calcMonthDays; } foodBonus += Convert.ToInt32(Math.Round(Convert.ToDecimal(bpp02) / Convert.ToDecimal(calcMonthDays) * Convert.ToDecimal(thisPartDays), MidpointRounding.AwayFromZero)); monthSalary += Convert.ToInt32(Math.Round(Convert.ToDecimal(bpsrm - bpp02) / Convert.ToDecimal(calcMonthDays) * Convert.ToDecimal(thisPartDays), MidpointRounding.AwayFromZero)); } else { thisMonthDays += monthEndDay; foodBonus += bpp02; monthSalary += bpsrm - bpp02; } } /// /// 計算出勤紀錄與加班費,包括單筆輸入的以及匯總輸入的 /// /// 計算起始日 /// 計算結束日 /// 專案年度編號 /// 人員編號 /// 差勤結算日 /// 月薪 /// 伙食津貼 /// 前二比例 /// 後二比例 /// 假日比例 /// 計算公式 /// 加班時數計算方式 /// 專案派遣起始日 /// 專案派遣結束日 /// 要加入的交易 /// 加班費計算物件 /// 加班備註 protected void CalcWork(DateTime startDay, DateTime endDay, string rapyn, string bpeno, int bpfed, int bpsrm, int bpp02, double bpbft, double bpaft, double bphol, string formula, string bpott, DateTime rasdt, DateTime raedt, DbTransaction tran, ref ExtraWork extraWork, ref string SSC02) { // 出勤紀錄 //DataTable rcrd = rcrdDao.SelectPeriod(bpeno, startDay, endDay); BhrdDAC bhrdDao = new BhrdDAC(); RPARRecord rparRecord = new RPARRecord(); // 加班單筆輸入 DataTable rpar1 = _getData.GetRPAR1X(aYYMM, rapyn, startDay, endDay, rasdt, raedt, bpeno, bpfed, tran); StringBuilder sb1 = new StringBuilder(); foreach (DataRow rparRow in rpar1.Rows) { rparRecord.FillRecord(rparRow); ExtraWorkData extraData; extraData = extraWork.Add(rparRecord.RPTYP, rparRecord.RPRDT, rparRecord.RPTCT, bpsrm, bpp02, bpbft, bpaft, bphol, formula, bpott, rparRecord.RPTC1, rparRecord.RPTC2, rparRecord.RPTC3, rparRecord.RPTC4, rparRecord.RPTC5); if (rparRecord.RPDOC.Length > 0) sb1.Append(rparRecord.RPDOC + "/"); rparDao.回填加班費(rparRecord.RPREN, WDAC.GetInt32Value(extraData.RPTA1), WDAC.GetInt32Value(extraData.RPTA2), WDAC.GetInt32Value(extraData.RPTA3), WDAC.GetInt32Value(extraData.RPTA4), WDAC.GetInt32Value(extraData.RPTA5), tran); } SSC02 += sb1.Length > 0 ? sb1.ToString(0, sb1.Length - 1) : ""; // 加班匯總輸入 DataTable rowk = _getData.GetROWK(aYYMM, rapyn, bpeno, tran); ROWKRecord rowkRecord = new ROWKRecord(); foreach (DataRow rowkRow in rowk.Rows) { rowkRecord.FillRecord(rowkRow); extraWork.Add(rowkRecord); } } /// /// 計算缺勤扣款 /// /// 計算起始日 /// 計算結束日 /// 專案年度編號 /// 人員編號 /// 差勤結算日 /// 月薪 /// 伙食津貼 /// 計算公式 /// 缺勤扣款計算物件 /// 要加入的交易 /// 缺勤備註 protected void CalcAbsent(DateTime startDay, DateTime endDay, string rapyn, string bpeno, int bpfed, int bpsrm, int bpp02, string formula, DateTime rasdt, DateTime raedt, ref Absent absent, DbTransaction tran, ref string SSC01) { var bp = bpeno == "01698"; DataTable rpar = _getData.GetRPAR0X(aYYMM, rapyn, startDay, endDay, rasdt, raedt, bpeno, bpfed, tran); absent.bpsrm = bpsrm; absent.bpp02 = bpp02; absent.Formula = formula; StringBuilder sb1 = new StringBuilder(); RPARRecord rparRecord = new RPARRecord(); foreach (DataRow rparRow in rpar.Rows) { rparRecord.FillRecord(rparRow); int rpftr = absent.Add(rparRecord, startDay, endDay, true); if (rparRecord.RPDOC.Length > 0) sb1.Append(rparRecord.RPDOC + "/"); rparDao.回填缺勤扣款(rparRecord.RPREN, rpftr, tran); } SSC01 += sb1.Length > 0 ? sb1.ToString(0, sb1.Length - 1) : ""; } /// /// 計算差旅費 /// /// 專案年度編號 /// 人員編號 /// 差勤結算日 /// 差旅費計算物件 /// 要加入的交易 /// 差旅費備註 /// 差旅事由 protected void CalcOutFee(DateTime startDay, DateTime endDay, string rapyn, string bpeno, int bpfed, DateTime rasdt, DateTime raedt, ref OtherFee otherFee, DbTransaction tran, ref string SSC05, ref string SSC07) { DataTable rpar3 = _getData.GetRPAR3X(aYYMM, rapyn, startDay, endDay, rasdt, raedt, bpeno, bpfed, tran); List sb1 = new List(); List sb2 = new List(); RPARRecord rparRecord = new RPARRecord(); foreach (DataRow rparRow in rpar3.Rows) { rparRecord.FillRecord(rparRow); otherFee.Add(rparRecord); if (rparRecord.RPDOC.Length > 0) sb1.Add(rparRecord.RPDOC); if (rparRecord.RPRSN.Length > 0) sb2.Add(rparRecord.RPRSN); } SSC05 += String.Join("/", sb1.ToArray()); SSC07 += String.Join("/", sb2.ToArray()); } /// /// 計算電話費、油料費 /// /// 專案年度編號 /// 人員編號 /// 差勤結算日 /// 差旅費計算物件 /// 要加入的交易 /// 電話費備註 /// 油料費備註 protected void CalcPhoneAndFuelFee(DateTime startDay, DateTime endDay, string rapyn, string bpeno, int bpfed, DateTime rasdt, DateTime raedt, ref OtherFee otherFee, DbTransaction tran, ref string SSC03, ref string SSC04) { DataTable rpar2 = _getData.GetRPAR2X(aYYMM, rapyn, startDay, endDay, rasdt, raedt, bpeno, bpfed, tran); StringBuilder sb1 = new StringBuilder(); StringBuilder sb2 = new StringBuilder(); RPARRecord rparRecord = new RPARRecord(); foreach (DataRow rparRow in rpar2.Rows) { rparRecord.FillRecord(rparRow); otherFee.Add(rparRecord); switch (rparRecord.RPTYP) { case RPAR_TYPE.T21_電話費: if (rparRecord.RPDOC.Length > 0) sb1.Append(rparRecord.RPDOC + "/"); break; case RPAR_TYPE.T22_油料費: if (rparRecord.RPDOC.Length > 0) sb2.Append(rparRecord.RPDOC + "/"); break; } } SSC03 += sb1.Length > 0 ? sb1.ToString(0, sb1.Length - 1) : ""; SSC04 += sb2.Length > 0 ? sb2.ToString(0, sb2.Length - 1) : ""; } /// /// 計算勞健保費 /// /// 計算起始日 /// 計算結束日 /// 人員編號 /// 本月月底日 /// 要加入的交易 /// 健保費 /// 勞保費 /// 勞退金 /// 本月到職天數 /// 公司別 /// 本月勞保天數 /// 派遣結束日 protected void CalcLaborAndHealth(DateTime calcStartDay, DateTime calcEndDay, string bpeno, int monthEndDay, DbTransaction tran, ref HealthInsuranceFee bhifFee, ref LaborInsuranceFee blifFee, ref LaborRetireAnnuity blraFee, int thisMonthDays, string company, ref int thisMonthLaborDays, DateTime rasnEndDate) { var bp = bpeno == "02181"; DataTable rpir勞保 = _getData.GetRPIR(calcStartDay, calcEndDay, bpeno, tran, true); DateTime 本月月初 = new DateTime(calcStartDay.Year, calcStartDay.Month, 1); DateTime 本月月底 = 本月月初.AddMonths(1).AddDays(-1); DataTable rpir健保 = _getData.GetRPIR(本月月初, 本月月底, bpeno, tran, false); RPIRRecord rpirRecord = new RPIRRecord(); #region 1. 計算健保費 if (rpir健保.Rows.Count > 0) { // 先以最後一筆來判斷 rpirRecord.FillRecord(rpir健保.Rows[rpir健保.Rows.Count - 1]); // for debug //WGuard1.WLogFile("D:\\TEMP\\CALC", WGuard1.WLogType.Day, // bpeno + " 加保日 " + rpirRecord.RPSDT.ToString("yyyy-MM-dd") + " 退保日 " + rpirRecord.RPEDT.ToString("yyyy-MM-dd")); // 要計算健保的狀況 // 1. 非當月退保 // 2. 當月月底日退保 而且 當月只有一筆加退保資料 // 3. 當月月底日結束此專案 或 當月月底日仍處於此專案 bool BhifFlag = false; BhifFlag = (company == "" || rpirRecord.RPCPY == company) && rpirRecord.RPEDT.CompareTo(本月月底) >= 0 && (rasnEndDate.Ticks == 0 || rasnEndDate.CompareTo(本月月底) >= 0); if (BhifFlag) { // 取最後一筆來計算 rpirRecord.FillRecord(rpir健保.Rows[rpir健保.Rows.Count - 1]); bhifFee.Assign(bhif.GetFee(rpirRecord.RPAM2, rpirRecord.RPFMY, rpirRecord.RPFM1, rpirRecord.RPFM2, rpirRecord.RPDIH, rpirRecord.RPHIS, rpirRecord.RPPTP)); } } #endregion #region 2. 計算勞保、勞退金、勞退自提、工資墊償 foreach (DataRow rpirRow in rpir勞保.Rows) { rpirRecord.FillRecord(rpirRow); DateTime startDay1 = rpirRecord.RPBDT < calcStartDay ? calcStartDay : rpirRecord.RPBDT; DateTime endDay1 = (rpirRecord.RPXDT.Ticks == 0) || (aYYMM.Year != rpirRecord.RPXDT.Year || aYYMM.Month != rpirRecord.RPXDT.Month) ? calcEndDay : rpirRecord.RPXDT; // 勞保費 blif.Add(rpirRecord.RPAMT, startDay1, endDay1, rpirRecord.GoOut, rpirRecord.RPDIS, rpirRecord.RPLIS, rpirRecord.RPOLD, rpirRecord.RPOVR, rpirRecord.RPPTP, rpirRecord.RPNAT, ref thisMonthLaborDays); // 勞退提撥 blra.Add(rpirRecord.RPAM3, startDay1, endDay1, rpirRecord.RPSLA, rpirRecord.RPPTP, thisMonthDays, rpirRecord.RPNAT); } // 二月、勞保多筆,整月,要補足 30 天 if (aYYMM.Month == 2 && rpir勞保.Rows.Count > 1) { rpirRecord.FillRecord(rpir勞保.Rows[rpir勞保.Rows.Count - 1]); if (thisMonthLaborDays == monthEndDay) { DateTime startDay1 = new DateTime(aYYMM.Year, aYYMM.Month, monthEndDay == 28 ? 27 : 29); DateTime endDay1 = new DateTime(aYYMM.Year, aYYMM.Month, monthEndDay == 28 ? 28 : 29); bool goOut = rpirRecord.TRTYPE == 2; // 勞保費 blif.Add(rpirRecord.RPAMT, startDay1, endDay1, goOut, rpirRecord.RPDIS, rpirRecord.RPLIS, rpirRecord.RPOLD, rpirRecord.RPOVR, rpirRecord.RPPTP, rpirRecord.RPNAT, ref thisMonthLaborDays); // 勞退提撥 blra.Add(rpirRecord.RPAM3, startDay1, endDay1, rpirRecord.RPSLA, rpirRecord.RPPTP, thisMonthDays, rpirRecord.RPNAT); } } blifFee.Add(blif.GetFee()); blraFee.Add(blra.GetFee()); #endregion } /// /// 計算薪資調整加減項 /// /// 人員編號 /// 要加入的交易 /// 其他加項 /// 其他減項 /// 加減項備註 protected void CalcOthers(string rspyn, string bpeno, DbTransaction tran, ref int SSP99, ref int SSS99, ref string SSC06) { DataTable rsaj = new RsajDAC(_getData.Query).GetRSAJ(aYYMM, bpeno, rspyn, tran); StringBuilder sb1 = new StringBuilder(); foreach (DataRow rsajRow in rsaj.Rows) { int rsamt = Convert.ToInt32(rsajRow["RSAMT"]); string rsdoc = rsajRow["RSDOC"].ToString().Trim(); if (rsamt > 0) SSP99 += rsamt; else SSS99 -= rsamt; if (rsdoc.Length > 0) sb1.Append(rsdoc + "/"); } SSC06 += sb1.Length > 0 ? sb1.ToString(0, sb1.Length - 1) : ""; } // 重新計算 protected void btnOk_Click(object sender, EventArgs e) { if (!CheckProjectRight()) return; cvMessage.ErrorMessage = ""; cvMessage.IsValid = true; // 檢查年月是否正確 bool result = true; cvMessage.IsValid = true; cvMessage.ErrorMessage = ""; aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); if (!result) return; BPAARecord bpaaRecord = new BPAARecord(); RASNRecord rasnRecord = new RASNRecord(); ExtraWork extraWork = new ExtraWork(); Absent absent = new Absent(); OtherFee otherFee = new OtherFee(); bhif = new Bhif(aYYMM); blif = new Blif(aYYMM); blra = new Blra(aYYMM); HealthInsuranceFee bhifFee = new HealthInsuranceFee(); LaborInsuranceFee blifFee = new LaborInsuranceFee(); LaborRetireAnnuity blraFee = new LaborRetireAnnuity(); StringBuilder sb = new StringBuilder(); rcrdDao = new RcrdDAC(); rparDao = new RparDAC(); // 取得專案年度接單資料 DataTable bpaa = _getData.GetBPAA_BPPYN(ddlRSPYN.SelectedValue); if (bpaa.Rows.Count == 0) { cvMessage.IsValid = false; cvMessage.ErrorMessage = "無此專案"; return; } bpaaRecord.FillRecord(bpaa.Rows[0]); // 檢查月關帳日 if (bpaaRecord.BPMSD > aYYMM) { cvMessage.IsValid = false; cvMessage.ErrorMessage = "此專案此月份已關帳"; return; } // 取出福利金比率 double fortuneRate = _getData.GetFeeRate("福利金", aYYMM, null); // 取出勞保各項保費比率 blif.NormalFeeRate = _getData.GetFeeRate("勞保普通傷病", aYYMM, null); blif.LostJobFeeRate = _getData.GetFeeRate("勞保就業保險", aYYMM, null); if (bpaaRecord.BPCPY == "TY") blif.InjuryFeeRate = _getData.GetFeeRate("勞保職業災害(新譽)", aYYMM, null); else if (bpaaRecord.BPCPY == "JY") blif.InjuryFeeRate = _getData.GetFeeRate("勞保職業災害(展譽)", aYYMM, null); else blif.InjuryFeeRate = _getData.GetFeeRate("勞保職業災害", aYYMM, null); blif.SalaryReverseFundRate = _getData.GetFeeRate("勞保工資墊償", aYYMM, null); // 取出健保費比率 bhif.HealthInsuranceFeeRate = _getData.GetFeeRate("健保", aYYMM, null); bhif.HealthInsuranceAverageFamily = _getData.GetFeeRate("健保平均眷口數", aYYMM, null); // 準備資料存取物件 conn.Open(); DbTransaction tran = conn.BeginTransaction(); cmdInsertSACD.Transaction = tran; cmdDeleteSACD.Transaction = tran; cmdDeleteAllSACD.Transaction = tran; cmdSelectSACD.Transaction = tran; cmdUpdateSACD.Transaction = tran; try { // 刪除月薪資匯總資料 ssmsDao.Delete(tran, aYYMM, ddlRSPYN.SelectedValue); int monthEndDay = aYYMM.AddMonths(1).AddDays(-1).Day; // 月底日 int bpfed = bpaaRecord.BPFED; // 差勤結算日 #region 專案計算 if (ddlRSPYN.SelectedValue != "000000001") { // 取出此年月此專案派遣的人員 DataTable rasn = _getData.GetRASN_YYMM_BPPYN(aYYMM, bpaaRecord.BPPYN, tran); #region 以派遣紀錄計算員工薪資及勞健保 string bpeno = ""; int thisMonthDays = 0; int thisMonthLaborDays = 0; int monthSalary = 0; int foodBonus = 0; string SSC01 = ""; string SSC02 = ""; string SSC03 = ""; string SSC04 = ""; string SSC05 = ""; string SSC06 = ""; string SSC07 = ""; int SSP99 = 0; int SSS99 = 0; DateTime calcStartDay = new DateTime(); // 本人本月計算起始日 (本人本月在職第一天) DateTime calcEndDay = new DateTime(); // 本人本月計算結束日 (本人本月在職最後一天) for (int i = 0; i < rasn.Rows.Count; i++) { DataRow rasnRow = rasn.Rows[i]; rasnRecord.FillRecord(rasnRow); blif.Clear(); blra.Clear(); // 清除累加用變數 // 下一筆資料與上一筆資料不同人,金額要清除 // (一個人一個月之內多次派遣同一專案,金額要累加) if (bpeno.CompareTo(rasnRecord.RANUM) != 0) { thisMonthDays = 0; thisMonthLaborDays = 0; monthSalary = 0; foodBonus = 0; SSC01 = ""; SSC02 = ""; SSC03 = ""; SSC04 = ""; SSC05 = ""; SSC07 = ""; //SSC06 = ""; //SSP99 = 0; //SSS99 = 0; extraWork.Clear(); absent.Clear(); otherFee.Clear(); bhifFee.Init(); blifFee.Init(); blraFee.Init(); bpeno = rasnRecord.RANUM; } // "其他加減項" 一律清除 (但同一個人同一個月派遣同一專案多次時,只能計算一次) SSC06 = ""; SSP99 = 0; SSS99 = 0; calcStartDay = new DateTime(); calcEndDay = new DateTime(); // 1. 計算薪資,伙食津貼 CalcSalary(rasnRecord.RASDT, rasnRecord.RAEDT, rasnRecord.BPSRM, rasnRecord.BPP02, monthEndDay, ref calcStartDay, ref calcEndDay, ref thisMonthDays, ref monthSalary, ref foodBonus, bpaaRecord.BPSAL); // 2. 計算出勤紀錄與加班費 CalcWork(calcStartDay, calcEndDay, rasnRecord.RAPYN, rasnRecord.RANUM, bpfed, rasnRecord.BPSRM, rasnRecord.BPP02, rasnRecord.BPBFT, rasnRecord.BPAFT, rasnRecord.BPHOL, rasnRecord.BPOVR, bpaaRecord.BPOTT, rasnRecord.RASDT, rasnRecord.RAEDT, tran, ref extraWork, ref SSC02); // 3. 計算缺勤扣款 CalcAbsent(calcStartDay, calcEndDay, rasnRecord.RAPYN, rasnRecord.RANUM, bpfed, rasnRecord.BPSRM, rasnRecord.BPP02, rasnRecord.BPLVE, rasnRecord.RASDT, rasnRecord.RAEDT, ref absent, tran, ref SSC01); // 4. 計算差旅費 CalcOutFee(calcStartDay, calcEndDay, rasnRecord.RAPYN, rasnRecord.RANUM, bpfed, rasnRecord.RASDT, rasnRecord.RAEDT, ref otherFee, tran, ref SSC05, ref SSC07); // 5. 計算電話費、油料費 CalcPhoneAndFuelFee(calcStartDay, calcEndDay, rasnRecord.RAPYN, rasnRecord.RANUM, bpfed, rasnRecord.RASDT, rasnRecord.RAEDT, ref otherFee, tran, ref SSC03, ref SSC04); // 6. 計算勞保、健保、勞退金、勞退自提、工資墊償 CalcLaborAndHealth(calcStartDay, calcEndDay, rasnRecord.RANUM, monthEndDay, tran, ref bhifFee, ref blifFee, ref blraFee, thisMonthDays, bpaaRecord.BPCPY, ref thisMonthLaborDays, rasnRecord.RAEDT); // 7. 計算其他加減項 CalcOthers(rasnRecord.RAPYN, rasnRecord.RANUM, tran, ref SSP99, ref SSS99, ref SSC06); // 下一筆是同一個人, if (i < rasn.Rows.Count - 1 && rasnRecord.RANUM.CompareTo(rasn.Rows[i + 1]["RANUM"]) == 0) { continue; } // 寫入月薪資匯總 #region 寫入月薪資匯總 SsmsRecord ssmsRec = new SsmsRecord(); ssmsRec.SSYMM = aYYMM; // 薪資月份 ssmsRec.SSENO = rasnRecord.RANUM; // 人員編號 ssmsRec.SSNUM = rasnRecord.RACNM; // 客戶編號 ssmsRec.SSPYN = rasnRecord.RAPYN; // 專案年度編號 ssmsRec.SSJNO = rasnRecord.RAJNO; // 職稱 ssmsRec.SSCNO = rasnRecord.RACNO; // 等級 ssmsRec.SSBRH = rasnRecord.RABRH; // 站別 ssmsRec.SSD01 = thisMonthDays; // 到職天數 ssmsRec.SSD02 = blifFee.InWorkDays; // 勞保到職天數 ssmsRec.SSSRD = rasnRecord.BPSRD; // 時薪 ssmsRec.SSP00 = monthSalary; // 本薪 ssmsRec.SSP01 = (absent.AllPresent ? rasnRecord.BPP01 : 0); // 全勤獎金 ssmsRec.SSP02 = foodBonus; // 伙食津貼 ssmsRec.SSP03 = rasnRecord.BPP03; // 職務加給 ssmsRec.SSP04 = rasnRecord.BPP04; // 派駐津貼 ssmsRec.SSP05 = rasnRecord.BPP05; // 其他津貼 ssmsRec.SSP06 = extraWork.RPTA1; // 前二加班 ssmsRec.SSP07 = extraWork.RPTA2; // 後二加班 ssmsRec.SSP08 = extraWork.RPTA3; // 假日加班 ssmsRec.SSP09 = otherFee.ShortTrip; // 短差 ssmsRec.SSP10 = otherFee.LongTrip; // 長差 ssmsRec.SSP11 = otherFee.TelephoneFee; // 電話費 ssmsRec.SSP12 = otherFee.FuelFee; // 油料費 ssmsRec.SSP13 = extraWork.RPTA4; // 加班費2.67 ssmsRec.SSP14 = extraWork.RPTA5; // 加班費2.00 ssmsRec.SSP15 = 0; // 加項15 ssmsRec.SSP99 = SSP99; // 其他加項 ssmsRec.SSS01 = absent.SSS01; // 病假扣款 ssmsRec.SSS02 = absent.SSS02; // 事假扣款 ssmsRec.SSS03 = 0; // 所得稅 ssmsRec.SSS04 = blifFee.TotalPersonalFee; // 勞保費 ssmsRec.SSS05 = bhifFee.PersonalFee; // 健保費 ssmsRec.SSS06 = blraFee.PersonalFee; // 勞退自提 ssmsRec.SSS07 = Convert.ToInt32(Math.Round(Convert.ToDouble(monthSalary + foodBonus) * fortuneRate, MidpointRounding.AwayFromZero)); // 福利金 ssmsRec.SSS08 = 0; // 健保補充保費 ssmsRec.SSS09 = absent.SSS09; // 無薪假扣款 ssmsRec.SSS10 = 0; // 減項10 ssmsRec.SSS11 = 0; // 減項11 ssmsRec.SSS12 = 0; // 減項12 ssmsRec.SSS13 = 0; // 減項13 ssmsRec.SSS14 = 0; // 減項14 ssmsRec.SSS15 = 0; // 減項15 ssmsRec.SSS99 = SSS99; // 其他減項 ssmsRec.SSH01 = Convert.ToInt32(Math.Round(blifFee.NormalCompanyFee, MidpointRounding.AwayFromZero)); // 雇主勞保費 ssmsRec.SSH02 = Convert.ToInt32(Math.Round(blifFee.InjuryCompanyFee, MidpointRounding.AwayFromZero)); // 職災保險 ssmsRec.SSH03 = Convert.ToInt32(Math.Round(blifFee.LostJobCompanyFee, MidpointRounding.AwayFromZero)); // 就業保險 ssmsRec.SSH04 = Convert.ToInt32(Math.Round(blifFee.SalaryReverseFund, MidpointRounding.AwayFromZero)); // 工資墊償 ssmsRec.SSH05 = bhifFee.CompanyFee; // 雇主健保費 ssmsRec.SSH06 = blraFee.CompanyFee; // 勞退提撥 ssmsRec.SSH07 = 0; // 雇主07 ssmsRec.SSH08 = 0; // 雇主08 ssmsRec.SSH09 = 0; // 雇主09 ssmsRec.SSH10 = 0; // 雇主10 ssmsRec.SST01 = extraWork.RPTC1; // 加班1.34時數 ssmsRec.SST02 = extraWork.RPTC2; // 加班1.67時數 ssmsRec.SST03 = extraWork.RPTC3; // 加班1.00時數 ssmsRec.SST04 = extraWork.RelaxationAllowance; // 累積補休時數 ssmsRec.SST06 = absent.SST06; // 特休時數 ssmsRec.SST05 = absent.SST05; // 補休時數 ssmsRec.SST07 = absent.SST07; // 事假時數 ssmsRec.SST08 = absent.SST08; // 病假時數 ssmsRec.SST09 = absent.SST09; // 喪假時數 ssmsRec.SST10 = absent.SST10; // 產假時數 ssmsRec.SST11 = absent.SST11; // 婚假時數 ssmsRec.SST12 = absent.SST12; // 陪產假時數 ssmsRec.SST13 = absent.SST13; // 公假時數 ssmsRec.SST14 = absent.SST14; // 工傷假時數 ssmsRec.SST15 = absent.SST15; // 生理假時數 ssmsRec.SST16 = absent.SST16; // 家庭照顧假時數 ssmsRec.SST17 = absent.SST17; // 育嬰假時數 ssmsRec.SST18 = otherFee.FuelKm; // 油料補助公里數 ssmsRec.SST19 = absent.SST19; // 原民祭儀假時數 ssmsRec.SST20 = absent.SST20; // 產檢假時數時數 ssmsRec.SST21 = extraWork.RPTC4; // 加班2.67時數 ssmsRec.SST22 = extraWork.RPTC5; // 加班2.00時數 ssmsRec.SST23 = absent.SST23; // 無薪假時數 ssmsRec.SST24 = 0; // 時數 24 ssmsRec.SST25 = 0; // 時數 25 ssmsRec.SSL01 = blifFee.InsuranceSalary; // 勞保投保等級 ssmsRec.SSL02 = bhifFee.InsuranceSalary; // 健保投保等級 ssmsRec.SSL03 = blraFee.AnnuitySalary; // 勞退提撥等級 ssmsRec.SSL04 = blifFee.InjurySalary; // 職災投保等級 ssmsRec.SSL05 = 0; // 等級05 ssmsRec.SSC01 = SSC01; // 請假備註 ssmsRec.SSC02 = SSC02; // 加班備註 ssmsRec.SSC03 = SSC03; // 電話費備註 ssmsRec.SSC04 = SSC04; // 油料費備註 ssmsRec.SSC05 = SSC05; // 差勤備註 ssmsRec.SSC06 = SSC06; // 薪資加減備註 ssmsRec.SSC07 = SSC07; // 差旅事由 ssmsRec.SSC08 = ""; // 休息日加班超過8小時時數備註 ssmsRec.SSC09 = ""; // 備註09 ssmsRec.SSC10 = ""; // 備註10 ssmsDao.InsertOne(tran, ssmsRec); #endregion } // 刪除從專案派遣中不存在的資料 #endregion #region 以專案計算科目匯總 // 準備參數 cmdInsertSACD.Parameters["SAPYN"].Value = bpaaRecord.BPPYN; cmdInsertSACD.Parameters["SAYMM"].Value = aYYMM; cmdSelectSACD.Parameters["SAPYN"].Value = bpaaRecord.BPPYN; cmdSelectSACD.Parameters["SAYMM"].Value = aYYMM; cmdUpdateSACD.Parameters["SAPYN"].Value = bpaaRecord.BPPYN; cmdUpdateSACD.Parameters["SAYMM"].Value = aYYMM; cmdDeleteSACD.Parameters["SAPYN"].Value = bpaaRecord.BPPYN; cmdDeleteSACD.Parameters["SAYMM"].Value = aYYMM; // 1. 計算各科目匯總 DataTable ssms01 = _getData.GetSSMSSum01(aYYMM, bpaaRecord.BPPYN, tran); List bpsxx = new List(); SortedDictionary bpsxxAmt = new SortedDictionary(); // 薪資科目 if (bpaaRecord.BPS01 != "") { if (!bpsxx.Contains(bpaaRecord.BPS01)) { bpsxx.Add(bpaaRecord.BPS01); bpsxxAmt[bpaaRecord.BPS01] = Convert.ToInt32(ssms01.Rows[0]["BPS01"]); } else bpsxxAmt[bpaaRecord.BPS01] += Convert.ToInt32(ssms01.Rows[0]["BPS01"]); } // 勞保雇主部份負擔科目 if (bpaaRecord.BPS02 != "") { if (!bpsxx.Contains(bpaaRecord.BPS02)) { bpsxx.Add(bpaaRecord.BPS02); bpsxxAmt[bpaaRecord.BPS02] = Convert.ToInt32(ssms01.Rows[0]["BPS02"]); } else bpsxxAmt[bpaaRecord.BPS02] += Convert.ToInt32(ssms01.Rows[0]["BPS02"]); } // 健保雇主部份負擔科目 if (bpaaRecord.BPS03 != "") { if (!bpsxx.Contains(bpaaRecord.BPS03)) { bpsxx.Add(bpaaRecord.BPS03); bpsxxAmt[bpaaRecord.BPS03] = Convert.ToInt32(ssms01.Rows[0]["BPS03"]); } else bpsxxAmt[bpaaRecord.BPS03] += Convert.ToInt32(ssms01.Rows[0]["BPS03"]); } // 工資墊償基金科目 if (bpaaRecord.BPS04 != "") { if (!bpsxx.Contains(bpaaRecord.BPS04)) { bpsxx.Add(bpaaRecord.BPS04); bpsxxAmt[bpaaRecord.BPS04] = Convert.ToInt32(ssms01.Rows[0]["BPS04"]); } else bpsxxAmt[bpaaRecord.BPS04] += Convert.ToInt32(ssms01.Rows[0]["BPS04"]); } // 勞退金提撥科目 if (bpaaRecord.BPS05 != "") { if (!bpsxx.Contains(bpaaRecord.BPS05)) { bpsxx.Add(bpaaRecord.BPS05); bpsxxAmt[bpaaRecord.BPS05] = Convert.ToInt32(ssms01.Rows[0]["BPS05"]); } else bpsxxAmt[bpaaRecord.BPS05] += Convert.ToInt32(ssms01.Rows[0]["BPS05"]); } // 外勤作業費科目 if (bpaaRecord.BPS06 != "") { if (!bpsxx.Contains(bpaaRecord.BPS06)) { bpsxx.Add(bpaaRecord.BPS06); bpsxxAmt[bpaaRecord.BPS06] = Convert.ToInt32(ssms01.Rows[0]["BPS06"]); } else bpsxxAmt[bpaaRecord.BPS06] += Convert.ToInt32(ssms01.Rows[0]["BPS06"]); } // 油料費科目 if (bpaaRecord.BPS07 != "") { if (!bpsxx.Contains(bpaaRecord.BPS07)) { bpsxx.Add(bpaaRecord.BPS07); bpsxxAmt[bpaaRecord.BPS07] = Convert.ToInt32(ssms01.Rows[0]["BPS07"]); } else bpsxxAmt[bpaaRecord.BPS07] += Convert.ToInt32(ssms01.Rows[0]["BPS07"]); } // 加班費科目 if (bpaaRecord.BPS08 != "") { if (!bpsxx.Contains(bpaaRecord.BPS08)) { bpsxx.Add(bpaaRecord.BPS08); bpsxxAmt[bpaaRecord.BPS08] = Convert.ToInt32(ssms01.Rows[0]["BPS08"]); } else bpsxxAmt[bpaaRecord.BPS08] += Convert.ToInt32(ssms01.Rows[0]["BPS08"]); } // 電話費科目 if (bpaaRecord.BPS09 != "") { if (!bpsxx.Contains(bpaaRecord.BPS09)) { bpsxx.Add(bpaaRecord.BPS09); bpsxxAmt[bpaaRecord.BPS09] = Convert.ToInt32(ssms01.Rows[0]["BPS09"]); } else bpsxxAmt[bpaaRecord.BPS09] += Convert.ToInt32(ssms01.Rows[0]["BPS09"]); } // 清除科目匯總,除了有科目對應的之外,其他科目都清除 cmdDeleteAllSACD.CommandText = @"DELETE FROM SACD WHERE SAPYN=@SAPYN AND SAYMM=@SAYMM "; cmdDeleteAllSACD.Parameters.Clear(); cmdDeleteAllSACD.Parameters.Add(Query.NewParameter("SAPYN", bpaaRecord.BPPYN)); cmdDeleteAllSACD.Parameters.Add(Query.NewParameter("SAYMM", aYYMM)); // 管理費用項下之科目都不清除 if (bpaaRecord.BPS15 != "") { cmdDeleteAllSACD.CommandText += " AND (SUBSTRING(SAACC,1,4) <> @BPS15) "; cmdDeleteAllSACD.Parameters.Add(Query.NewParameter("BPS15", (bpaaRecord.BPS15.Length < 4 ? bpaaRecord.BPS15 : bpaaRecord.BPS15.Substring(0, 4)))); } // 公費科目不清除 if (bpaaRecord.BPS13 != "") { cmdDeleteAllSACD.CommandText += " AND (SAACC <> @BPS13) "; cmdDeleteAllSACD.Parameters.Add(Query.NewParameter("BPS13", bpaaRecord.BPS13)); } // 上面計算出來的科目不清除 for (int i = 0; i < bpsxx.Count; i++) { cmdDeleteAllSACD.CommandText += " AND (SAACC <> @SAACC_" + bpsxx[i] + ") "; cmdDeleteAllSACD.Parameters.Add(Query.NewParameter("SAACC_" + bpsxx[i], bpsxx[i])); } cmdDeleteAllSACD.ExecuteNonQuery(); // 寫入科目匯總 for (int i = 0; i < bpsxx.Count; i++) { // 先看該科目匯總是否存在 cmdSelectSACD.Parameters["SAACC"].Value = bpsxx[i]; object o = cmdSelectSACD.ExecuteScalar(); // 不存在就新增,抓預設備註填入備註 if (o == null || Convert.ToInt32(o) == 0) { cmdInsertSACD.Parameters["SAACC"].Value = bpsxx[i]; cmdInsertSACD.Parameters["SAAMT"].Value = bpsxxAmt[bpsxx[i]]; cmdInsertSACD.Parameters["SADOC"].Value = _getData.GetBPAB_BPDOC(bpaaRecord.BPPYN, bpsxx[i], tran); cmdInsertSACD.ExecuteNonQuery(); } // 存在就直接更新金額,這樣可以保留備註 else { cmdUpdateSACD.Parameters["SAACC"].Value = bpsxx[i]; cmdUpdateSACD.Parameters["SAAMT"].Value = bpsxxAmt[bpsxx[i]]; cmdUpdateSACD.ExecuteNonQuery(); } } // 2. 計算各項憑證 /* DataTable rpfe = clac.GetRPFESum(aYYMM, bpaaRecord.BPPYN, tran); foreach (DataRow rpfeRow in rpfe.Rows) { cmdSelectSACD.Parameters["SAACC"].Value = rpfeRow["RPACC"]; object o = cmdSelectSACD.ExecuteScalar(); if (o == null || Convert.ToInt32(o) == 0) { cmdInsertSACD.Parameters["SAACC"].Value = rpfeRow["RPACC"]; cmdInsertSACD.Parameters["SAAMT"].Value = rpfeRow["RPAMT"]; cmdInsertSACD.ExecuteNonQuery(); } else { cmdUpdateSACD.Parameters["SAACC"].Value = rpfeRow["RPACC"]; cmdUpdateSACD.Parameters["SAAMT"].Value = rpfeRow["RPAMT"]; cmdUpdateSACD.ExecuteNonQuery(); } } */ // 寫入營業稅 WriteTax(aYYMM, bpaaRecord.BPPYN, tran); #endregion } #endregion #region 非專案計算 else { double bpbft; double bpaft; double bphol; string bpovr; string bplve; DateTime rasdt = new DateTime(1900, 1, 1); DateTime raedt = new DateTime(2999, 12, 31); // 取得加班費比例與計算方式 BpslDAC bpslDAO = new BpslDAC(Query); _getData.GetRASN_Overwork_Rate(ddlRSPYN.SelectedValue, out bpbft, out bpaft, out bphol, out bpovr, out bplve); // 取得年月曾經在職的人員 DataTable bpsnInMonth = _getData.GetBPSNInMonth(aYYMM, tran); foreach (DataRow bpsnRow in bpsnInMonth.Rows) { string bpeno = bpsnRow["BPENO"].ToString(); DateTime bpedy = bpsnRow["BPEDY"] != DBNull.Value ? Convert.ToDateTime(bpsnRow["BPEDY"]) : new DateTime(0); // 取得年月人員未派遣出去的資料,以及薪資異動資料 DataTable bpsnNoCase = _getData.GetBPSNNoCase(aYYMM, bpeno, tran); BPSNNoCaseRecord bpsnNoCaseRec = new BPSNNoCaseRecord(); // 變數初值 int thisMonthDays = 0; int thisMonthLaborDays = 0; int monthSalary = 0; int foodBonus = 0; string SSC01 = ""; string SSC02 = ""; string SSC03 = ""; string SSC04 = ""; string SSC05 = ""; string SSC06 = ""; string SSC07 = ""; int SSP99 = 0; int SSS99 = 0; int bpsrd = 0; int bpsrd1 = 0; int bpsrm1 = 0; int bpp021 = 0; DateTime calcStartDay = new DateTime(); // 本人本月計算起始日 (本人本月在職第一天) DateTime calcEndDay = new DateTime(); // 本人本月計算結束日 (本人本月在職最後一天) extraWork.Clear(); absent.Clear(); absent.Formula = GetData.defaultBPLVE; otherFee.Clear(); blif.Clear(); blra.Clear(); bhifFee.Init(); blifFee.Init(); blraFee.Init(); // 1. 計算薪資,伙食津貼 if (bpsnNoCase.Rows.Count > 0) { foreach (DataRow noCaseRow in bpsnNoCase.Rows) { bpsnNoCaseRec.FillRecord(noCaseRow); CalcSalary(bpsnNoCaseRec.STA_DATE, bpsnNoCaseRec.END_DATE, bpsnNoCaseRec.BPSRM, bpsnNoCaseRec.BPP02, monthEndDay, ref calcStartDay, ref calcEndDay, ref thisMonthDays, ref monthSalary, ref foodBonus, bpaaRecord.BPSAL); } // 取得最後一筆時薪資料 bpsrd = bpsnNoCaseRec.BPSRD; } else { calcStartDay = bpsnRow["BPSDY"] != DBNull.Value ? Convert.ToDateTime(bpsnRow["BPSDY"]) : aYYMM; calcEndDay = bpsnRow["BPEDY"] != DBNull.Value ? Convert.ToDateTime(bpsnRow["BPEDY"]) : aYYMM.AddMonths(1).AddDays(-1); } // 2. 計算加班費 // 2.1. 單筆輸入的加班費 DataTable rpar1 = _getData.GetRPAR1X(aYYMM, ddlRSPYN.SelectedValue, calcStartDay, calcEndDay, rasdt, raedt, bpeno, bpfed, tran); sb.Length = 0; RPARRecord rparRecord = new RPARRecord(); foreach (DataRow rparRow in rpar1.Rows) { rparRecord.FillRecord(rparRow); // 以員工編號及日期取得月薪資料、伙食津貼資料 DataTable bpslData = bpslDAO.SelectBPSLDateRange(bpeno, rparRecord.RPRDT, rparRecord.RPRDT, tran); if (bpslData.Rows.Count > 0) { bpsrm1 = Convert.ToInt32(bpslData.Rows[0]["BPSRM"]); bpp021 = Convert.ToInt32(bpslData.Rows[0]["BPP02"]); } ExtraWorkData extraData = extraWork.Add(rparRecord.RPTYP, rparRecord.RPRDT, rparRecord.RPTCT, bpsrm1, bpp021, bpbft, bpaft, bphol, bpovr, bpaaRecord.BPOTT, rparRecord.RPTC1, rparRecord.RPTC2, rparRecord.RPTC3, rparRecord.RPTC4, rparRecord.RPTC5); if (rparRecord.RPDOC.Length > 0) sb.Append(rparRecord.RPDOC + "/"); rparDao.回填加班費(rparRecord.RPREN, WDAC.GetInt32Value(extraData.RPTA1), WDAC.GetInt32Value(extraData.RPTA2), WDAC.GetInt32Value(extraData.RPTA3), WDAC.GetInt32Value(extraData.RPTA4), WDAC.GetInt32Value(extraData.RPTA5), tran); } SSC02 += sb.Length > 0 ? sb.ToString(0, sb.Length - 1) : ""; // 2.2. 加班匯總輸入的加班費 DataTable rowk = _getData.GetROWK(aYYMM, ddlRSPYN.SelectedValue, bpeno, tran); ROWKRecord rowkRecord = new ROWKRecord(); foreach (DataRow rowkRow in rowk.Rows) { rowkRecord.FillRecord(rowkRow); extraWork.Add(rowkRecord); } // 3. 計算缺勤扣款 DataTable rpar = _getData.GetRPAR0X(aYYMM, ddlRSPYN.SelectedValue, calcStartDay, calcEndDay, rasdt, raedt, bpeno, bpfed, tran); sb.Length = 0; foreach (DataRow rparRow in rpar.Rows) { rparRecord.FillRecord(rparRow); // 以員工編號及日期取得月薪資料、伙食津貼資料 DataTable bpslData = bpslDAO.SelectBPSLDateRange(bpeno, rparRecord.RPRDT, rparRecord.RPRDT, tran); if (bpslData.Rows.Count > 0) { bpsrm1 = Convert.ToInt32(bpslData.Rows[0]["BPSRM"]); bpp021 = Convert.ToInt32(bpslData.Rows[0]["BPP02"]); } absent.bpsrm = bpsrm1; absent.bpp02 = bpp021; absent.Formula = bplve; int rpftr = absent.Add(rparRecord, calcStartDay, calcEndDay, true); if (rparRecord.RPDOC.Length > 0) sb.Append(rparRecord.RPDOC + "/"); rparDao.回填缺勤扣款(rparRecord.RPREN, rpftr, tran); } SSC01 += sb.Length > 0 ? sb.ToString(0, sb.Length - 1) : ""; // 4. 計算差旅費 CalcOutFee(calcStartDay, calcEndDay, ddlRSPYN.SelectedValue, bpeno, bpfed, rasdt, raedt, ref otherFee, tran, ref SSC05, ref SSC07); // 5. 計算電話費、油料費 CalcPhoneAndFuelFee(calcStartDay, calcEndDay, ddlRSPYN.SelectedValue, bpeno, bpfed, rasdt, raedt, ref otherFee, tran, ref SSC03, ref SSC04); // 6. 計算勞保、健保、勞退金、勞退自提、工資墊償 if (bpsnNoCase.Rows.Count > 0) CalcLaborAndHealth(calcStartDay, calcEndDay, bpeno, monthEndDay, tran, ref bhifFee, ref blifFee, ref blraFee, thisMonthDays, "", ref thisMonthLaborDays, bpedy); // 7. 計算其他加減項 CalcOthers(ddlRSPYN.SelectedValue, bpeno, tran, ref SSP99, ref SSS99, ref SSC06); // 若各項金額皆無資料,不寫檔 if (bpsnNoCase.Rows.Count == 0 && rpar1.Rows.Count == 0 && rpar.Rows.Count == 0 && otherFee.FuelKm == 0 && otherFee.LongTrip == 0 && otherFee.ShortTrip == 0 && otherFee.TelephoneFee == 0 && SSP99 == 0 && SSS99 == 0) continue; // 寫入薪資匯總檔 #region 寫入月薪資匯總 SsmsRecord ssmsRec = new SsmsRecord(); ssmsRec.SSYMM = aYYMM; // 薪資月份 ssmsRec.SSENO = bpeno; // 人員編號 ssmsRec.SSNUM = ""; // 客戶編號 ssmsRec.SSPYN = "000000001"; // 專案年度編號 ssmsRec.SSJNO = ""; // 職稱 ssmsRec.SSCNO = ""; // 等級 ssmsRec.SSBRH = ""; // 站別 ssmsRec.SSD01 = thisMonthDays; // 到職天數 ssmsRec.SSD02 = blifFee.InWorkDays; // 勞保到職天數 ssmsRec.SSSRD = bpsrd != 0 ? bpsrd : bpsrd1; // 時薪 ssmsRec.SSP00 = monthSalary; // 本薪 ssmsRec.SSP01 = (absent.AllPresent ? rasnRecord.BPP01 : 0); // 全勤獎金 ssmsRec.SSP02 = foodBonus; // 伙食津貼 ssmsRec.SSP03 = bpsnNoCaseRec.BPP03; // 職務加給 ssmsRec.SSP04 = bpsnNoCaseRec.BPP04; // 派駐津貼 ssmsRec.SSP05 = bpsnNoCaseRec.BPP05; // 其他津貼 ssmsRec.SSP06 = extraWork.RPTA1; // 1.34加班費 ssmsRec.SSP07 = extraWork.RPTA2; // 1.67加班費 ssmsRec.SSP08 = extraWork.RPTA3; // 1.00加班費 ssmsRec.SSP09 = otherFee.ShortTrip; // 短差 ssmsRec.SSP10 = otherFee.LongTrip; // 長差 ssmsRec.SSP11 = otherFee.TelephoneFee; // 電話費 ssmsRec.SSP12 = otherFee.FuelFee; // 油料費 ssmsRec.SSP13 = extraWork.RPTA4; // 2.67加班費 ssmsRec.SSP14 = extraWork.RPTA5; // 2.00加班費 ssmsRec.SSP15 = 0; // 加項15 ssmsRec.SSP99 = SSP99; // 其他加項 ssmsRec.SSS01 = absent.SSS01; // 病假扣款 ssmsRec.SSS02 = absent.SSS02; // 事假扣款 ssmsRec.SSS03 = 0; // 所得稅 ssmsRec.SSS04 = blifFee.TotalPersonalFee; // 勞保費 ssmsRec.SSS05 = bhifFee.PersonalFee; // 健保費 ssmsRec.SSS06 = blraFee.PersonalFee; // 勞退自提 if (bpsnNoCase.Rows.Count > 0) { ssmsRec.SSS07 = Convert.ToInt32(Math.Round(Convert.ToDouble(monthSalary + foodBonus) * fortuneRate, MidpointRounding.AwayFromZero)); // 福利金 } else { ssmsRec.SSS07 = 0; } ssmsRec.SSS08 = 0; // 健保補充保費 ssmsRec.SSS09 = absent.SSS09; // 無薪假扣款 ssmsRec.SSS10 = 0; // 減項10 ssmsRec.SSS11 = 0; // 減項11 ssmsRec.SSS12 = 0; // 減項12 ssmsRec.SSS13 = 0; // 減項13 ssmsRec.SSS14 = 0; // 減項14 ssmsRec.SSS15 = 0; // 減項15 ssmsRec.SSS99 = SSS99; // 其他減項 ssmsRec.SSH01 = Convert.ToInt32(Math.Round(blifFee.NormalCompanyFee, MidpointRounding.AwayFromZero)); // 雇主勞保費 ssmsRec.SSH02 = Convert.ToInt32(Math.Round(blifFee.InjuryCompanyFee, MidpointRounding.AwayFromZero)); // 職災保險 ssmsRec.SSH03 = Convert.ToInt32(Math.Round(blifFee.LostJobCompanyFee, MidpointRounding.AwayFromZero)); // 就業保險 ssmsRec.SSH04 = Convert.ToInt32(Math.Round(blifFee.SalaryReverseFund, MidpointRounding.AwayFromZero)); // 工資墊償 ssmsRec.SSH05 = bhifFee.CompanyFee; // 雇主健保費 ssmsRec.SSH06 = blraFee.CompanyFee; // 勞退提撥 ssmsRec.SSH07 = 0; // 雇主07 ssmsRec.SSH08 = 0; // 雇主08 ssmsRec.SSH09 = 0; // 雇主09 ssmsRec.SSH10 = 0; // 雇主10 ssmsRec.SST01 = extraWork.RPTC1; // 1.34加班時數 ssmsRec.SST02 = extraWork.RPTC2; // 1.67加班時數 ssmsRec.SST03 = extraWork.RPTC3; // 1.00加班時數 ssmsRec.SST04 = extraWork.RelaxationAllowance; // 累積補休時數 ssmsRec.SST05 = absent.SST05; // 補休時數 ssmsRec.SST06 = absent.SST06; // 特休時數 ssmsRec.SST07 = absent.SST07; // 事假時數 ssmsRec.SST08 = absent.SST08; // 病假時數 ssmsRec.SST09 = absent.SST09; // 喪假時數 ssmsRec.SST10 = absent.SST10; // 產假時數 ssmsRec.SST11 = absent.SST11; // 婚假時數 ssmsRec.SST12 = absent.SST12; // 陪產假時數 ssmsRec.SST13 = absent.SST13; // 公假時數 ssmsRec.SST14 = absent.SST14; // 公傷假時數 ssmsRec.SST15 = absent.SST15; // 生理假時數 ssmsRec.SST16 = absent.SST16; // 家庭照顧假時數 ssmsRec.SST17 = absent.SST17; // 育嬰假時數 ssmsRec.SST18 = otherFee.FuelKm; // 油料費補助公里數 ssmsRec.SST19 = absent.SST19; // 原民祭儀假時數 ssmsRec.SST20 = absent.SST20; // 產檢假時數 ssmsRec.SST21 = extraWork.RPTC4; // 2.67加班時數 ssmsRec.SST22 = extraWork.RPTC5; // 2.00加班時數 ssmsRec.SST23 = absent.SST23; // 無薪假時數 ssmsRec.SST24 = 0; // 時數 24 ssmsRec.SST25 = 0; // 時數 25 ssmsRec.SSL01 = blifFee.InsuranceSalary; // 勞保投保等級 ssmsRec.SSL02 = bhifFee.InsuranceSalary; // 健保投保等級 ssmsRec.SSL03 = blraFee.AnnuitySalary; // 勞退提撥等級 ssmsRec.SSL04 = blifFee.InjurySalary; // 職災投保等級 ssmsRec.SSL05 = 0; // 等級05 ssmsRec.SSC01 = SSC01; // 請假備註 ssmsRec.SSC02 = SSC02; // 加班備註 ssmsRec.SSC03 = SSC03; // 電話費備註 ssmsRec.SSC04 = SSC04; // 油料費備註 ssmsRec.SSC05 = SSC05; // 差勤備註 ssmsRec.SSC06 = SSC06; // 薪資加減備註 ssmsRec.SSC07 = SSC07; // 差旅事由 ssmsRec.SSC08 = ""; // 備註08 ssmsRec.SSC09 = ""; // 備註09 ssmsRec.SSC10 = ""; // 備註10 ssmsDao.InsertOne(tran, ssmsRec); #endregion } } #endregion tran.Commit(); ClientShowMessage("計算完成!"); } catch { tran.Rollback(); throw; } finally { conn.Close(); } } /// /// 取得月科目匯總金額 by 科目編號 /// protected int GetSACD(string saacc) { DateTime aYYMM; if (CheckDate(_BPYMM + "01", out aYYMM)) return GetSACD(aYYMM, _BPPYN, saacc); else return 0; } /// /// 取得月科目匯總金額 by 年月、專案、科目編號 /// protected int GetSACD(DateTime yymm, string sapyn, string saacc) { DbCommand cmd = Query.NewCommand( @"SELECT SAAMT FROM SACD WHERE SAYMM = @SAYMM AND SAPYN = @SAPYN AND SAACC=@SAACC"); cmd.Parameters.Add(Query.NewParameter("SAYMM", yymm)); cmd.Parameters.Add(Query.NewParameter("SAPYN", sapyn)); cmd.Parameters.Add(Query.NewParameter("SAACC", saacc)); object o = Query.ExecuteScalar(cmd); if (o == null || o == DBNull.Value) return 0; else return Convert.ToInt32(o); } /// /// 設定月科目匯總金額,總表科目輸入使用 /// protected void SetSACD(string saacc, int saamt, DbTransaction tran) { DateTime aYYMM; if (CheckDate(_BPYMM + "01", out aYYMM)) SetSACD(aYYMM, _BPPYN, saacc, saamt, tran); } /// /// 設定月科目匯總金額,總表科目輸入使用 /// protected void SetSACD(DateTime yymm, string sapyn, string saacc, int saamt, DbTransaction tran) { DbCommand cmdSel = Query.NewCommand( @"SELECT COUNT(1) FROM SACD WHERE SAYMM = @SAYMM AND SAPYN = @SAPYN AND SAACC=@SAACC"); cmdSel.Parameters.Add(Query.NewParameter("SAYMM", yymm)); cmdSel.Parameters.Add(Query.NewParameter("SAPYN", sapyn)); cmdSel.Parameters.Add(Query.NewParameter("SAACC", saacc)); cmdSel.Connection = tran.Connection; cmdSel.Transaction = tran; object o = cmdSel.ExecuteScalar(); if (o == null || o == DBNull.Value || Convert.ToInt32(o) == 0) { DbCommand cmdIns = Query.NewCommand( @"INSERT INTO SACD (SAPYN, SAYMM, SAACC, SAAMT, TRDAT, TRMOD, TRUSR) VALUES (@SAPYN, @SAYMM, @SAACC, @SAAMT, GETDATE(), 'INSERT', @TRUSR)"); cmdIns.Parameters.Add(Query.NewParameter("SAPYN", sapyn)); cmdIns.Parameters.Add(Query.NewParameter("SAYMM", yymm)); cmdIns.Parameters.Add(Query.NewParameter("SAACC", saacc)); cmdIns.Parameters.Add(Query.NewParameter("SAAMT", saamt)); cmdIns.Parameters.Add(Query.NewParameter("TRUSR", UserId)); cmdIns.Connection = tran.Connection; cmdIns.Transaction = tran; cmdIns.ExecuteNonQuery(); } else { DbCommand cmdUpd = Query.NewCommand( @"UPDATE SACD SET SAAMT=@SAAMT, TRDAT=GETDATE(), TRMOD='UPDATE', TRUSR=@TRUSR WHERE SAYMM = @SAYMM AND SAPYN = @SAPYN AND SAACC = @SAACC"); cmdUpd.Parameters.Add(Query.NewParameter("SAAMT", saamt)); cmdUpd.Parameters.Add(Query.NewParameter("TRUSR", UserId)); cmdUpd.Parameters.Add(Query.NewParameter("SAYMM", yymm)); cmdUpd.Parameters.Add(Query.NewParameter("SAPYN", sapyn)); cmdUpd.Parameters.Add(Query.NewParameter("SAACC", saacc)); cmdUpd.Connection = tran.Connection; cmdUpd.Transaction = tran; cmdUpd.ExecuteNonQuery(); } } protected void btnSSMS_Click(object sender, EventArgs e) { bool result = true; aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); if (!result) return; MultiView1.ActiveViewIndex = 1; lbYYMM.Text = txtYYMM.Text; //ddlRSPYN.SQL = "SELECT BPPYN, '【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,4,1)) + '】' + BPPYM BPPYM FROM BPAA WHERE BPYER=" + (aYYMM.Year - WGuard1.CY11).ToString() + " ORDER BY BPPYN"; ddlRSPYN.DataSource = new BpaaDAC().GetBpaaWithTY(aYYMM.Year); ddlRSPYN.DataBind(); } protected void cvBPS10_ServerValidate(object source, ServerValidateEventArgs args) { int i; args.IsValid = args.Value != "" && Int32.TryParse(args.Value, out i) && i >= 0; } protected void btnCancel1_Click(object sender, EventArgs e) { pnBPSXX.Visible = false; } protected void Next_Click(object sender, EventArgs e) { if (!CheckProjectRight()) return; cvMessage.IsValid = true; cvMessage.ErrorMessage = ""; _BPPYN = ddlRSPYN.SelectedValue; bool result = true; aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); if (!result) return; DataTable bpaa = _getData.GetBPAA_BPPYN(_BPPYN); if (bpaa.Rows.Count == 0) return; BPAARecord bpaaRecord = new BPAARecord(); bpaaRecord.FillRecord(bpaa.Rows[0]); if (bpaaRecord.BPS15 == "") { cvMessage.IsValid = false; cvMessage.ErrorMessage += "請先設定「管理費用」之科目對應
"; } if (bpaaRecord.BPS13 == "") { cvMessage.IsValid = false; cvMessage.ErrorMessage += "請先設定「公費」之科目對應
"; } if (!cvMessage.IsValid) return; StringBuilder sb = new StringBuilder(); sb.Append( @"SELECT BPACC, BPCLS, BPAME, ISNULL(SAAMT, 0) AMT FROM BPAB A LEFT OUTER JOIN SACD B ON SAPYN=BPPYN AND SAACC=BPACC AND SAYMM=@SAYMM WHERE BPPYN=@BPPYN AND SUBSTRING(BPACC,1,4)=@BPS15 AND SUBSTRING(BPACC, 5, 2)<>'00' "); dsSubject.SelectParameters.Clear(); dsSubject.SelectParameters.Add("SAYMM", aYYMM.ToString(System.Globalization.CultureInfo.InvariantCulture)); dsSubject.SelectParameters.Add("BPPYN", _BPPYN); dsSubject.SelectParameters.Add("BPS15", (bpaaRecord.BPS15.Length < 4 ? bpaaRecord.BPS15 : bpaaRecord.BPS15.Substring(0, 4))); if (bpaaRecord.BPS13 != "") { sb.Append( @" UNION SELECT BPACC, BPCLS, BPAME, ISNULL(SAAMT, 0) AMT FROM BPAB A LEFT OUTER JOIN SACD B ON SAPYN=BPPYN AND SAACC=BPACC AND SAYMM=@SAYMM WHERE BPPYN=@BPPYN AND BPACC=@BPS13"); dsSubject.SelectParameters.Add("BPS13", bpaaRecord.BPS13); } sb.Append(" ORDER BY BPCLS "); dsSubject.ConnectionString = ConnectionString; dsSubject.SelectCommand = sb.ToString(); DataList1.DataSourceID = "dsSubject"; DataList1.DataBind(); if (DataList1.Items.Count > 0) SetClientFocus(DataList1.Items[0].Controls[3]); pnBPSXX.Visible = true; pnSACD.Visible = false; pnAccDoc.Visible = false; } protected void btnAccDoc_Click(object sender, EventArgs e) { if (!CheckProjectRight()) return; cvMessage.IsValid = true; cvMessage.ErrorMessage = ""; bool result = true; aYYMM = CheckDate(lbYYMM.Text + "01", "", ref result, cvMessage); dsSACDDoc.ConnectionString = ConnectionString; dsSACDDoc.SelectParameters["SAPYN"].DefaultValue = ddlRSPYN.SelectedValue; dsSACDDoc.SelectParameters["SAYMM"].DefaultValue = aYYMM.ToString(System.Globalization.CultureInfo.InvariantCulture); dlSACDDoc.DataBind(); pnBPSXX.Visible = false; pnSACD.Visible = false; pnAccDoc.Visible = true; } protected void btnSACD_Click(object sender, EventArgs e) { if (!CheckProjectRight()) return; cvMessage.IsValid = true; cvMessage.ErrorMessage = ""; bool result = true; aYYMM = CheckDate(lbYYMM.Text + "01", "", ref result, cvMessage); dsSACD.ConnectionString = ConnectionString; dsSACD.SelectParameters["BPPYN"].DefaultValue = ddlRSPYN.SelectedValue; dsSACD.SelectParameters["SAYMM"].DefaultValue = aYYMM.ToString(System.Globalization.CultureInfo.InvariantCulture); GridView1.DataBind(); DbCommand sumSacd = Query.NewCommand("SELECT SUM(SAAMT) FROM SACD WHERE SAPYN=@SAPYN AND SAYMM=@SAYMM"); sumSacd.Parameters.Add(Query.NewParameter("SAPYN", ddlRSPYN.SelectedValue)); sumSacd.Parameters.Add(Query.NewParameter("SAYMM", aYYMM)); object o = Query.ExecuteScalar(sumSacd); int i; if (o != null && o != DBNull.Value) i = Convert.ToInt32(o); else i = 0; lbSumSacd.Text = i.ToString("###,###,###,##0"); pnBPSXX.Visible = false; pnSACD.Visible = true; pnAccDoc.Visible = false; } protected void WriteTax(DateTime yymm, string bppyn, DbTransaction tran) { DataTable bpaa = _getData.GetBPAA_BPPYN(bppyn); if (bpaa.Rows.Count == 0) return; // 營業稅科目 string bps14 = bpaa.Rows[0]["BPS14"] == DBNull.Value ? "" : bpaa.Rows[0]["BPS14"].ToString(); // 勞保雇主部份負擔科目 string bps02 = bpaa.Rows[0]["BPS02"] == DBNull.Value ? "" : bpaa.Rows[0]["BPS02"].ToString(); // 健保雇主部份負擔科目 string bps03 = bpaa.Rows[0]["BPS03"] == DBNull.Value ? "" : bpaa.Rows[0]["BPS03"].ToString(); // 工資墊償基金科目 string bps04 = bpaa.Rows[0]["BPS04"] == DBNull.Value ? "" : bpaa.Rows[0]["BPS04"].ToString(); // 勞退金提撥科目 string bps05 = bpaa.Rows[0]["BPS05"] == DBNull.Value ? "" : bpaa.Rows[0]["BPS05"].ToString(); // 行政督導保險及退休提撥科目 string bps11 = bpaa.Rows[0]["BPS11"] == DBNull.Value ? "" : bpaa.Rows[0]["BPS11"].ToString(); if (bps14 == "") return; // 取得營業稅、勞健保之外的科目總和 DbCommand sumSacd = Query.NewCommand( @"SELECT SUM(SAAMT) FROM SACD WHERE SAPYN=@SAPYN AND SAYMM=@SAYMM AND SAACC<>@SAACC02 AND SAACC<>@SAACC03 AND SAACC<>@SAACC04 AND SAACC<>@SAACC05 AND SAACC<>@SAACC11 AND SAACC<>@SAACC14"); sumSacd.Parameters.Add(Query.NewParameter("SAPYN", bppyn)); sumSacd.Parameters.Add(Query.NewParameter("SAYMM", aYYMM)); sumSacd.Parameters.Add(Query.NewParameter("SAACC02", bps02)); sumSacd.Parameters.Add(Query.NewParameter("SAACC03", bps03)); sumSacd.Parameters.Add(Query.NewParameter("SAACC04", bps04)); sumSacd.Parameters.Add(Query.NewParameter("SAACC05", bps05)); sumSacd.Parameters.Add(Query.NewParameter("SAACC11", bps11)); sumSacd.Parameters.Add(Query.NewParameter("SAACC14", bps14)); // 取得上個月勞健保的科目總和 DbCommand sumSacd1 = Query.NewCommand( @"SELECT SUM(SAAMT) FROM SACD WHERE SAPYN=@SAPYN AND SAYMM=@SAYMM AND ( SAACC=@SAACC02 OR SAACC=@SAACC03 OR SAACC=@SAACC04 OR SAACC=@SAACC05 OR SAACC=@SAACC11 )"); sumSacd1.Parameters.Add(Query.NewParameter("SAPYN", bppyn)); sumSacd1.Parameters.Add(Query.NewParameter("SAYMM", aYYMM.AddMonths(-1))); sumSacd1.Parameters.Add(Query.NewParameter("SAACC02", bps02)); sumSacd1.Parameters.Add(Query.NewParameter("SAACC03", bps03)); sumSacd1.Parameters.Add(Query.NewParameter("SAACC04", bps04)); sumSacd1.Parameters.Add(Query.NewParameter("SAACC05", bps05)); sumSacd1.Parameters.Add(Query.NewParameter("SAACC11", bps11)); DbCommand deleteTax = Query.NewCommand("DELETE SACD WHERE SAPYN=@SAPYN AND SAYMM=@SAYMM AND SAACC=@SAACC14"); deleteTax.Parameters.Add(Query.NewParameter("SAPYN", bppyn)); deleteTax.Parameters.Add(Query.NewParameter("SAYMM", yymm)); deleteTax.Parameters.Add(Query.NewParameter("SAACC14", bps14)); DbCommand writeTax = Query.NewCommand( @"INSERT SACD (SAPYN, SAYMM, SAACC, SAAMT, TRDAT, TRMOD, TRUSR) VALUES (@SAPYN, @SAYMM, @SAACC14, @SAAMT, GETDATE(), 'INSERT', @TRUSR)"); writeTax.Parameters.Add(Query.NewParameter("SAPYN", bppyn)); writeTax.Parameters.Add(Query.NewParameter("SAYMM", yymm)); writeTax.Parameters.Add(Query.NewParameter("SAACC14", bps14)); writeTax.Parameters.Add(Query.NewParameter("SAAMT", DbType.Int32)); writeTax.Parameters.Add(Query.NewParameter("@TRUSR", UserId)); // 取得本月營業稅、勞健保除外的科目總和 sumSacd.Transaction = tran; sumSacd.Connection = tran.Connection; object o = sumSacd.ExecuteScalar(); int iSumSacd; if (o != null && o != DBNull.Value) iSumSacd = Convert.ToInt32(o); else iSumSacd = 0; // 取得上月勞健保的科目總和 sumSacd1.Transaction = tran; sumSacd1.Connection = tran.Connection; o = sumSacd1.ExecuteScalar(); if (o != null && o != DBNull.Value) iSumSacd += Convert.ToInt32(o); else iSumSacd += 0; // 寫入營業稅 deleteTax.Transaction = tran; deleteTax.Connection = tran.Connection; deleteTax.ExecuteNonQuery(); writeTax.Transaction = tran; writeTax.Connection = tran.Connection; writeTax.Parameters["SAAMT"].Value = Convert.ToInt32(Math.Round(Convert.ToDouble(iSumSacd) * 0.05d, MidpointRounding.AwayFromZero)); writeTax.ExecuteNonQuery(); } // 儲存總表輸入項目,以及計算營業稅 protected void DataList1_UpdateCommand(object source, DataListCommandEventArgs e) { bool result = true; cvMessage.ErrorMessage = ""; cvMessage.IsValid = true; aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); if (!result) return; for (int i = 0; i < DataList1.Items.Count; i++) { int amt; if (!Int32.TryParse((DataList1.Items[i].Controls[3] as TextBox).Text, out amt)) { cvMessage.ErrorMessage += (DataList1.Items[i].Controls[1] as ITextControl).Text + " 請輸入數值"; cvMessage.IsValid = false; } if (amt < 0) { cvMessage.ErrorMessage += (DataList1.Items[i].Controls[1] as ITextControl).Text + " 請輸入大於零的數值"; cvMessage.IsValid = false; } } if (!cvMessage.IsValid) return; _BPPYN = ddlRSPYN.SelectedValue; DbConnection conn = Query.NewConnection(); conn.Open(); DbTransaction tran = conn.BeginTransaction(); try { // 寫入輸入的項目 for (int i = 0; i < DataList1.Items.Count; i++) { string saacc = (DataList1.Items[i].Controls[5] as HiddenField).Value; string saamt = (DataList1.Items[i].Controls[3] as TextBox).Text; int amt; Int32.TryParse(saamt, out amt); SetSACD(aYYMM, _BPPYN, saacc, amt, tran); } // 寫入營業稅 WriteTax(aYYMM, _BPPYN, tran); tran.Commit(); RegisterStartupScript("OK", "alert('存檔完成!');"); } catch { tran.Rollback(); throw; } finally { conn.Close(); } } protected void DataList1_CancelCommand(object source, DataListCommandEventArgs e) { pnBPSXX.Visible = false; pnSACD.Visible = false; pnAccDoc.Visible = false; } // 輸入備註 protected void dlSACDDoc_UpdateCommand(object source, DataListCommandEventArgs e) { bool result = true; aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); if (!result) return; _BPPYN = ddlRSPYN.SelectedValue; DbCommand cmdUpdateSACDDoc = Query.NewCommand( @"UPDATE SACD SET SADOC = @SADOC WHERE SAPYN=@SAPYN AND SAYMM=@SAYMM AND SAACC=@SAACC"); cmdUpdateSACDDoc.Parameters.Add(Query.NewParameter("SADOC", DbType.String)); cmdUpdateSACDDoc.Parameters.Add(Query.NewParameter("SAPYN", _BPPYN)); cmdUpdateSACDDoc.Parameters.Add(Query.NewParameter("SAYMM", aYYMM)); cmdUpdateSACDDoc.Parameters.Add(Query.NewParameter("SAACC", DbType.String)); cmdSelectSACD.Parameters["SAPYN"].Value = _BPPYN; cmdSelectSACD.Parameters["SAYMM"].Value = aYYMM; cmdInsertSACD.Parameters["SAPYN"].Value = _BPPYN; cmdInsertSACD.Parameters["SAYMM"].Value = aYYMM; cmdInsertSACD.Parameters["SAAMT"].Value = 0; DbConnection conn = Query.NewConnection(); cmdUpdateSACDDoc.Connection = conn; cmdSelectSACD.Connection = conn; cmdInsertSACD.Connection = conn; conn.Open(); DbTransaction tran = conn.BeginTransaction(); cmdUpdateSACDDoc.Transaction = tran; cmdSelectSACD.Transaction = tran; cmdInsertSACD.Transaction = tran; try { // 寫入輸入的項目 for (int i = 0; i < dlSACDDoc.Items.Count; i++) { string saacc = (dlSACDDoc.Items[i].Controls[1] as ITextControl).Text; string sadoc = (dlSACDDoc.Items[i].Controls[7] as TextBox).Text; cmdSelectSACD.Parameters["SAACC"].Value = saacc; object o = cmdSelectSACD.ExecuteScalar(); if (o != null && o != DBNull.Value && Convert.ToInt32(o) > 0) { cmdUpdateSACDDoc.Parameters["SAACC"].Value = saacc; cmdUpdateSACDDoc.Parameters["SADOC"].Value = sadoc; cmdUpdateSACDDoc.ExecuteNonQuery(); } else { cmdInsertSACD.Parameters["SAACC"].Value = saacc; cmdInsertSACD.Parameters["SADOC"].Value = sadoc; cmdInsertSACD.ExecuteNonQuery(); } } tran.Commit(); RegisterStartupScript("OK", "alert('存檔完成!');"); } catch { tran.Rollback(); throw; } finally { conn.Close(); } } protected void btnInputYYMM_Click(object sender, EventArgs e) { ParamList["BPPYN"] = ""; ParamList["BPPYM"] = ""; pnBPSXX.Visible = false; pnSACD.Visible = false; DoAfterCommand("SALERYCALC"); } // 本月關帳,關帳日寫入本月月底 protected void btnCloseBPAA_Click(object sender, EventArgs e) { if (!CheckProjectRight()) return; cvMessage.IsValid = true; cvMessage.ErrorMessage = ""; bool result = true; aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); if (!result) return; try { cmdCloseBPAA.Parameters["BPMSD"].Value = aYYMM.AddMonths(1).AddDays(-1); cmdCloseBPAA.Parameters["BPPYN"].Value = ddlRSPYN.SelectedValue; Query.ExecuteNonQuery(cmdCloseBPAA); RegisterStartupScript("OK", "alert('本月關帳完成!');"); } catch (Exception ex) { cvMessage.ErrorMessage = ex.Message; cvMessage.IsValid = false; } } // 本月開帳,開帳日寫入上月月底 protected void btnOpenBPAA_Click(object sender, EventArgs e) { if (!CheckProjectRight()) return; cvMessage.IsValid = true; cvMessage.ErrorMessage = ""; bool result = true; aYYMM = CheckDate(txtYYMM.Text + "01", "請輸入正確的年月", ref result, cvMessage); if (!result) return; try { cmdCloseBPAA.Parameters["BPMSD"].Value = aYYMM.AddDays(-1); cmdCloseBPAA.Parameters["BPPYN"].Value = ddlRSPYN.SelectedValue; Query.ExecuteNonQuery(cmdCloseBPAA); RegisterStartupScript("OK", "alert('本月開帳完成!');"); } catch (Exception ex) { cvMessage.ErrorMessage = ex.Message; cvMessage.IsValid = false; } } }