CLASS {{p}}frame_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_moulding TYPE c LENGTH 1. TYPES ty_glass TYPE c LENGTH 1. TYPES ty_amount TYPE p LENGTH 9 DECIMALS 2. METHODS calculate_price IMPORTING iv_width_cm TYPE i iv_height_cm TYPE i iv_moulding TYPE ty_moulding iv_glass TYPE ty_glass iv_quantity TYPE i RETURNING VALUE(rv_price) TYPE ty_amount. PRIVATE SECTION. CONSTANTS: c_rate_standard TYPE ty_amount VALUE '0.08', c_rate_premium TYPE ty_amount VALUE '0.15', c_rate_gold TYPE ty_amount VALUE '0.28'. DATA gv_width TYPE ty_amount. DATA gv_height TYPE ty_amount. DATA gv_perimeter TYPE ty_amount. DATA gv_area TYPE ty_amount. ENDCLASS. CLASS {{p}}frame_pricer IMPLEMENTATION. METHOD calculate_price. DATA lv_frame TYPE ty_amount. DATA lv_glass TYPE ty_amount. DATA lv_extra TYPE ty_amount. DATA lv_sum TYPE ty_amount. DATA lv_qty TYPE ty_amount. DATA lv_factor TYPE ty_amount. DATA lv_base TYPE ty_amount. DATA lv_labour TYPE ty_amount. DATA lv_small TYPE ty_amount. DATA lv_big TYPE ty_amount. DATA lv_setup TYPE ty_amount. DATA lv_limit_s TYPE ty_amount. DATA lv_limit_b TYPE ty_amount. CLEAR rv_price. * check the input data IF iv_width_cm LT 1 OR iv_height_cm LT 1. rv_price = 0. RETURN. ENDIF. IF iv_quantity LT 1. rv_price = 0. RETURN. ENDIF. IF iv_moulding NE 'S' AND iv_moulding NE 'P' AND iv_moulding NE 'G'. rv_price = 0. RETURN. ENDIF. IF iv_glass NE 'N' AND iv_glass NE 'S' AND iv_glass NE 'A'. rv_price = 0. RETURN. ENDIF. MOVE iv_width_cm TO gv_width. MOVE iv_height_cm TO gv_height. MOVE 2 TO lv_factor. COMPUTE gv_perimeter = ( gv_width + gv_height ) * lv_factor. COMPUTE gv_area = gv_width * gv_height. * the price of the moulding IF iv_moulding = 'S'. COMPUTE lv_frame = gv_perimeter * c_rate_standard. ELSE. IF iv_moulding = 'P'. COMPUTE lv_frame = gv_perimeter * c_rate_premium. ELSE. COMPUTE lv_frame = gv_perimeter * c_rate_gold. ENDIF. ENDIF. * the price of the glass IF iv_glass = 'N'. MOVE 0 TO lv_glass. ELSE. IF iv_glass = 'S'. MOVE 18 TO lv_glass. ELSE. MOVE 34 TO lv_glass. ENDIF. ENDIF. * the extras MOVE 3 TO lv_base. MOVE 12 TO lv_labour. MOVE 4 TO lv_small. MOVE 25 TO lv_big. MOVE 50 TO lv_limit_s. MOVE 20000 TO lv_limit_b. COMPUTE lv_extra = lv_base + lv_labour. IF gv_perimeter LT lv_limit_s. COMPUTE lv_extra = lv_extra + lv_small. ENDIF. IF gv_area GT lv_limit_b. COMPUTE lv_extra = lv_extra + lv_big. ENDIF. COMPUTE lv_sum = lv_frame + lv_glass + lv_extra. MOVE iv_quantity TO lv_qty. COMPUTE lv_sum = lv_sum * lv_qty. MOVE 15 TO lv_setup. IF iv_quantity LT 5. COMPUTE lv_sum = lv_sum + lv_setup. ENDIF. rv_price = lv_sum. ENDMETHOD. ENDCLASS.