1,工资计算公式
每一个企业都一定会用到工资计算,发工资是一件非常神圣的事情,而计算工资就是一项非常重要的工作。Excel有非常强大的公式功能,帮助了很多财务人员计算工资,但如果企业的人数比较多,而且工资的计算公式比较复杂,那使用Excel的人员必须是一个超高手了,但Excel维护起来也是非常困难的。
所以有不少上一定规模的企业会上一套工资系统,做得比较好的工资系统都会提供工资公式的编辑功能,而这些编辑功能就非常类似于Excel的公式,这样财务人员操作起来就比较容易上手。假设某厂企有如下的工资相关基本字段:
序号 | 字段 | 说明 |
1 | 基本工资 | 员工的基本工资。 |
2 | 状态 | 新入职、试用、转正、正式等。 |
3 | 员工性质 | 残疾人、正常。 |
4 | 月工作天数 | 当月的工作天数。 |
5 | 转正前天数 | 当月,员工在转正之前的天数。 |
6 | 转正后天数 | 当月,员工在转正之后的天数。 |
7 | 平时加班合计小时 | 非节假日和周六日的加班小时数。 |
8 | 周末加班合计小时 | 周末日加班合计的小时数。 |
9 | 节假日加班合计小时 | 节假日加班合计小时数。 |
10 | 平时顶班合计小时 | 平时顶班合计小时数。 |
11 | 周末顶班合计小时 | 周末日顶班合计小时数。 |
12 | 节假日顶班合计小时 | 节假日顶班合计小时数。 |
13 | 实际出勤天数 | 员工实际出勤的天数。 |
14 | 高温津贴 | 工厂给员工提供的高温津贴。 |
15 | 学历补贴 | 工厂给高学历员工提供的津贴。 |
16 | 奖金点数 | 各个员工级别设置不同的资金点数。 |
17 | 每点奖金 | 根据每个月的业绩和资金点数和落实的每点奖金。 |
18 | 气味津贴 | 工厂给员工提供的气味津贴。 |
19 | 粉尘津贴 | 工厂给员工提供的粉尘津贴。 |
20 | 事假小时 | 每个月事假的小时数。 |
21 | 病假小时 | 每个月病假的小时数。 |
22 | 旷工小时 | 每个月旷工的小时数。 |
23 | 用餐费 | 员工在饭堂每月的用餐费。 |
24 | 餐补 | 工厂给员工提供的用餐补贴。 |
25 | 计薪方式 | 销售提成,搬运提成等。 |
工资公式:
序号 | 项目 | 公式 |
1 | 实发基本工资 | 1, 状态=转正,1310/月工作天数*转正前天数 + 基本工资/月工作天数*转正后天数。 2,状态!=转正,实发基本工资=基本工资/月工作天数*实际出勤天数。 |
2 | 平时加班费用 | 员工性质=残疾人,平时加班费用=0,否则平时加班费用=基本工资/21.75/8*平时加班合计小时*1.5。 |
3 | 周末加班合计费用 | 员工性质=残疾人,周末加班费用=0,否则周末加班费用=基本工资/21.75/8*周末加班合计小时*2。 |
4 | 节假日加班费用 | 员工性质=残疾人,节假日加班费用=0, 否则,节假日加班费用=基本工资/21.75/8*节假日加班合计小时*3。 |
5 | 平时顶班费用 | 员工性质=残疾人,平时顶班费用=0, 否则平时顶班费用=基本工资/21.75/8*平时顶班合计小时*1.5。 |
6 | 周末顶班费用 | 员工性质=残疾人,周末顶班费用=0, 否则周末顶班费用=基本工资/21.75/8*周末顶班合计小时*2。 |
7 | 节假日顶班费用 | 员工性质=残疾人,节假日顶班费用=0, 否则节假日顶班费用=基本工资/21.75/8*节假日顶班合计小时*3。 |
8 | 实发高温津贴 | 员工性质=残疾人,实发高温津贴为0, 实发高温津贴=高温津贴/月工作天数*实际出勤天数。 |
9 | 实发学历补贴 | 计薪方式包含“提成”,则为0, 否则为学历补贴。 |
10 | 奖金数 | 状态=转正,且计薪方式=销售提成,(基本工资-1310)/月工作天数*转正前天数 + 资金点数*每点奖金。 如计薪方式包含“提成”,则资金点数*每点奖金。 |
11 | 实发气味津贴 | 气味津贴/月工作天数*实际出勤天数。 |
12 | 实发粉尘津贴 | 实发粉尘津贴=粉尘津贴/月工作天数*实际出勤天数。 |
13 | 事假扣除 | 事假扣除=基本工资/月工作天数/8*事假小时。 |
14 | 病假扣除 | 病假扣除=基本工资/月工作天数/8*病假小时。 |
15 | 旷工扣除 | 旷工扣除=基本工资/月工作天数/8*旷工小时。 |
2,技术实现
要在.Net中实现公式编辑功能,则必须实现公式的解释器,而最强大的解释器无疑就是.Net的编译引擎了,编译引擎是可以实现任何功能的。.Net自带动态编译的逻辑,但要组织好一个编译逻辑并且要合理展现出来,也同时结合适度的扩展功能,那就不太简单了。
对上面提及的工资计算公式,可能会经常发生变化的,厂企会根据自带的需求,增加更多的规则,或修改一些规则,甚至各个月的规则都是不同的,只与上个月的部分相同。这种情况下,把工资计算公式交给厂企的财务人员是一个合理的做法。这就对业务系统开发商提出更高的要求了,如果是个人开发者,那就更加困难了。
CKRule规则引擎提供了这个功能,其客户规则池就是允许客户进行自定义公式的。业务系统开发商只需要简单几步就可以实现动态公式了,1,配置好关键字,比较逻辑和结论/操作,2,在业务系统中加载配置,并设置界面,3,用户在友好的界面下编辑规则,保存规则到数据库,4,主规则调用中加载客户规则池。
在工具中自定义类型及传入传出属性:
定义客户规则池的关键字和操作符。
关键字可以与传入传出类型一样,也可以新建,结论操作则为了让用户适应类似Excel的操作使用IIF语法。
设置主规则,在主规则中,只需要调用数据库中的规则,再执行规则池即可。代码如下:
var _table = LookDB(@"
select
'' as id,
sindex as ""index"",
'' as returnType,
'Get' + name as propname,
0 as codestyle,
'' as ifcode,
0 as thencodeisscript,
'结果.' + name + ' = ' + CalcCode + ' ;' as thencode,
0 as priority ,
'' as execstep
from poolset
");
InitPool(_table);
ExePool();
业务系统实现
下图是业务系统的一部分,开发商可以根据需要将界面定义得比较友好。以适应原有系统的需要。设置公式界面也可以定义得更加的友好,用户设置完公式之后,工资计算就会使用新的公式进行。