根据考勤和绩效信息计算应发工资
问题
某企业财务需要为员工计算员工工资并将数据导出给银行,工资的计算首先需要参考员工的缺勤率和工作绩效,具体规则为:
基本工资 *(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=员工人数
---------------------------------------
银行账户 | 应发金额 | 姓名
银行账户 | 应发金额 | 姓名
……
思路
-
基于雇员表创建新的序表,保留雇员姓名、基本工资、银行账户字段,增加缺勤率、绩效、应发工资字段,其中缺勤率字段的值为从缺勤率表中选出的相应记录,绩效表也是一样,应发工资字段写 0。
-
按公式计算出每名员工的应发工资,写入应发工资字段。对于没有缺勤或绩效记录的员工,缺勤或绩效字段会为空,计算时会自动按 0 处理,正好符合我们的要求。
-
将税率表抄进代码,并转换成序表,以便计算。
-
为每位员工计算个税,先找出他所在的收入段,而后直接使用速算扣除数算出税额,并从工资中扣除。
-
然后就可以开始写入 TXT 文件了。创建一个 TXT 文件对象,依次写入公司名、应发工资的总额、需要转账的人数和分隔线。
-
循环前面的表,将记录按格式逐条写入到 TXT 文件中。
代码
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)) | 分别写入每名员工的账户、工资和姓名 |
英文版
数据文件
Absenteeism.txt
Employees.txt
Performance.txt