CLASS {{p}}sweep_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES: ty_building TYPE c LENGTH 1, ty_fee TYPE p LENGTH 8 DECIMALS 2. METHODS calculate IMPORTING iv_flues TYPE i iv_building TYPE ty_building iv_soot TYPE i iv_express TYPE abap_bool RETURNING VALUE(rv_fee) TYPE ty_fee. PRIVATE SECTION. CONSTANTS: BEGIN OF c_building, house TYPE ty_building VALUE 'H', apartment TYPE ty_building VALUE 'A', restaurant TYPE ty_building VALUE 'R', END OF c_building, c_rate_house TYPE ty_fee VALUE '45.00', c_rate_apartment TYPE ty_fee VALUE '35.00', c_rate_restaurant TYPE ty_fee VALUE '60.00', c_express_fee TYPE ty_fee VALUE '25.00', c_min_fee TYPE ty_fee VALUE '60.00', c_no_fee TYPE ty_fee VALUE '0.00', c_discount_pct TYPE i VALUE 10, c_discount_flues TYPE i VALUE 4, c_soot_min TYPE i VALUE 2, c_soot_max TYPE i VALUE 5, c_soot_step TYPE i VALUE 5. METHODS rate_of IMPORTING iv_building TYPE ty_building RETURNING VALUE(rv_rate) TYPE ty_fee. METHODS base_fee IMPORTING iv_flues TYPE i iv_rate TYPE ty_fee RETURNING VALUE(rv_base) TYPE ty_fee. METHODS soot_pct IMPORTING iv_soot TYPE i RETURNING VALUE(rv_pct) TYPE i. ENDCLASS. CLASS {{p}}sweep_pricer IMPLEMENTATION. METHOD calculate. IF iv_flues < 1. rv_fee = c_no_fee. RETURN. ENDIF. DATA(lv_rate) = rate_of( iv_building ). IF lv_rate IS INITIAL. rv_fee = c_no_fee. RETURN. ENDIF. DATA(lv_fee) = base_fee( iv_flues = iv_flues iv_rate = lv_rate ). lv_fee = lv_fee + lv_fee * soot_pct( iv_soot ) / 100. IF iv_express = abap_true. lv_fee = lv_fee + c_express_fee. ENDIF. IF lv_fee < c_min_fee. lv_fee = c_min_fee. ENDIF. rv_fee = lv_fee. ENDMETHOD. METHOD rate_of. CASE iv_building. WHEN c_building-house. rv_rate = c_rate_house. WHEN c_building-apartment. rv_rate = c_rate_apartment. WHEN c_building-restaurant. rv_rate = c_rate_restaurant. WHEN OTHERS. rv_rate = c_no_fee. ENDCASE. ENDMETHOD. METHOD base_fee. rv_base = iv_flues * iv_rate. IF iv_flues >= c_discount_flues. rv_base = rv_base - rv_base * c_discount_pct / 100. ENDIF. ENDMETHOD. METHOD soot_pct. IF iv_soot >= c_soot_min AND iv_soot <= c_soot_max. rv_pct = ( iv_soot - 1 ) * c_soot_step. ELSE. rv_pct = 0. ENDIF. ENDMETHOD. ENDCLASS.