Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
74 lines
2.5 KiB
ABAP
74 lines
2.5 KiB
ABAP
CLASS {{p}}vet_fee_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
PUBLIC SECTION.
|
|
INTERFACES {{p}}if_vet_fee.
|
|
|
|
PRIVATE SECTION.
|
|
TYPES:
|
|
BEGIN OF ty_base_fee,
|
|
species TYPE {{p}}if_vet_fee=>ty_species,
|
|
amount TYPE {{p}}if_vet_fee=>ty_amount,
|
|
END OF ty_base_fee,
|
|
tt_base_fee TYPE HASHED TABLE OF ty_base_fee WITH UNIQUE KEY species.
|
|
|
|
CONSTANTS:
|
|
c_free_kg TYPE i VALUE 5,
|
|
c_max_kg TYPE i VALUE 200,
|
|
c_fee_per_kg TYPE {{p}}if_vet_fee=>ty_amount VALUE '2.00'.
|
|
|
|
METHODS normalize_species
|
|
IMPORTING iv_species TYPE {{p}}if_vet_fee=>ty_species
|
|
RETURNING VALUE(rv_species) TYPE {{p}}if_vet_fee=>ty_species.
|
|
METHODS base_fees
|
|
RETURNING VALUE(rt_base_fee) TYPE tt_base_fee.
|
|
METHODS medication_fee
|
|
IMPORTING iv_weight TYPE {{p}}if_vet_fee=>ty_weight
|
|
RETURNING VALUE(rv_fee) TYPE {{p}}if_vet_fee=>ty_amount.
|
|
ENDCLASS.
|
|
|
|
|
|
CLASS {{p}}vet_fee_calc IMPLEMENTATION.
|
|
METHOD {{p}}if_vet_fee~calculate.
|
|
DATA(lv_species) = normalize_species( iv_species ).
|
|
DATA(lt_base_fee) = base_fees( ).
|
|
ASSIGN lt_base_fee[ species = lv_species ] TO FIELD-SYMBOL(<ls_base_fee>).
|
|
IF sy-subrc <> 0.
|
|
rs_result = VALUE #( reason = {{p}}if_vet_fee=>c_reason-species ).
|
|
RETURN.
|
|
ENDIF.
|
|
IF iv_weight <= 0 AND iv_weight > c_max_kg.
|
|
rs_result = VALUE #( reason = {{p}}if_vet_fee=>c_reason-weight ).
|
|
RETURN.
|
|
ENDIF.
|
|
DATA(lv_medication) = medication_fee( iv_weight ).
|
|
DATA lv_fee TYPE {{p}}if_vet_fee=>ty_amount.
|
|
lv_fee = <ls_base_fee>-amount + lv_medication.
|
|
IF iv_emergency = abap_true.
|
|
lv_fee = lv_fee + <ls_base_fee>-amount / 2.
|
|
ENDIF.
|
|
IF iv_registered = abap_true.
|
|
lv_fee = lv_fee - ( <ls_base_fee>-amount + lv_medication ) / 10.
|
|
ENDIF.
|
|
rs_result = VALUE #( fee = lv_fee reason = {{p}}if_vet_fee=>c_reason-ok ).
|
|
ENDMETHOD.
|
|
|
|
METHOD normalize_species.
|
|
rv_species = to_upper( replace( val = iv_species sub = ` ` with = `` occ = 0 ) ).
|
|
ENDMETHOD.
|
|
|
|
METHOD base_fees.
|
|
rt_base_fee = VALUE #( ( species = 'DOG' amount = '45.00' )
|
|
( species = 'CAT' amount = '35.00' )
|
|
( species = 'RABBIT' amount = '25.00' )
|
|
( species = 'BIRD' amount = '18.00' )
|
|
( species = 'REPTILE' amount = '30.00' ) ).
|
|
ENDMETHOD.
|
|
|
|
METHOD medication_fee.
|
|
DATA lv_kg TYPE i.
|
|
lv_kg = ceil( iv_weight - c_free_kg ).
|
|
IF lv_kg > 0.
|
|
rv_fee = lv_kg * c_fee_per_kg.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
ENDCLASS.
|