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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章