Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
86 lines
2.3 KiB
ABAP
86 lines
2.3 KiB
ABAP
CLASS {{p}}overdraft_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
PUBLIC SECTION.
|
|
INTERFACES {{p}}if_overdraft.
|
|
|
|
PRIVATE SECTION.
|
|
CONSTANTS:
|
|
c_free_days TYPE i VALUE 3,
|
|
c_percent_divisor TYPE i VALUE 100,
|
|
c_days_per_year TYPE i VALUE 360,
|
|
c_business_discount TYPE p LENGTH 3 DECIMALS 2 VALUE '2.00',
|
|
c_min_rate TYPE p LENGTH 3 DECIMALS 2 VALUE '5.00'.
|
|
|
|
TYPES:
|
|
ty_rate TYPE p LENGTH 5 DECIMALS 2,
|
|
ty_interest TYPE p LENGTH 15 DECIMALS 6.
|
|
|
|
METHODS chargeable_days
|
|
IMPORTING iv_days TYPE i
|
|
RETURNING VALUE(rv_days) TYPE i.
|
|
|
|
METHODS base_rate
|
|
IMPORTING iv_amount TYPE {{p}}if_overdraft=>ty_amount
|
|
RETURNING VALUE(rv_rate) TYPE ty_rate.
|
|
|
|
METHODS interest_rate
|
|
IMPORTING iv_amount TYPE {{p}}if_overdraft=>ty_amount
|
|
iv_segment TYPE {{p}}if_overdraft=>ty_segment
|
|
RETURNING VALUE(rv_rate) TYPE ty_rate.
|
|
ENDCLASS.
|
|
|
|
|
|
CLASS {{p}}overdraft_calc IMPLEMENTATION.
|
|
METHOD {{p}}if_overdraft~calculate.
|
|
DATA:
|
|
lv_days TYPE i,
|
|
lv_rate TYPE ty_rate,
|
|
lv_annual TYPE ty_interest.
|
|
|
|
IF iv_amount <= 0 OR iv_days <= 0.
|
|
rv_interest = 0.
|
|
RETURN.
|
|
ENDIF.
|
|
|
|
lv_days = chargeable_days( iv_days ).
|
|
lv_rate = interest_rate( iv_amount = iv_amount
|
|
iv_segment = iv_segment ).
|
|
|
|
lv_annual = iv_amount * lv_rate / c_percent_divisor.
|
|
rv_interest = lv_annual * lv_days / c_days_per_year.
|
|
|
|
IF rv_interest > 0 AND rv_interest < {{p}}if_overdraft=>c_min_interest.
|
|
rv_interest = {{p}}if_overdraft=>c_min_interest.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
METHOD chargeable_days.
|
|
rv_days = iv_days - c_free_days.
|
|
IF rv_days < 0.
|
|
rv_days = 0.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
METHOD base_rate.
|
|
IF iv_amount <= 1000.
|
|
rv_rate = '12.00'.
|
|
ELSEIF iv_amount <= 5000.
|
|
rv_rate = '10.00'.
|
|
ELSEIF iv_amount <= 20000.
|
|
rv_rate = '8.00'.
|
|
ELSE.
|
|
rv_rate = '6.50'.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
METHOD interest_rate.
|
|
rv_rate = base_rate( iv_amount ).
|
|
|
|
IF iv_segment <> {{p}}if_overdraft=>c_segment_business.
|
|
rv_rate = rv_rate - c_business_discount.
|
|
IF rv_rate < c_min_rate.
|
|
rv_rate = c_min_rate.
|
|
ENDIF.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
ENDCLASS.
|