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: BEGIN OF c_moulding, standard TYPE ty_moulding VALUE 'S', premium TYPE ty_moulding VALUE 'P', gold TYPE ty_moulding VALUE 'G', END OF c_moulding, BEGIN OF c_glass, none TYPE ty_glass VALUE 'N', standard TYPE ty_glass VALUE 'S', anti_reflex TYPE ty_glass VALUE 'A', END OF c_glass, BEGIN OF c_moulding_rate, standard TYPE ty_amount VALUE '0.08', premium TYPE ty_amount VALUE '0.15', gold TYPE ty_amount VALUE '0.28', END OF c_moulding_rate, BEGIN OF c_glass_price, none TYPE ty_amount VALUE '0.00', standard TYPE ty_amount VALUE '18.00', anti_reflex TYPE ty_amount VALUE '34.00', END OF c_glass_price, c_factor TYPE ty_amount VALUE '2.00', c_backing TYPE ty_amount VALUE '3.00', c_labour TYPE ty_amount VALUE '12.00', c_small_frame TYPE ty_amount VALUE '4.00', c_small_limit_cm TYPE ty_amount VALUE '50.00', c_oversized TYPE ty_amount VALUE '25.00', c_oversize_limit TYPE ty_amount VALUE '20000.00', c_setup_fee TYPE ty_amount VALUE '15.00', c_setup_limit TYPE i VALUE 5. METHODS is_valid 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_valid) TYPE abap_bool. METHODS perimeter IMPORTING iv_width_cm TYPE i iv_height_cm TYPE i RETURNING VALUE(rv_perimeter) TYPE ty_amount. METHODS area IMPORTING iv_width_cm TYPE i iv_height_cm TYPE i RETURNING VALUE(rv_area) TYPE ty_amount. METHODS quantity_amount IMPORTING iv_quantity TYPE i RETURNING VALUE(rv_amount) TYPE ty_amount. METHODS moulding_price IMPORTING iv_moulding TYPE ty_moulding iv_perimeter TYPE ty_amount RETURNING VALUE(rv_price) TYPE ty_amount. METHODS glass_price IMPORTING iv_glass TYPE ty_glass RETURNING VALUE(rv_price) TYPE ty_amount. METHODS extras IMPORTING iv_perimeter TYPE ty_amount iv_area TYPE ty_amount RETURNING VALUE(rv_price) TYPE ty_amount. METHODS setup_fee IMPORTING iv_quantity TYPE i RETURNING VALUE(rv_price) TYPE ty_amount. ENDCLASS. CLASS {{p}}frame_pricer IMPLEMENTATION. METHOD calculate_price. IF is_valid( iv_width_cm = iv_width_cm iv_height_cm = iv_height_cm iv_moulding = iv_moulding iv_glass = iv_glass iv_quantity = iv_quantity ) = abap_false. rv_price = 0. RETURN. ENDIF. DATA lv_perimeter TYPE ty_amount. lv_perimeter = perimeter( iv_width_cm = iv_width_cm iv_height_cm = iv_height_cm ). DATA lv_area TYPE ty_amount. lv_area = area( iv_width_cm = iv_width_cm iv_height_cm = iv_height_cm ). DATA lv_per_frame TYPE ty_amount. lv_per_frame = moulding_price( iv_moulding = iv_moulding iv_perimeter = lv_perimeter ). DATA lv_glass TYPE ty_amount. lv_glass = glass_price( iv_glass = iv_glass ). lv_per_frame = lv_per_frame + lv_glass. DATA lv_extra TYPE ty_amount. lv_extra = extras( iv_perimeter = lv_perimeter iv_area = lv_area ). lv_per_frame = lv_per_frame + lv_extra. DATA lv_quantity TYPE ty_amount. lv_quantity = quantity_amount( iv_quantity = iv_quantity ). DATA lv_total TYPE ty_amount. lv_total = lv_per_frame * lv_quantity. DATA lv_fee TYPE ty_amount. lv_fee = setup_fee( iv_quantity = iv_quantity ). rv_price = lv_total + lv_fee. ENDMETHOD. METHOD is_valid. rv_valid = xsdbool( iv_width_cm >= 1 AND iv_height_cm >= 1 AND iv_quantity >= 1 AND ( iv_moulding = c_moulding-standard OR iv_moulding = c_moulding-premium OR iv_moulding = c_moulding-gold ) AND ( iv_glass = c_glass-none OR iv_glass = c_glass-standard OR iv_glass = c_glass-anti_reflex ) ). ENDMETHOD. METHOD perimeter. DATA lv_width TYPE ty_amount. lv_width = iv_width_cm. DATA lv_height TYPE ty_amount. lv_height = iv_height_cm. rv_perimeter = ( lv_width + lv_height ) * c_factor. ENDMETHOD. METHOD area. DATA lv_width TYPE ty_amount. lv_width = iv_width_cm. DATA lv_height TYPE ty_amount. lv_height = iv_height_cm. rv_area = lv_width * lv_height. ENDMETHOD. METHOD quantity_amount. rv_amount = iv_quantity. ENDMETHOD. METHOD moulding_price. CASE iv_moulding. WHEN c_moulding-standard. rv_price = iv_perimeter * c_moulding_rate-standard. WHEN c_moulding-premium. rv_price = iv_perimeter * c_moulding_rate-premium. WHEN OTHERS. rv_price = iv_perimeter * c_moulding_rate-gold. ENDCASE. ENDMETHOD. METHOD glass_price. CASE iv_glass. WHEN c_glass-none. rv_price = c_glass_price-none. WHEN c_glass-standard. rv_price = c_glass_price-standard. WHEN OTHERS. rv_price = c_glass_price-anti_reflex. ENDCASE. ENDMETHOD. METHOD extras. rv_price = c_backing + c_labour. IF iv_perimeter < c_small_limit_cm. rv_price = rv_price + c_small_frame. ENDIF. IF iv_area > c_oversize_limit. rv_price = rv_price + c_oversized. ENDIF. ENDMETHOD. METHOD setup_fee. IF iv_quantity < c_setup_limit. rv_price = c_setup_fee. ENDIF. ENDMETHOD. ENDCLASS.