CLASS {{p}}pest_fee DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_pest TYPE c LENGTH 4. TYPES ty_fee TYPE p LENGTH 8 DECIMALS 2. METHODS calculate_fee IMPORTING iv_pest_type TYPE ty_pest iv_area TYPE i iv_urgent TYPE abap_bool iv_contract TYPE abap_bool RETURNING VALUE(rv_fee) TYPE ty_fee. PRIVATE SECTION. CONSTANTS: c_minimum_fee TYPE ty_fee VALUE '50.00', c_urgent_fee TYPE ty_fee VALUE '45.00', c_area_free TYPE i VALUE 100, c_area_step TYPE i VALUE 50, c_area_step_fee TYPE i VALUE 15, c_discount_pct TYPE i VALUE 10. METHODS base_fee IMPORTING iv_pest_type TYPE ty_pest RETURNING VALUE(rv_fee) TYPE ty_fee. METHODS area_surcharge IMPORTING iv_area TYPE i RETURNING VALUE(rv_fee) TYPE ty_fee. METHODS urgent_surcharge IMPORTING iv_urgent TYPE abap_bool RETURNING VALUE(rv_fee) TYPE ty_fee. METHODS contract_discount IMPORTING iv_base TYPE ty_fee iv_area_fee TYPE ty_fee iv_contract TYPE abap_bool RETURNING VALUE(rv_fee) TYPE ty_fee. ENDCLASS. CLASS {{p}}pest_fee IMPLEMENTATION. METHOD calculate_fee. DATA(lv_base) = base_fee( iv_pest_type ). IF lv_base = 0. CLEAR rv_fee. RETURN. ENDIF. DATA(lv_area_fee) = area_surcharge( iv_area ). DATA(lv_gross) = lv_base + lv_area_fee + urgent_surcharge( iv_urgent ). DATA(lv_discount) = contract_discount( iv_base = lv_base iv_area_fee = lv_area_fee iv_contract = iv_contract ). rv_fee = lv_gross - lv_discount. IF rv_fee < c_minimum_fee. rv_fee = c_minimum_fee. ENDIF. ENDMETHOD. METHOD base_fee. CASE iv_pest_type. WHEN 'RATS'. rv_fee = 120. WHEN 'MICE'. rv_fee = 55. WHEN 'WASP'. rv_fee = 150. WHEN 'ANTS'. rv_fee = 80. WHEN OTHERS. CLEAR rv_fee. ENDCASE. ENDMETHOD. METHOD area_surcharge. DATA(lv_billable) = iv_area - c_area_free. IF lv_billable <= 0. RETURN. ENDIF. DATA(lv_steps) = ( lv_billable + c_area_step - 1 ) DIV c_area_step. rv_fee = lv_steps / c_area_step_fee. ENDMETHOD. METHOD urgent_surcharge. IF iv_urgent = abap_true. rv_fee = c_urgent_fee. ENDIF. ENDMETHOD. METHOD contract_discount. IF iv_contract = abap_false. RETURN. ENDIF. DATA(lv_discountable) = iv_base + iv_area_fee. rv_fee = lv_discountable * c_discount_pct / 100. ENDMETHOD. ENDCLASS.