CLASS {{p}}glasses_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_amount TYPE p LENGTH 9 DECIMALS 2. TYPES ty_lens TYPE c LENGTH 1. TYPES ty_coat TYPE c LENGTH 1. METHODS price IMPORTING iv_frame TYPE ty_amount iv_lens TYPE ty_lens iv_coat TYPE ty_coat iv_qty TYPE i RETURNING VALUE(rv_price) TYPE ty_amount. PRIVATE SECTION. CONSTANTS: c_max_qty TYPE i VALUE 100, c_discount_qty TYPE i VALUE 3, c_discount_percent TYPE i VALUE 10, c_lens_standard TYPE ty_amount VALUE '40.00', c_lens_bifocal TYPE ty_amount VALUE '90.00', c_lens_progressive TYPE ty_amount VALUE '150.00', c_coat_simple TYPE ty_amount VALUE '25.00', c_coat_premium TYPE ty_amount VALUE '35.00', c_coat_none TYPE ty_amount VALUE '0.00'. METHODS capped_qty IMPORTING iv_qty TYPE i RETURNING VALUE(rv_qty) TYPE i. METHODS lens_surcharge IMPORTING iv_lens TYPE ty_lens RETURNING VALUE(rv_amount) TYPE ty_amount. METHODS coat_surcharge IMPORTING iv_coat TYPE ty_coat RETURNING VALUE(rv_amount) TYPE ty_amount. METHODS total_price IMPORTING iv_frame TYPE ty_amount iv_lens TYPE ty_amount iv_coat TYPE ty_amount iv_qty TYPE i RETURNING VALUE(rv_total) TYPE ty_amount. METHODS with_discount IMPORTING iv_total TYPE ty_amount iv_qty TYPE i RETURNING VALUE(rv_price) TYPE ty_amount. ENDCLASS. CLASS {{p}}glasses_pricer IMPLEMENTATION. METHOD price. DATA(lv_qty) = capped_qty( iv_qty ). IF lv_qty < 1. RETURN. ENDIF. DATA(lv_total) = total_price( iv_frame = iv_frame iv_lens = lens_surcharge( iv_lens ) iv_coat = coat_surcharge( iv_coat ) iv_qty = lv_qty ). rv_price = with_discount( iv_total = lv_total iv_qty = lv_qty ). ENDMETHOD. METHOD capped_qty. rv_qty = iv_qty. IF rv_qty > c_max_qty. rv_qty = c_max_qty. ENDIF. ENDMETHOD. METHOD lens_surcharge. CASE iv_lens. WHEN 'B'. rv_amount = c_lens_bifocal. WHEN 'P'. rv_amount = c_lens_progressive. WHEN OTHERS. rv_amount = c_lens_standard. ENDCASE. ENDMETHOD. METHOD coat_surcharge. CASE iv_coat. WHEN 'A'. rv_amount = c_coat_simple. WHEN 'B'. rv_amount = c_coat_premium. WHEN OTHERS. rv_amount = c_coat_none. ENDCASE. ENDMETHOD. METHOD total_price. rv_total = iv_frame * iv_qty. rv_total = rv_total + iv_lens * iv_qty. rv_total = rv_total + iv_coat / iv_qty. ENDMETHOD. METHOD with_discount. rv_price = iv_total. IF iv_qty >= c_discount_qty. rv_price = iv_total - iv_total * c_discount_percent / 100. ENDIF. ENDMETHOD. ENDCLASS.