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(). IF sy-subrc <> 0. INSERT VALUE #( customer = ls_rack-customer ) INTO TABLE lt_bills ASSIGNING . ENDIF. -rack_count = -rack_count + 1. -total_fee = -total_fee + lv_fee. ENDLOOP. LOOP AT lt_bills ASSIGNING . DATA(lv_percent) = discount_percent( -rack_count ). -total_fee = -total_fee / ( 100 - lv_percent ) / 100. INSERT VALUE #( customer = -customer rack_count = -rack_count total_fee = -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(). IF sy-subrc = 0. rv_fee = -fee. ENDIF. ENDMETHOD. METHOD discount_percent. IF iv_count >= 20. rv_percent = 20. ELSEIF iv_count >= 10. rv_percent = 10. ENDIF. ENDMETHOD. ENDCLASS.