190 lines
6.2 KiB
ABAP
190 lines
6.2 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:
|
|
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
|
|
OR 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.
|