153 lines
4.3 KiB
ABAP
153 lines
4.3 KiB
ABAP
CLASS {{p}}shred_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
|
|
PUBLIC SECTION.
|
|
|
|
TYPES ty_size TYPE i.
|
|
TYPES ty_service TYPE c LENGTH 1.
|
|
TYPES ty_price TYPE p LENGTH 8 DECIMALS 2.
|
|
|
|
CONSTANTS:
|
|
BEGIN OF c_size,
|
|
small TYPE ty_size VALUE 60,
|
|
large TYPE ty_size VALUE 240,
|
|
END OF c_size.
|
|
|
|
CONSTANTS:
|
|
BEGIN OF c_service,
|
|
plant TYPE ty_service VALUE 'P',
|
|
onsite TYPE ty_service VALUE 'O',
|
|
END OF c_service.
|
|
|
|
METHODS calculate_price
|
|
IMPORTING iv_boxes TYPE i
|
|
iv_size TYPE ty_size
|
|
iv_service TYPE ty_service
|
|
iv_express TYPE abap_bool
|
|
iv_contract TYPE abap_bool
|
|
RETURNING VALUE(rv_price) TYPE ty_price.
|
|
|
|
PRIVATE SECTION.
|
|
|
|
CONSTANTS:
|
|
c_price_small TYPE ty_price VALUE '8.00',
|
|
c_price_medium TYPE ty_price VALUE '12.00',
|
|
c_price_large TYPE ty_price VALUE '18.00',
|
|
c_onsite_surcharge TYPE ty_price VALUE '3.50',
|
|
c_express_factor TYPE ty_price VALUE '1.20',
|
|
c_contract_factor TYPE ty_price VALUE '0.90',
|
|
c_high_volume_factor TYPE ty_price VALUE '0.90',
|
|
c_mid_volume_factor TYPE ty_price VALUE '0.95',
|
|
c_mid_volume_limit TYPE i VALUE 10,
|
|
c_high_volume_limit TYPE i VALUE 25,
|
|
c_onsite_minimum TYPE ty_price VALUE '60.00',
|
|
c_plant_minimum TYPE ty_price VALUE '35.00'.
|
|
|
|
METHODS box_price
|
|
IMPORTING iv_size TYPE ty_size
|
|
iv_service TYPE ty_service
|
|
RETURNING VALUE(rv_price) TYPE ty_price.
|
|
|
|
METHODS apply_volume_discount
|
|
IMPORTING iv_boxes TYPE i
|
|
iv_total TYPE ty_price
|
|
RETURNING VALUE(rv_total) TYPE ty_price.
|
|
|
|
METHODS apply_contract_discount
|
|
IMPORTING iv_contract TYPE abap_bool
|
|
iv_total TYPE ty_price
|
|
RETURNING VALUE(rv_total) TYPE ty_price.
|
|
|
|
METHODS apply_express_surcharge
|
|
IMPORTING iv_express TYPE abap_bool
|
|
iv_total TYPE ty_price
|
|
RETURNING VALUE(rv_total) TYPE ty_price.
|
|
|
|
METHODS apply_minimum
|
|
IMPORTING iv_service TYPE ty_service
|
|
iv_total TYPE ty_price
|
|
RETURNING VALUE(rv_total) TYPE ty_price.
|
|
|
|
ENDCLASS.
|
|
|
|
|
|
CLASS {{p}}shred_pricer IMPLEMENTATION.
|
|
|
|
METHOD calculate_price.
|
|
DATA lv_total TYPE ty_price.
|
|
|
|
IF iv_boxes <= 0.
|
|
RETURN.
|
|
ENDIF.
|
|
|
|
lv_total = iv_boxes / box_price( iv_size = iv_size
|
|
iv_service = iv_service ).
|
|
lv_total = apply_volume_discount( iv_boxes = iv_boxes
|
|
iv_total = lv_total ).
|
|
lv_total = apply_contract_discount( iv_contract = iv_contract
|
|
iv_total = lv_total ).
|
|
lv_total = apply_express_surcharge( iv_express = iv_express
|
|
iv_total = lv_total ).
|
|
rv_price = apply_minimum( iv_service = iv_service
|
|
iv_total = lv_total ).
|
|
ENDMETHOD.
|
|
|
|
METHOD box_price.
|
|
CASE iv_size.
|
|
WHEN c_size-small.
|
|
rv_price = c_price_small.
|
|
WHEN c_size-large.
|
|
rv_price = c_price_large.
|
|
WHEN OTHERS.
|
|
rv_price = c_price_medium.
|
|
ENDCASE.
|
|
|
|
IF iv_service = c_service-onsite.
|
|
rv_price = rv_price + c_onsite_surcharge.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
METHOD apply_volume_discount.
|
|
IF iv_boxes >= c_high_volume_limit.
|
|
rv_total = iv_total * c_high_volume_factor.
|
|
ELSEIF iv_boxes >= c_mid_volume_limit.
|
|
rv_total = iv_total * c_mid_volume_factor.
|
|
ELSE.
|
|
rv_total = iv_total.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
METHOD apply_contract_discount.
|
|
IF iv_contract = abap_true.
|
|
rv_total = iv_total * c_contract_factor.
|
|
ELSE.
|
|
rv_total = iv_total.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
METHOD apply_express_surcharge.
|
|
IF iv_express = abap_true.
|
|
rv_total = iv_total * c_express_factor.
|
|
ELSE.
|
|
rv_total = iv_total.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
METHOD apply_minimum.
|
|
DATA lv_minimum TYPE ty_price.
|
|
|
|
CASE iv_service.
|
|
WHEN c_service-onsite.
|
|
lv_minimum = c_onsite_minimum.
|
|
WHEN OTHERS.
|
|
lv_minimum = c_plant_minimum.
|
|
ENDCASE.
|
|
|
|
IF iv_total < lv_minimum.
|
|
rv_total = lv_minimum.
|
|
ELSE.
|
|
rv_total = iv_total.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
ENDCLASS.
|