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