110 lines
3.1 KiB
ABAP
110 lines
3.1 KiB
ABAP
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.
|