根据考勤和绩效信息计算应发工资

l  问题

某企业财务需要为员工计算员工工资并将数据导出给银行,工资的计算首先需要参考员工的缺勤率和工作绩效,具体规则为:

基本工资*(1-缺勤率+绩效)

而后再缴纳个人所得税,个税的计算方法为:以所得工资减去2000元的免税部分,剩余的部分以超额累计的方法计算,即分段计税,每段的税率如下表:

Levels

Containing tax grade difference

Tax rate(%)

Tax reduction factor

1

below 500

5

0

2

500-2000

10

25

3

2000-5000

15

125

4

5000-20000

20

375

5

20000-40000

25

1375

如员工收入6000元,减去2000元,剩余的4000元为应缴税部分,按分段计税的方法,应缴税额为:

500*5%+1500*10%+2000*15%=475

也可以使用速算扣除数计算:

4000*15%-125=475

 

下表是企业的员工信息表:

下表是员工本月的缺勤率表,如果员工没有缺勤,则表中不会有该员工的记录。

下表是员工本月的绩效表,同样也不是所有员工都有绩效的。

请合算出每位员工应发的工资数额,并将结果导出为TXT文件,以便提交给银行。TXT文件的格式需为:

公司名称

TOAM=工资总额

COUT=员工人数

---------------------------------------

银行账户 | 应发金额 | 姓名

银行账户 | 应发金额 | 姓名

……

l  思路

1.  基于雇员表创建新的序表,保留雇员姓名、基本工资、银行账户字段,增加缺勤率、绩效、应发工资字段,其中缺勤率字段的值为从缺勤率表中选出的相应记录,绩效表也是一样,应发工资字段写0

2.  按公式计算出每名员工的应发工资,写入应发工资字段。对于没有缺勤或绩效记录的员工,缺勤或绩效字段会为空,计算时会自动按0处理,正好符合我们的要求。

3.  将税率表抄进代码,并转换成序表,以便计算。

4.  为每位员工计算个税,先找出他所在的收入段,而后直接使用速算扣除数算出税额,并从工资中扣除。

5.  然后就可以开始写入TXT文件了。创建一个TXT文件对象,依次写入公司名、应发工资的总额、需要转账的人数和分隔线。

6.  循环前面的表,将记录按格式逐条写入到TXT文件中。

l  代码

 

A

B

C

 

1

=file("C:\\txt\\Employees.txt").import@t()

 

 

雇员表

2

=file("C:\\txt\\Absenteeism.txt").import@t()

 

 

缺勤率表

3

=file("C:\\txt\\Performance.txt").import@t()

 

 

绩效表

4

/工资

/税率(%)

/速算扣除数

税率表

5

500

5

0

 

6

2000

10

25

 

7

5000

15

125

 

8

20000

20

375

 

9

40000

25

1375

 

10

D:\Bank Pay File.txt

 

 

导出TXT文件路径

11

=A1.new(Name,A2.select@1(Employee==ID).Absenteeism:Absenteeism,A3.select@1(Employee==ID).Performance:Performance,BasePay,AccountNo,0:SalaryPayable )

 

 

基于雇员表新建新字段结构的序表,同时选出相应的缺勤率和考勤数据

12

>A11.run(SalaryPayable=BasePay*(1-Absenteeism+Performance))

 

 

计算出每位员工的应发工资

13

=create(Salary,TaxRate,TRF).record([A5:C9],0)

 

 

将税率表转换成序表

14

for A11

=A13.select@1(Salary>=A14.SalaryPayable)

 

循环工资表,找出每个人所在的工资段

15

 

>A14.SalaryPayable=round(A14.SalaryPayable-(A14.SalaryPayable*B14.TaxRate/100-B14.TRF),2)

 

算出每个人应交纳的税额,从应发工资中扣除

16

=file(A10)

 

 

创建文件对象

17

>A16.write("RAQSOFT INCORPORATION")

 

 

写入公司名称

18

>A16.write@a("TOAM="+string(round(A11.sum(SalaryPayable),2)))

 

 

继续写入应发工资总额

19

>A16.write@a("COUT="+string(A11.count()))

 

 

写入转账的总人数

20

>A16.write@a("---------------------------------------")

 

 

写入分隔线

21

>A11.run(A16.write@a(string(AccountNo)+" | "+string(SalaryPayable)+" | "+Name))

 

 

分别写入每名员工的账户、工资和姓名

 

l  结果