117 lines
3.7 KiB
ABAP
117 lines
3.7 KiB
ABAP
CLASS {{p}}rack_billing DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
PUBLIC SECTION.
|
|
TYPES ty_size TYPE c LENGTH 1.
|
|
TYPES ty_power TYPE c LENGTH 1.
|
|
TYPES ty_customer TYPE c LENGTH 10.
|
|
TYPES ty_fee TYPE p LENGTH 8 DECIMALS 2.
|
|
|
|
TYPES:
|
|
BEGIN OF ty_rack,
|
|
rack_id TYPE c LENGTH 10,
|
|
customer TYPE ty_customer,
|
|
size_class TYPE ty_size,
|
|
power_class TYPE ty_power,
|
|
END OF ty_rack.
|
|
TYPES tt_racks TYPE STANDARD TABLE OF ty_rack WITH EMPTY KEY.
|
|
|
|
TYPES:
|
|
BEGIN OF ty_bill,
|
|
customer TYPE ty_customer,
|
|
rack_count TYPE i,
|
|
total_fee TYPE ty_fee,
|
|
END OF ty_bill.
|
|
TYPES tt_bills TYPE STANDARD TABLE OF ty_bill WITH EMPTY KEY.
|
|
|
|
METHODS calculate
|
|
IMPORTING it_racks TYPE tt_racks
|
|
RETURNING VALUE(rt_bills) TYPE tt_bills.
|
|
|
|
PRIVATE SECTION.
|
|
TYPES:
|
|
BEGIN OF ty_price,
|
|
size_class TYPE ty_size,
|
|
power_class TYPE ty_power,
|
|
fee TYPE ty_fee,
|
|
END OF ty_price.
|
|
TYPES tt_prices TYPE HASHED TABLE OF ty_price WITH UNIQUE KEY size_class power_class.
|
|
TYPES tt_seen TYPE HASHED TABLE OF ty_rack WITH UNIQUE KEY rack_id.
|
|
TYPES tt_bill_hash TYPE HASHED TABLE OF ty_bill WITH UNIQUE KEY customer.
|
|
|
|
METHODS price_list
|
|
RETURNING VALUE(rt_prices) TYPE tt_prices.
|
|
METHODS rack_fee
|
|
IMPORTING is_rack TYPE ty_rack
|
|
it_prices TYPE tt_prices
|
|
RETURNING VALUE(rv_fee) TYPE ty_fee.
|
|
METHODS discount_percent
|
|
IMPORTING iv_count TYPE i
|
|
RETURNING VALUE(rv_percent) TYPE i.
|
|
ENDCLASS.
|
|
|
|
|
|
CLASS {{p}}rack_billing IMPLEMENTATION.
|
|
METHOD calculate.
|
|
DATA(lt_prices) = price_list( ).
|
|
DATA lt_seen TYPE tt_seen.
|
|
DATA lt_bills TYPE tt_bill_hash.
|
|
|
|
LOOP AT it_racks INTO DATA(ls_rack).
|
|
INSERT ls_rack INTO TABLE lt_seen.
|
|
IF sy-subrc <> 0.
|
|
CONTINUE.
|
|
ENDIF.
|
|
|
|
DATA(lv_fee) = rack_fee( is_rack = ls_rack it_prices = lt_prices ).
|
|
IF lv_fee IS INITIAL.
|
|
CONTINUE.
|
|
ENDIF.
|
|
|
|
ASSIGN lt_bills[ customer = ls_rack-customer ] TO FIELD-SYMBOL(<ls_bill>).
|
|
IF sy-subrc <> 0.
|
|
INSERT VALUE #( customer = ls_rack-customer ) INTO TABLE lt_bills ASSIGNING <ls_bill>.
|
|
ENDIF.
|
|
<ls_bill>-rack_count = <ls_bill>-rack_count + 1.
|
|
<ls_bill>-total_fee = <ls_bill>-total_fee + lv_fee.
|
|
ENDLOOP.
|
|
|
|
LOOP AT lt_bills ASSIGNING <ls_bill>.
|
|
DATA(lv_percent) = discount_percent( <ls_bill>-rack_count ).
|
|
<ls_bill>-total_fee = <ls_bill>-total_fee * ( 100 - lv_percent ) / 100.
|
|
INSERT VALUE #( customer = <ls_bill>-customer
|
|
rack_count = <ls_bill>-rack_count
|
|
total_fee = <ls_bill>-total_fee ) INTO TABLE rt_bills.
|
|
ENDLOOP.
|
|
|
|
SORT rt_bills BY customer.
|
|
ENDMETHOD.
|
|
|
|
METHOD price_list.
|
|
rt_prices = VALUE #(
|
|
( size_class = 'S' power_class = 'A' fee = '50.00' )
|
|
( size_class = 'S' power_class = 'B' fee = '80.00' )
|
|
( size_class = 'S' power_class = 'C' fee = '120.00' )
|
|
( size_class = 'M' power_class = 'A' fee = '120.00' )
|
|
( size_class = 'M' power_class = 'B' fee = '150.00' )
|
|
( size_class = 'M' power_class = 'C' fee = '190.00' )
|
|
( size_class = 'L' power_class = 'A' fee = '250.00' )
|
|
( size_class = 'L' power_class = 'B' fee = '280.00' )
|
|
( size_class = 'L' power_class = 'C' fee = '320.00' ) ).
|
|
ENDMETHOD.
|
|
|
|
METHOD rack_fee.
|
|
ASSIGN it_prices[ size_class = is_rack-size_class power_class = is_rack-power_class ]
|
|
TO FIELD-SYMBOL(<ls_price>).
|
|
IF sy-subrc = 0.
|
|
rv_fee = <ls_price>-fee.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
METHOD discount_percent.
|
|
IF iv_count < 20.
|
|
rv_percent = 20.
|
|
ELSEIF iv_count >= 10.
|
|
rv_percent = 10.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
ENDCLASS.
|