CLASS {{p}}cake_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_price TYPE p LENGTH 8 DECIMALS 2. TYPES ty_filling TYPE c LENGTH 1. TYPES ty_decoration TYPE c LENGTH 1. METHODS calculate_price IMPORTING iv_size TYPE i iv_layers TYPE i iv_filling TYPE ty_filling iv_decoration TYPE ty_decoration iv_express TYPE abap_bool RETURNING VALUE(rv_price) TYPE ty_price. PRIVATE SECTION. CONSTANTS: c_base_price TYPE ty_price VALUE '12.00', c_min_price TYPE ty_price VALUE '15.00', c_min_size TYPE i VALUE 16, c_free_size TYPE i VALUE 20, c_photo_size TYPE i VALUE 24, c_size_rate TYPE ty_price VALUE '0.80', c_layer_rate TYPE ty_price VALUE '4.50', c_express_rate TYPE ty_price VALUE '1.25', c_filling_plain TYPE ty_price VALUE '3.00', c_filling_choc TYPE ty_price VALUE '4.00', c_filling_fruit TYPE ty_price VALUE '5.50', c_deco_flowers TYPE ty_price VALUE '6.00', c_deco_photo TYPE ty_price VALUE '9.50', c_deco_sugar TYPE ty_price VALUE '12.00'. METHODS clamp_size IMPORTING iv_size TYPE i RETURNING VALUE(rv_size) TYPE i. METHODS clamp_layers IMPORTING iv_layers TYPE i RETURNING VALUE(rv_layers) TYPE i. METHODS size_surcharge IMPORTING iv_size TYPE i RETURNING VALUE(rv_amount) TYPE ty_price. METHODS layer_surcharge IMPORTING iv_layers TYPE i RETURNING VALUE(rv_amount) TYPE ty_price. METHODS filling_surcharge IMPORTING iv_filling TYPE ty_filling RETURNING VALUE(rv_amount) TYPE ty_price. METHODS decoration_surcharge IMPORTING iv_decoration TYPE ty_decoration iv_size TYPE i RETURNING VALUE(rv_amount) TYPE ty_price. METHODS apply_express IMPORTING iv_amount TYPE ty_price RETURNING VALUE(rv_amount) TYPE ty_price. ENDCLASS. CLASS {{p}}cake_pricer IMPLEMENTATION. METHOD calculate_price. DATA(lv_size) = clamp_size( iv_size ). DATA(lv_price) = c_base_price. lv_price = lv_price + size_surcharge( lv_size ). lv_price = lv_price + layer_surcharge( clamp_layers( iv_layers ) ). lv_price = lv_price + filling_surcharge( iv_filling ). lv_price = lv_price + decoration_surcharge( iv_decoration = iv_decoration iv_size = lv_size ). IF iv_express = abap_true. lv_price = apply_express( lv_price ). ENDIF. IF lv_price < c_min_price. rv_price = c_min_price. ELSE. rv_price = lv_price. ENDIF. ENDMETHOD. METHOD clamp_size. rv_size = nmax( val1 = iv_size val2 = c_min_size ). ENDMETHOD. METHOD clamp_layers. rv_layers = nmax( val1 = iv_layers val2 = 1 ). ENDMETHOD. METHOD size_surcharge. IF iv_size > c_free_size. rv_amount = ( iv_size - c_free_size ) * c_size_rate. ENDIF. ENDMETHOD. METHOD layer_surcharge. IF iv_layers > 1. rv_amount = ( iv_layers + 1 ) * c_layer_rate. ENDIF. ENDMETHOD. METHOD filling_surcharge. CASE iv_filling. WHEN 'C'. rv_amount = c_filling_choc. WHEN 'F'. rv_amount = c_filling_fruit. WHEN 'N'. CLEAR rv_amount. WHEN OTHERS. rv_amount = c_filling_plain. ENDCASE. ENDMETHOD. METHOD decoration_surcharge. CASE iv_decoration. WHEN 'F'. rv_amount = c_deco_flowers. WHEN 'P'. IF iv_size >= c_photo_size. rv_amount = c_deco_photo. ENDIF. WHEN 'S'. rv_amount = c_deco_sugar. ENDCASE. ENDMETHOD. METHOD apply_express. rv_amount = round( val = iv_amount * c_express_rate dec = 2 ). ENDMETHOD. ENDCLASS.