using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.Common; using Wellan.Data; using Wellan.Common; /// /// 計算勞退金 /// public class Blra : LaborAndHealthFee { private int _annuitySalary; private double _companyFee; private double _personalFee; private int _inworkdays; public Blra(DateTime aDate) : base(aDate) { _bftyp = 3; _tableName = "BLRA"; } public LaborRetireAnnuity GetFee() { LaborRetireAnnuity fee = new LaborRetireAnnuity(); fee.Init(); fee.CompanyFee = Convert.ToInt32(Math.Round(_companyFee, MidpointRounding.AwayFromZero)); fee.PersonalFee = Convert.ToInt32(Math.Round(_personalFee, MidpointRounding.AwayFromZero)); fee.AnnuitySalary = _annuitySalary; return fee; } public void Clear() { _annuitySalary = 0; _companyFee = 0; _personalFee = 0; _inworkdays = 0; } /// /// 計算勞退提撥,並加入 Blra 的執行個體中 /// /// 月薪 /// 本月在職起始日 /// 本月在職結束日 /// 個人提繳率 /// 員工類別 1=雇主 2=員工 /// 本月到職天數 /// 員工國籍 1=本國籍 2=外國籍 public void Add(int salary, DateTime startDay, DateTime endDay, int personalRate, string employeeType, int thisMonthDays, string nation) { // 外國籍員工沒有勞退提撥 if (nation == "2") return; double bsamt = GetAmont(salary); double daysRatio = 0; int days = 0; int monthEndDay = WGuard1.GetMonthEnd(startDay, 0).Day; _annuitySalary = Convert.ToInt32(bsamt); if (bsamt > 0) { // 月初日到月底日 if (startDay.Day == 1 && endDay.Day == monthEndDay) { days = 30; } else { // 結束日是月底日 if (endDay.Day == monthEndDay) { if (startDay.Day == 30 || startDay.Day == 31) days = 1; else days = 30 - startDay.Day + 1; } else // 結束日非月底日 { days = endDay.Day - startDay.Day + 1; } if (days > 30) days = 30; } /* // 月初日到月底日,以 30 天計算 if (startDay.Day == 1 && endDay.Day == monthEndDay) { days = 30; } else { // 結束日是月底日,用 30 去減 //if (endDay.Day == monthEndDay) // days = 30 - startDay.Day + 1; // 結束日非月底日,用實際結束日去減 //else days = endDay.Day - startDay.Day + 1; // 調整天數,最多 30 天 if (days > 30) days = 30; } */ // 若本月累計天數 > 30 則減去多出的天數 if (_inworkdays + days > 30) days = 30 - _inworkdays; _inworkdays += days; daysRatio = Convert.ToDouble(days) / 30d; // 計算公司提撥 if (employeeType == "1") // 員工身份是雇主 _companyFee += 0; else _companyFee += Math.Round(bsamt * 0.06 * daysRatio, 4, MidpointRounding.AwayFromZero); // 計算個人提撥 _personalFee += Math.Round(bsamt * ((double)personalRate / 100) * daysRatio, 4, MidpointRounding.AwayFromZero); } } } public struct LaborRetireAnnuity { public int CompanyFee; public int PersonalFee; public int AnnuitySalary; public void Init() { AnnuitySalary = 0; CompanyFee = 0; PersonalFee = 0; } public void Add(LaborRetireAnnuity fee) { AnnuitySalary = fee.AnnuitySalary; CompanyFee += fee.CompanyFee; PersonalFee += fee.PersonalFee; } }