//自动创建契约津贴发放记录
        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;
        }
Ejemplo n.º 2
0
        //清理无效的记录
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
 protected override void OnLoaded()
 {
     if (string.IsNullOrEmpty(this.职务名称))
     {
         this.职务名称 = PsHelper.GetValue(PsHelper.职务代码, this.基础工资表.职务代码);
         this.Save();
     }
     salaryResult = SalaryResult.GetFromCache(this.员工编号, this.年度, this.月份);
     base.OnLoaded();
 }
Ejemplo n.º 5
0
        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();
            }
        }
Ejemplo n.º 6
0
        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(职务等级);
        }
Ejemplo n.º 8
0
        //自动创建借款记录
        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);
        }