工资单工资结算
2020-09-07 23:45:58 10 举报
AI智能生成
工资单
作者其他创作
大纲/内容
工资结算设置
职级薪资管理
职级
置业顾问
业务主管
分店经理
区域经理
大区总监
薪资类型
底薪
<font color="#c41230">首月底薪</font>
<font color="#c41230">没有用到,计算首月底薪时是查询工资结算规则中的数据的</font>
业绩提成
单列收入
<font color="#0076b3">租房实收??</font>
社会保险,住房公积金
最后扣钱
新人推荐奖
<font color="#c41230">新人卓越奖(未使用到)</font>
管理津贴
分店,区域,大区
直接,间接
<font color="#c41230">职务津贴(未用到)</font>
<font color="#c41230">职务不是和权限挂钩的吗??怎么还有津贴??</font>
话费补助
结算方式
业绩提成,规定金额
若为业绩提成,则提成规则,根据工资结算方案来获取具体的值
固定金额,最低金额
附加费用,折扣比例
<font color="#0076b3">顺序计算??先算附加费用再算折扣比例??</font>
工资结算方案
方案类型
底薪提成
业绩提成
单端口,多端口津贴
话费补助、推荐提成
管理津贴总业绩、人均业绩
管理津贴活动率
职级
自己选择进行配置
方案明细
范围区间,范围值确定配置值,有些为百分比
数据库用json形式进行存储(值*100)
工资结算规则
首页端口补贴天数
开端口首月底薪
育成系数
职务津贴
主管,分店,区域,大区
代分店,代大区总提
单列提成
本人、推荐人
主管、分店、区经、大区
工资结算
公司人力月统计
统计该公司每月的出勤天数
<font color="#c41230">员工加款(未计算)</font>
<font color="#c41230">员工扣款(未计算)</font>
员工月统计
类型
月份
姓名,职级,部门
考勤天数
是否社保、公积金
<font color="#c41230">主推盘网放合格率(未使用到)</font>
<font color="#c41230">什么东西??只有0和1??</font>
端口类型,端口津贴系数值
<font color="#c41230">考勤天数之后可通过钉钉进行自动同步(未实现)</font>
<font color="#c41230">支持数据导入,根据手机号码自动关联(未实现)</font>
工资单
工资单分项
签约月份(合同月)
结算月份
被推荐奖励推荐人
合同月实收分给推荐人的钱
bean对象
SalaryResponse(响应结果对象)<br>
payrollItemMap Map<Date, HrPayrollItem>
合同月在本月的实收以及底薪提成
payrollItemMap Map<签约月, 工资单分项>
结算基本逻辑
1.准备待处理数据
记录月应出勤天数(更新或添加公司人力月统计记录)
天数* 100
工资结算规则
结算方案<br>
Map<HrSalaryPlanType, Map<String, HrSalaryPlan>> salaryPlanMap
Map<方案类型, Map<职级, 结算方案对象>><br>
获取所有职级薪资配置对象
Map<String, Map<HrSalaryType, HrRankSalary>> rankSalaryMap
Map<职级, Map<薪资类型, 职级薪资配置对象>>
职务异动记录,用来追溯员工职级和部门
Map<Long, List<StaffTransfer>> transfersMap
Map<员工id, 异动记录列表>
部门,员工
Map<Long, Department> departmentMap
Map<Long, Staff> allStaffMap
推荐人、育成人
Map<Long, Set<Staff>> referrerMap
Map<Long, Set<Staff>> supBreederMap
Map<Long, Set<Staff>> shopBreederMap
Map<Long, Set<Staff>> regionBreederMap
Map<Long, Set<Staff>> perganaBreederMap
Map<(推荐人、育成人、店长等id), 手下的员工集合> perganaBreederMap
A 需要计算工资的员工列表
Map<Long, Staff> payingStaffs
要计算工资的人
在职人员
当月有实收的(离职人员也要)
B 遍历所有员工<br>
统计推荐人,育成人
现只统计当月在职人员<br>
结算月员工数据
Map<Long, HrStaffMonthly> staffMonthlyMap<br>
Map<员工id, HrStaffMonthly> (考勤天数,是否保险,公积金,网盘合格率等等) <br>
<font color="#5c5c5c">签约月在本月</font>(结算月)<font color="#5c5c5c">的实收统计</font>
Map<Long, Map<Date, ReceivedStat>> staffReceivedStatMap
Map<staffId, Map<签约月, 本月的实收统计对象(签约合同月,结算月实收金额,新房、二手房、租房交易实收金额)>> <br>
<font color="#5c5c5c">其他合同月实收统计</font><br>
主管合同月实收统计
分店经理合同月实收统计
区域经理合同月实收统计
大区经理合同月实收统计
Map<Long, Map<Date, ReceivedStat>> pmReceivedStatMap
结算月合同统计
Map<Long, OrderCountStat> orderCountStatMap
Map<员工id, 合同数量统计(员工id,新房交易数量,二手房交易数量,租房交易数量)><br>
C 统计实收(当月的所有实收)
新房
<ul><li>1 根据收款时间查询<font color="#16884a">结算月</font>新房实收单(审核通过的)</li></ul>
2 遍历实收单,获取对应的新房交易单
单独员工方法复用,用来获取员工订单数量统计项,传入map,staffId,返回一个object,方法内处理为空的情况,优秀。getOrderCountStat
3 获取合同数量统计对象,value值 +1<br>
4 根据新房交易单获取业绩分成对象,遍历
A 将有实收的员工加到要统计工资单的员工map中(payingStaffs)<br>
B 计算分成人的分成业绩,通过staffId和签约时间(签约月)获取本月(结算月)的实收统计对象(ReceivedStat),累加新房分成业绩、总分成业绩<br>
C 判读当前分成人有无主管、店长、区经、大区,如果有则一并将业绩累加上去
二手房
与新房一致
租房
与新房一致
<font color="#c41230">D 未统计实付!!!</font>
2.第一次循环
遍历所有payingStaffs<br>
<font color="#c41230">判断职级是否为空??为了删选什么??测试人员??</font><br>
a.构建初始数据,响应数据
构建初始数据
设置当前staffId,起始时间,当月考勤天数,工资结算规则<br>
传入之前所有的实收统计结果(一个总的【staffReceivedStatMap】,其余是当前用户相关的实收统计)<br>
结算方案,职级薪资配置对象,部门,所有员工<br>
当前员工的异动记录,当前员工的结算月员工统计数据(考勤天数,开端口数)
员工所有的育成人,店长,区经等关联关系map<br>
响应数据
初始化工资单对象(HrPayroll),设置基本参数<br>
工资单分项map
Map<Date, HrPayrollItem> payrollItemMap
Map<签约月, 工资单分项> 比工资单多【签约月、结算月、结算月贡献给推荐人的金额】
b.将数据加入到基础责任链中循环
3.第二次循环
将第一次循环的结果加入到高级责任链中循环
链条处理器
基本
预处理-处理器(PrepareHandlerImpl)<br>
1 初始化工资单,设置员工考勤天数
2 根据员工、时间(结算前一个月)、异动记录;推测出当前员工职级,,并设置到工资单上面<br>
A 判断员工是否已入职、是否有异动记录<br>
B 利用stream管道流计过滤出和职务异动有关的数据(过滤条件)<br>
异动员工不是当前计算工资员
不属于职务异动
异动记录在结算月的下一个月之前都排除!!
C stream 排序,取出时间最小的异动记录,返回异动前职级,若没有返回当前员工的职级<br>
3 遍历员工合同月实收统计Map<Date, ReceivedStat><br>
根据签约月,设置工资单分项的新房、租房、二手房的实收<br>
推测员工职级,时间(签约月),参数与上面一致,设置上去
统计员工所有二手房、新房、租房的实收
4 设置工资单中,员工所有二手房、新房、租房的实收;若本月无实收,工资单分项只添加本月的职级<br>
底薪-处理器(BasicSalaryHandlerImpl)
1 遍历员工合同月实收统计
A 通过实收统计的签约月获取工资单分项,进而根据职级和薪资类型(底薪)获取职级薪资对象<br>
<font color="#c41230">未根据签约月进行回溯???</font><br>
B 结算月 == 签约月
1 判断薪资类型中的结算方式
固定金额:直接获取<br>
业绩提成:根据本月实收获取底薪<br>
根据结案方案类型、职级获取结算方案对象
根据结算方案对象中配置的区域范围获取值
2 处理附加款、折扣和最低金额<br>
3 根据出勤率计算实际底薪
实际出勤天数/应出勤天数 四舍五入,保留4位小数
4 总底薪累加月底薪,工资单分项设置月底薪<br>
C 结算月 != 签约月
结算方式 == 固定金额,直接跳过(已发放过)<br>
结算方式 == 业绩提成
1 根据合同月份获取指定员工在结算月之前的工资单分项列表<br>
2 遍历统计结算月之前所有的总实收(新房实收 + 二手房实收)、已拿的底薪<br>
3 再次累加本月实收,计算实收获取底薪,处理附加款、折扣和最低金额<br>
4 出勤率计算 : 签约月的实际出勤天数/签约月应出勤天数;再算出当前应获取的底薪
当月应发底薪 = 当前应获取的底薪 - 已拿底薪<br>
5 工资单分项设置月底薪
D 本月无实收
与 B 相同只是不需要统计实收
2 设置工资单底薪值
首月底薪 - 处理器(FirstMonthFeeHandlerImpl)<br>
1 判断员工是否要发首月底薪
无 :不处理
有 :计算员工历史出勤天数<br>
历史出勤天数>首月端口补贴的天数;不处理<br>
else<br>
本月出勤天数>剩余首月端口补贴天数,剩下补贴全发
else;只发本月出勤天数的补贴
端口津贴 - 处理器(PortFeeHandlerImpl)
1 遍历员工合同月在本月(结算月)的实收统计
1 判断该合同月是否开端口;查询该职级是否有职级配置对象<br>
2 判断出合同月员工的开端口情况
<font color="#c41230">3 获取结算月之前合同月实收和发放记录,需要查看代码确认!!!</font><br>
结算月 == 签约月
根据本月实收计算发放津贴<br>
结算月 != 签约月
1 根据合同月份获取员工的累计实收、累计端口津贴
<font color="#c41230">74行 totalReceived += receivedStat.getAmount(); ???</font><br>
2 计算出本月应发津贴
公式 : 签约月实收 * 签约月的端口津贴系数值<br>
话费补助 - 处理器(TelephoneFeeHandlerImpl)<br>
1 判断职级是否配置话费补助,员工有无手机,有无话费补助<br>
2 结算类型
固定金额:直接设置
<font color="#c41230">问题: 不用处理附加款、折扣和最低金额吗???</font><br>
业绩提成:
1 根据结算月开单数算提成
问题:数据统计的是当月有实收的成交单的数量???<br>
2 根据薪资结算方案,获取话费补贴
3 处理附加款、折扣和最低金额
业绩提成 - 处理器(PerformanceFeeHandlerImpl)<br>
1 遍历员工合同月实收统计
结算月 == 签约月
根据本月实收获取结算方案,进而算出业绩提成<br>
结算月 != 签约月
根据合同月份获取员工的累计实收、累计底薪、累计提成
计算出本月应发提成
主管(组)直接管理津贴 - 处理器(SupervisorFeeHandlerImpl)<br>
1 遍历员工签约月在本月的实收统计
1 回溯员工合同月所在组
A 判断员工是否已入职、是否有异动记录
B 利用stream管道流计过滤出和职务异动有关的数据(过滤条件)
异动员工不是当前计算工资员
部门异动、离职<br>
异动记录在结算月的下一个月之前都排除!!
C stream 排序,取出时间最小的异动记录,返回异动前部门,若没有返回当前员工的部门
<font color="#5c5c5c"> 2 统计当前分组签约月到下一个月所有订单的,开单人、实收人</font><br>
Set<Long> signerReceivedSet <br>
Set<Long> signerSet
Set<签约人Id><br>
3 获取结算月之前最近一次的管理津贴发放记录<br>
4 计算管理津贴<br>
结算月 == 签约月
<font color="#5c5c5c">A 计算合同月(签约月)人力</font>
遍历所有员工<br>
1 判断计算在职员工,及签约月时属于当前统计部门<br>
<font color="#5c5c5c">2 计算签约月人力</font><br>
公式:签约人算一人;签约月在职人员算一人;中途有入离职,当月在职天数/当月总天数<br>
B new一个管理津贴对象,设置相关参数<br>
结算月 != 签约月
获取原来管理津贴对象,累加统计所有的实收,重新赋值给新的津贴管理对象<br>
5 组人均业绩<br>
公式: 签约月总应收/签约月人力<br>
根据薪资结算方案中的范围获取人均业绩系数<br>
6 组活动率<br>
公式:合同月该部门累计开单(签约人)且有实收的人数/签约月人力
根据薪资结算方案中的范围获取活动率系数
7 主管团队直接育成关系系数
查询工资结算规则
8 累计管理津贴<br>
<font color="#0076b3">公式:总实收 * 人均业绩系数 * 活动率系数 * 主管直接育成系数 乘的时候有顺序吗??</font><br>
9 设置管理津贴,返回对象添加管理津贴列表,设置工资单分项的直接管理津贴(本月发放的,总的减已经发的),累加总津贴<br>
2 计算单列提成<br>
<font color="#c41230">问题:分店经理不发单列提成??</font><br>
获取结算月所有的租房实收,根据工资结算规则计算出应发津贴进行累加,设置到工资单直接管理津贴中<br>
分店直接管理津贴 - 处理器(ShopFeeHandlerImpl)<br>
与 主管(组)直接管理津贴 一致
新增:总业绩系数值的获取
<font color="#c41230">问题:区经和大区都发分店管理津贴???</font>
<font color="#c41230">问题:67,68行 提示要改一下</font><br>
大区直接管理津贴 - 处理器(PerganaFeeHandlerImpl)<br>
与 分店一致
社会保险 - 处理器(InsuranceFundHandlerImpl)<br>
直接根据职级薪资管理查询到固定值,设置到工资单对象中<br>
住房公积金 - 处理器(AccumulationFundHandlerImpl)
与社会保险一致
后处理 - 处理器(FinallyHandlerImpl)<br>
删除已存在的工资单和明细记录
持久化工资单
持久化各合同月明细记录
管理津贴累计发放记录
高级
新人推荐奖励处理 - 处理器(NewbReferralBonusHandlerImpl)<br>
1 获取当前员工推荐的所有新人,遍历<br>
A 获取员工签约月在本月的实收统计,遍历<br>
筛选出入职三个月以内的实收
处理单列推荐奖励
在工资结算规则中获取单列推荐人提成比例,计算单列推荐奖励
处理A类推荐奖励
根据被推荐人和合同月份获取结算月之前的工资单分项
结算月 == 签约月
获取推荐提成比例,计算奖励金额
结算月 != 签约月
1 遍历工资单分项,统计之前已经发的奖励金额、和员工之前实收的金额
2 计算出总共的奖励金额,减去已给的,算出当月要发的奖励金额
3 记录到被推荐人当月的工资单明细中,累加奖励金额
2 将新人推荐奖设置到工资单中(单列推荐奖励+A类推荐奖励)
主管(组)间接管理津贴 - 处理器(SupervisorIndirectFeeHandlerImpl)<br>
1 判断员工有无主管间接管理津贴(职级查询)<br>
2 获取员工手下的育成人,遍历查询出员工的直接津贴,进行累加<br>
<font color="#c41230">3 获取工资结算规则中单列育成主管提成 * 直接管理津贴 ???</font><br>
<font color="#c41230">问题1 :统计的直接津贴是包含单列津贴的!!</font>
<font color="#c41230">问题2:在工资结算规则中,有主管间接育成系数、单列推荐人提成两种</font><br>
<font color="#c41230">问题3:间接管理津贴是在直接管理津贴的基础上再去出乘的吗??</font>
分店间接管理津贴- 处理器(ShopIndirectFeeHandlerImpl)
与主管一致
区域间接管理津贴 - 处理器(RegionIndirectFeeHandlerImpl)
大区间接管理津贴 - 处理器(PerganaIndirectFeeHandlerImpl)
高级处理器后处理 - 处理器(SeniorFinallyHandlerImpl)
更新工资单数据
<font color="#c41230">系统中所有设置的参数(职级薪资管理、工资结算方案、工资结算规则)都没有回溯,都是直接取当前的配置信息</font>
0 条评论
下一页