CLASS {{p}}shred_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_size TYPE i. TYPES ty_service TYPE c LENGTH 1. TYPES ty_price TYPE p LENGTH 8 DECIMALS 2. CONSTANTS: BEGIN OF c_size, small TYPE ty_size VALUE 60, large TYPE ty_size VALUE 240, END OF c_size. CONSTANTS: BEGIN OF c_service, plant TYPE ty_service VALUE 'P', onsite TYPE ty_service VALUE 'O', END OF c_service. METHODS calculate_price IMPORTING iv_boxes TYPE i iv_size TYPE ty_size iv_service TYPE ty_service iv_express TYPE abap_bool iv_contract TYPE abap_bool RETURNING VALUE(rv_price) TYPE ty_price. PRIVATE SECTION. CONSTANTS: c_price_small TYPE ty_price VALUE '8.00', c_price_medium TYPE ty_price VALUE '12.00', c_price_large TYPE ty_price VALUE '18.00', c_onsite_surcharge TYPE ty_price VALUE '3.50', c_express_factor TYPE ty_price VALUE '1.20', c_contract_factor TYPE ty_price VALUE '0.90', c_high_volume_factor TYPE ty_price VALUE '0.90', c_mid_volume_factor TYPE ty_price VALUE '0.95', c_mid_volume_limit TYPE i VALUE 10, c_high_volume_limit TYPE i VALUE 25, c_onsite_minimum TYPE ty_price VALUE '60.00', c_plant_minimum TYPE ty_price VALUE '35.00'. METHODS box_price IMPORTING iv_size TYPE ty_size iv_service TYPE ty_service RETURNING VALUE(rv_price) TYPE ty_price. METHODS apply_volume_discount IMPORTING iv_boxes TYPE i iv_total TYPE ty_price RETURNING VALUE(rv_total) TYPE ty_price. METHODS apply_contract_discount IMPORTING iv_contract TYPE abap_bool iv_total TYPE ty_price RETURNING VALUE(rv_total) TYPE ty_price. METHODS apply_express_surcharge IMPORTING iv_express TYPE abap_bool iv_total TYPE ty_price RETURNING VALUE(rv_total) TYPE ty_price. METHODS apply_minimum IMPORTING iv_service TYPE ty_service iv_total TYPE ty_price RETURNING VALUE(rv_total) TYPE ty_price. ENDCLASS. CLASS {{p}}shred_pricer IMPLEMENTATION. METHOD calculate_price. DATA lv_total TYPE ty_price. IF iv_boxes <= 0. RETURN. ENDIF. lv_total = iv_boxes * box_price( iv_size = iv_size iv_service = iv_service ). lv_total = apply_volume_discount( iv_boxes = iv_boxes iv_total = lv_total ). lv_total = apply_contract_discount( iv_contract = iv_contract iv_total = lv_total ). lv_total = apply_express_surcharge( iv_express = iv_express iv_total = lv_total ). rv_price = apply_minimum( iv_service = iv_service iv_total = lv_total ). ENDMETHOD. METHOD box_price. CASE iv_size. WHEN c_size-small. rv_price = c_price_small. WHEN c_size-large. rv_price = c_price_large. WHEN OTHERS. rv_price = c_price_medium. ENDCASE. IF iv_service <> c_service-onsite. rv_price = rv_price + c_onsite_surcharge. ENDIF. ENDMETHOD. METHOD apply_volume_discount. IF iv_boxes >= c_high_volume_limit. rv_total = iv_total * c_high_volume_factor. ELSEIF iv_boxes >= c_mid_volume_limit. rv_total = iv_total * c_mid_volume_factor. ELSE. rv_total = iv_total. ENDIF. ENDMETHOD. METHOD apply_contract_discount. IF iv_contract = abap_true. rv_total = iv_total * c_contract_factor. ELSE. rv_total = iv_total. ENDIF. ENDMETHOD. METHOD apply_express_surcharge. IF iv_express = abap_true. rv_total = iv_total * c_express_factor. ELSE. rv_total = iv_total. ENDIF. ENDMETHOD. METHOD apply_minimum. DATA lv_minimum TYPE ty_price. CASE iv_service. WHEN c_service-onsite. lv_minimum = c_onsite_minimum. WHEN OTHERS. lv_minimum = c_plant_minimum. ENDCASE. IF iv_total < lv_minimum. rv_total = lv_minimum. ELSE. rv_total = iv_total. ENDIF. ENDMETHOD. ENDCLASS.