//自动创建契约津贴发放记录 public static List<MonthlyContractAllowanceItem> AutoGenerateMonthlyContractAllowanceItems(int year, int month) { List<MonthlyContractAllowanceItem> list = new List<MonthlyContractAllowanceItem>(); //获取正在执行的借款标准 List<ContractAllowance> ContractAllowanceList = GetContractAllowances(year, month); foreach (ContractAllowance wa in ContractAllowanceList) { SalaryResult sr = SalaryResult.GetFromCache(wa.员工编号, year, month); //如果已经发上表工资 if (sr != null) { if (sr.企业排班天数 == 0) continue; MonthlyContractAllowanceItem item = MonthlyContractAllowanceItem.AddMonthlyContractAllowanceItem(wa.员工编号, year, month); item.姓名 = sr.姓名; item.月津贴标准 = wa.月津贴额度; item.应出勤天数 = sr.企业排班天数; item.实际出勤天数 = sr.实际出勤天数; item.实际发放金额 = Math.Round(wa.月津贴额度 * (sr.实际出勤天数 / sr.企业排班天数), 2); item.Save(); list.Add(item); } } return list; }
//清理无效的记录 public static List <EmployeeInfo> ClearInvalidRecord() { List <EmployeeInfo> empListChanged = new List <EmployeeInfo>(); List <EmployeeInfo> empList = EmployeeInfo.GetHasPayEmployeeList(); //最近一次发工资的日期 DateTime lastSalaryDate = SalaryResult.GetLastSalaryDate(); if (lastSalaryDate == DateTime.MinValue) { return(empListChanged); } //上月最后一天(相当于该员工有工资的最后一个月,这里是相对的概念) DateTime preMonthLastDayDate = new DateTime(lastSalaryDate.Year, lastSalaryDate.Month, 1).AddMonths(1).AddDays(-1); //上上月 DateTime prePreMonthLastDayDate = preMonthLastDayDate.AddMonths(-1); DateTime expiredDate = prePreMonthLastDayDate; foreach (EmployeeInfo emp in empList) { //2018-7-24 管培生薪酬体系特殊,不随公司与职务等级变化,不设异动判断 if (emp.是管培生) { continue; } MonthlySalary ms = GetEffective(emp.员工编号, lastSalaryDate); if (ms != null) { SalaryResult sr = SalaryResult.GetFromCache(emp.员工编号, lastSalaryDate.Year, lastSalaryDate.Month); if (sr != null) { SalaryResult prev_sr = SalaryResult.GetFromCache(emp.员工编号, prePreMonthLastDayDate.Year, prePreMonthLastDayDate.Month); //如果公司、职等都没变 if (prev_sr == null || (prev_sr.公司编号 == sr.公司编号 && ms.职等 == sr.工资职等)) { continue; } expiredDate = new DateTime(sr.年度, sr.月份, 1).AddDays(-1); } else { continue; } if (ms.截止日期 < ms.开始执行日期) { continue; } //截止日期为上上月最后一天 ms.截止日期 = expiredDate; ms.Save(); empListChanged.Add(emp); } } return(empListChanged); }
private SalaryResult GetSalaryResult(string emplid, DateTime date) { SalaryResult salary = SalaryResult.GetFromCache(emplid, date.Year, date.Month); if (salary != null) { PrivateSalaryCache.Set(emplid, salary, TimeSpan.FromHours(4)); } return(salary); }
protected override void OnLoaded() { if (string.IsNullOrEmpty(this.职务名称)) { this.职务名称 = PsHelper.GetValue(PsHelper.职务代码, this.基础工资表.职务代码); this.Save(); } salaryResult = SalaryResult.GetFromCache(this.员工编号, this.年度, this.月份); base.OnLoaded(); }
protected override void OnSaving() { if (string.IsNullOrEmpty(this.员工编号)) { this.员工编号 = ""; return; } if (string.IsNullOrEmpty(this.类型)) { throw new Exception("类型不能为空."); } if (this.录入时间 == DateTime.MinValue) { this.录入时间 = DateTime.Now; } //判断已经审核的薪资组不能修改 SalaryResult salResult = SalaryResult.GetFromCache(this.员工编号, this.年, this.月); if (salResult == null) { throw new Exception("未发现【" + this.姓名 + "】的工资记录,请先生成工资表后再录入。"); } else { SalaryAuditingResult auditingResult = SalaryAuditingResult.GetSalaryAuditingResult(salResult.薪资组, this.年, this.月); if (auditingResult == null) { throw new Exception("未发现【" + salResult.薪资组名称 + "】的工资审核情况表"); } else { if (auditingResult.已审核) { throw new Exception("薪资组【" + salResult.薪资组名称 + "】的工资已经审核,不能添加或修改。"); } } } OtherMoney found = GetOtherMoney(this.员工编号, this.年, this.月, this.类型, this.项目名称); if (found != null && found.标识 != this.标识) { throw new Exception("同一个奖扣项不能重复录入."); } else { base.OnSaving(); } }
protected override void OnSaving() { if (string.IsNullOrEmpty(this.姓名)) { throw new Exception("姓名不能为空."); } if (this.录入时间 == DateTime.MinValue) { this.录入时间 = DateTime.Now; } //判断已经审核的薪资组不能修改 SalaryResult salResult = SalaryResult.GetFromCache(this.员工编号, this.年, this.月); if (salResult == null) { throw new Exception("未发现" + this.姓名 + "的工资记录."); } else { SalaryAuditingResult auditingResult = SalaryAuditingResult.GetSalaryAuditingResult(salResult.薪资组, this.年, this.月); if (auditingResult == null) { throw new Exception("未发现" + this.姓名 + "的工资审核情况表"); } else { if (auditingResult.已审核) { throw new Exception(this.姓名 + "的工资已经审核,不能添加或修改。"); } } } EmpPayRate found = GetEmpPayRate(this.员工编号, this.年, this.月); if (found != null && found.标识 != this.标识) { throw new Exception("每个员工每月只有一个工资系数."); } else { base.OnSaving(); } }
public void Calculate() { decimal 标准职务工资, 个人职务工资; 是标准职务工资 = true; 满勤奖_显示 = "—"; 年休假_显示 = "—"; 津贴补助_显示 = "—"; //获取薪酬信息 GetPayInfo(); //获取上表工资标准 SalaryBaseInfo sbi = PsHelper.GetSalaryGrade(员工编号, 期间_开始); if (sbi != null) { 表工资标准 = sbi.表工资标准; 年休假工资 = sbi.年休假工资; 满勤奖金额 = sbi.满勤奖金额; 满勤奖_显示 = 满勤奖金额 > 0 ? 满勤奖金额.ToString("#0.##") : "—"; 年休假_显示 = 年休假工资 > 0 ? 年休假工资.ToString("#0.##") : "—";; } #region 计算职务工资 StepPayRate stepPayRate = null; List <StepPayRate> rates = 标准职务工资表.FindAll(a => a.薪级标识 == 薪级_月初).OrderByDescending(a => a.执行日期).ToList(); if (rates.Count > 0) { stepPayRate = rates[0]; 开始执行日期 = 开始执行日期_月初; } //月底职级 List <StepPayRate> rates_月底 = 标准职务工资表.FindAll(a => a.薪级标识 == 薪级_月底).OrderByDescending(a => a.执行日期).ToList(); if (rates.Count > 0) { StepPayRate stepPayRate_月底 = rates[0]; //如果月底职级改变,去工资低的 if (stepPayRate_月底.标识 != stepPayRate.标识) { stepPayRate = stepPayRate.工资额 < stepPayRate_月底.工资额 ? stepPayRate : stepPayRate_月底; 开始执行日期 = 开始执行日期_月底; } } PersonPayRate personPayRate = null; List <PersonPayRate> pRates = 个人职务工资表.FindAll(a => a.生效日期 == 期间_开始 && a.员工编号 == this.员工编号).OrderByDescending(a => a.生效日期).ToList(); if (isRealtime) { pRates = 个人职务工资表.FindAll(a => a.效 && a.员工编号 == this.员工编号).OrderByDescending(a => a.生效日期).ToList(); } if (pRates.Count > 0) { personPayRate = pRates[0]; 开始执行日期 = personPayRate.生效日期; //津贴补助 津贴补助 = personPayRate.津贴1金额 + personPayRate.津贴2金额; 津贴补助_显示 = 津贴补助 > 0 ? 津贴补助.ToString("#0.##") : "—"; } 标准职务工资 = stepPayRate == null ? 0 : stepPayRate.工资额; 个人职务工资 = personPayRate == null ? 0 : personPayRate.月薪; 职务工资 = 个人职务工资 == 0 ? 标准职务工资 : 个人职务工资; 是标准职务工资 = 个人职务工资 == 0; //2017-7-23 加上年休假工资 职级工资 = 职务工资 + 年休假工资; //重新计算有效的薪等薪级 工资职级 = " - "; if (stepPayRate != null && 是标准职务工资) { 封闭薪等 = stepPayRate.薪等标识; 封闭薪级 = stepPayRate.薪级标识; SalaryNode grade = SalaryNode.工资等级表.Find(a => a.标识 == 封闭薪等); if (grade != null) { 薪等 = grade.称; } grade = SalaryNode.工资等级表.Find(a => a.标识 == 封闭薪级); if (grade != null) { 薪级 = grade.称; } 工资职级 = 薪等 + 薪级; } #endregion SalaryResult sr = SalaryResult.GetFromCache(员工编号, 年, 月); 公司编码 = sr == null ? employeeInfo.公司 : sr.公司编号; 职务等级 = sr == null ? employeeInfo.职务等级 : sr.职务等级; 职级 = PsHelper.GetSupvsrLvDescr(职务等级); }
//自动创建借款记录 public static List <MonthlyWageLoanItem> AutoGenerateMonthlyWageLoanItems(int year, int month) { List <MonthlyWageLoanItem> list = new List <MonthlyWageLoanItem>(); //获取正在执行的借款标准 //2018-9-13 部分员工可能会有多条执行标准,查询结果按开始时间先后排序,执行的原则是新的标准会替代旧的标准,所以实际会计算多次,后计算的覆盖旧的 List <WageLoan> wageLoanList = GetWageLoans(year, month); foreach (WageLoan wl in wageLoanList) { SalaryResult sr = SalaryResult.GetFromCache(wl.员工编号, year, month); //如果已经发上表工资 if (sr != null) { if (sr.企业排班天数 == 0) { continue; } string 班别 = sr.班别.Trim(); decimal 月借款额度 = wl.月借款额度; decimal 排班天数 = sr.企业排班天数; decimal 实际出勤天数 = sr.实际出勤天数; decimal 实际借款金额 = 0; if (班别 == "6") //行政班 { if (sr.实际出勤天数 > 10) { 实际借款金额 = 月借款额度 - 月借款额度 / (decimal)21.75 * (排班天数 - 实际出勤天数); } else { 实际借款金额 = (月借款额度 / (decimal)21.75) * 实际出勤天数; } } else { if (班别 == "8") //特殊+业务代表+司机 { 实际借款金额 = (月借款额度 / 排班天数) * 实际出勤天数; } else { 实际借款金额 = (月借款额度 / 26) * 实际出勤天数; } } MonthlyWageLoanItem item = MonthlyWageLoanItem.AddMonthlyWageLoanItem(wl.员工编号, year, month); item.姓名 = sr.姓名; item.约定税率 = wl.约定税率; item.月借款标准 = wl.月借款额度; item.应出勤天数 = sr.企业排班天数; item.实际出勤天数 = sr.实际出勤天数; item.实际借款金额 = Math.Round(实际借款金额, 2, MidpointRounding.AwayFromZero); item.代缴个税 = Math.Round(item.实际借款金额 * wl.约定税率 * (decimal)0.01, 2, MidpointRounding.AwayFromZero); item.税后实发金额 = item.实际借款金额 - item.代缴个税; item.Save(); list.Add(item); } } return(list); }