2020 新税法工资计算
用ABAP 写的一个工资税计算程序,按新税法累计计算个税,工资越高越到后面扣的多、。。。。。
举例 8000 和 30000
工资8000:
工资30000
*&---------------------------------------------------------------------*
*& Report Z_CALCULATE_PAYROLL_TAX
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_calculate_payroll_tax.
SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE TEXT-000.
PARAMETERS: p_year TYPE char4 , "DEFAULT '2020',
p_month TYPE char2.
PARAMETERS: p_payr TYPE p DECIMALS 2 MODIF ID pay,
p_ded1 TYPE i MODIF ID de1,
p_ded2 TYPE p DECIMALS 2 MODIF ID de2.
SELECTION-SCREEN END OF BLOCK bl1.
TYPES:BEGIN OF ty_tax,
level TYPE i,
low TYPE i,
high TYPE i,
pecent TYPE p DECIMALS 2,
de_amount TYPE i,
END OF ty_tax.
DATA:gt_tax TYPE STANDARD TABLE OF ty_tax,
gs_tax TYPE ty_tax.
TYPES:BEGIN OF ty_tax_cal,
month TYPE i,
payroll TYPE p DECIMALS 2,
ded1 TYPE p DECIMALS 2,
ded2 TYPE p DECIMALS 2,
payroll_cal TYPE p DECIMALS 2,
tax TYPE p DECIMALS 2,
END OF ty_tax_cal.
DATA:gt_month TYPE STANDARD TABLE OF ty_tax_cal,
gs_month TYPE ty_tax_cal.
DATA:gt_month_tmp TYPE STANDARD TABLE OF ty_tax_cal,
gs_month_tmp TYPE ty_tax_cal.
INITIALIZATION.
PERFORM frm_init.
p_year = sy-datum+0(4).
p_month = 12.
START-OF-SELECTION.
END-OF-SELECTION.
PERFORM frm_calculate_tax.
FORM frm_init.
REFRESH gt_tax.
CLEAR gs_tax.
gs_tax-level = 1.
gs_tax-low = 0.
gs_tax-high = 36000.
gs_tax-pecent = '0.03'.
gs_tax-de_amount = 0.
APPEND gs_tax TO gt_tax.
gs_tax-level = 2.
gs_tax-low = 36000.
gs_tax-high = 144000.
gs_tax-pecent = '0.1'.
gs_tax-de_amount = 2520.
APPEND gs_tax TO gt_tax.
gs_tax-level = 3.
gs_tax-low = 144000.
gs_tax-high = 300000.
gs_tax-pecent = '0.2'.
gs_tax-de_amount = 16920.
APPEND gs_tax TO gt_tax.
gs_tax-level = 4.
gs_tax-low = 300000.
gs_tax-high = 420000.
gs_tax-pecent = '0.25'.
gs_tax-de_amount = 31920.
APPEND gs_tax TO gt_tax.
gs_tax-level = 5.
gs_tax-low = 420000.
gs_tax-high = 660000.
gs_tax-pecent = '0.3'.
gs_tax-de_amount = 52920.
APPEND gs_tax TO gt_tax.
gs_tax-level = 6.
gs_tax-low = 660000.
gs_tax-high = 960000.
gs_tax-pecent = '0.35'.
gs_tax-de_amount = 85920.
APPEND gs_tax TO gt_tax.
gs_tax-level = 7.
gs_tax-low = 960000.
gs_tax-high = 9960000.
gs_tax-pecent = '0.45'.
gs_tax-de_amount = 181920.
APPEND gs_tax TO gt_tax.
REFRESH gt_month.
CLEAR gs_month.
ENDFORM.
FORM frm_calculate_tax.
*按税率计算税额
DATA lv_month TYPE i.
DATA lv_time TYPE i.
lv_month = 0.
lv_time = p_month.
DO lv_time TIMES.
lv_month = lv_month + 1.
gs_month-month = lv_month."月份
gs_month-payroll = p_payr * lv_month."累计工资
gs_month-ded1 = p_ded1 * lv_month. "累计附加扣除
gs_month-ded2 = p_ded2 * lv_month. "累计扣的五险一金
gs_month-payroll_cal = gs_month-payroll - gs_month-ded1 - gs_month-ded2 - 5000 * lv_month."总工资扣除总的五险一金和累计附加扣除后用于计算税的部分
APPEND gs_month TO gt_month.
ENDDO.
LOOP AT gt_month INTO gs_month.
LOOP AT gt_tax INTO gs_tax WHERE low < gs_month-payroll_cal AND high >= gs_month-payroll_cal.
gs_month-tax = gs_month-payroll_cal * gs_tax-pecent - gs_tax-de_amount.
ENDLOOP.
MODIFY gt_month FROM gs_month.
ENDLOOP.
REFRESH gt_month_tmp.
APPEND LINES OF gt_month TO gt_month_tmp.
SORT gt_month_tmp BY month DESCENDING.
DATA lv_tax TYPE p DECIMALS 2.
*扣除之前扣掉的税额
LOOP AT gt_month INTO gs_month.
LOOP AT gt_month_tmp INTO gs_month_tmp WHERE month < gs_month-month.
gs_month-tax = gs_month-tax - gs_month_tmp-tax.
EXIT.
ENDLOOP.
MODIFY gt_month FROM gs_month.
WRITE : / gs_month-month,gs_month-tax.
" WRITE :'\n'.
lv_tax = lv_tax + gs_month-tax.
CLEAR gs_month.
ENDLOOP.
WRITE:/ '总共' && lv_tax.
ENDFORM.