Pipeline controller: plan 2 (hard +, error +50 %), backlog throttle, 2 trajectory workers, stop rules, summaries every 50; budget reserve
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
174
tasks_gen/train/G1030/reference/skip_hire_calc.clas.abap
Normal file
174
tasks_gen/train/G1030/reference/skip_hire_calc.clas.abap
Normal file
@@ -0,0 +1,174 @@
|
||||
CLASS {{p}}skip_hire_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||
|
||||
PUBLIC SECTION.
|
||||
|
||||
TYPES:
|
||||
ty_size TYPE c LENGTH 6,
|
||||
ty_amount TYPE p LENGTH 8 DECIMALS 2,
|
||||
BEGIN OF ty_container,
|
||||
size TYPE ty_size,
|
||||
days TYPE i,
|
||||
hazardous TYPE abap_bool,
|
||||
permit TYPE abap_bool,
|
||||
END OF ty_container,
|
||||
tt_containers TYPE STANDARD TABLE OF ty_container WITH DEFAULT KEY.
|
||||
|
||||
METHODS hire_charge
|
||||
IMPORTING it_containers TYPE tt_containers
|
||||
RETURNING VALUE(rv_charge) TYPE ty_amount.
|
||||
|
||||
METHODS container_charge
|
||||
IMPORTING is_container TYPE ty_container
|
||||
RETURNING VALUE(rv_charge) TYPE ty_amount.
|
||||
|
||||
METHODS bulk_discount
|
||||
IMPORTING iv_count TYPE i
|
||||
RETURNING VALUE(rv_percent) TYPE i.
|
||||
|
||||
PRIVATE SECTION.
|
||||
|
||||
CONSTANTS c_size_small TYPE ty_size VALUE 'SMALL'.
|
||||
CONSTANTS c_size_medium TYPE ty_size VALUE 'MEDIUM'.
|
||||
CONSTANTS c_size_large TYPE ty_size VALUE 'LARGE'.
|
||||
CONSTANTS c_base_small TYPE ty_amount VALUE '90.00'.
|
||||
CONSTANTS c_base_medium TYPE ty_amount VALUE '140.00'.
|
||||
CONSTANTS c_base_large TYPE ty_amount VALUE '200.00'.
|
||||
CONSTANTS c_rate_small TYPE ty_amount VALUE '8.00'.
|
||||
CONSTANTS c_rate_medium TYPE ty_amount VALUE '12.00'.
|
||||
CONSTANTS c_rate_large TYPE ty_amount VALUE '16.00'.
|
||||
CONSTANTS c_hazard_small TYPE ty_amount VALUE '60.00'.
|
||||
CONSTANTS c_hazard_medium TYPE ty_amount VALUE '80.00'.
|
||||
CONSTANTS c_hazard_large TYPE ty_amount VALUE '100.00'.
|
||||
CONSTANTS c_permit_fee TYPE ty_amount VALUE '45.00'.
|
||||
CONSTANTS c_min_charge TYPE ty_amount VALUE '120.00'.
|
||||
CONSTANTS c_included_days TYPE i VALUE 7.
|
||||
CONSTANTS c_min_days TYPE i VALUE 1.
|
||||
CONSTANTS c_min_containers TYPE i VALUE 5.
|
||||
CONSTANTS c_percent_bulk TYPE i VALUE 10.
|
||||
CONSTANTS c_percent_base TYPE i VALUE 100.
|
||||
|
||||
METHODS base_price
|
||||
IMPORTING iv_size TYPE ty_size
|
||||
RETURNING VALUE(rv_price) TYPE ty_amount.
|
||||
|
||||
METHODS day_rate
|
||||
IMPORTING iv_size TYPE ty_size
|
||||
RETURNING VALUE(rv_rate) TYPE ty_amount.
|
||||
|
||||
METHODS hazard_fee
|
||||
IMPORTING iv_size TYPE ty_size
|
||||
RETURNING VALUE(rv_fee) TYPE ty_amount.
|
||||
|
||||
METHODS extra_days_fee
|
||||
IMPORTING is_container TYPE ty_container
|
||||
RETURNING VALUE(rv_fee) TYPE ty_amount.
|
||||
|
||||
METHODS net_charge
|
||||
IMPORTING iv_net TYPE ty_amount
|
||||
iv_count TYPE i
|
||||
RETURNING VALUE(rv_charge) TYPE ty_amount.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS {{p}}skip_hire_calc IMPLEMENTATION.
|
||||
|
||||
METHOD hire_charge.
|
||||
DATA lv_net TYPE ty_amount.
|
||||
DATA lv_count TYPE i.
|
||||
DATA lv_line TYPE ty_amount.
|
||||
|
||||
LOOP AT it_containers INTO DATA(ls_container).
|
||||
lv_line = container_charge( ls_container ).
|
||||
IF lv_line > 0.
|
||||
lv_net = lv_net + lv_line.
|
||||
lv_count = lv_count + 1.
|
||||
ENDIF.
|
||||
ENDLOOP.
|
||||
|
||||
rv_charge = net_charge( iv_net = lv_net iv_count = lv_count ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD container_charge.
|
||||
IF is_container-days < c_min_days.
|
||||
RETURN.
|
||||
ENDIF.
|
||||
DATA(lv_base) = base_price( is_container-size ).
|
||||
IF lv_base = 0.
|
||||
RETURN.
|
||||
ENDIF.
|
||||
rv_charge = lv_base + extra_days_fee( is_container ).
|
||||
IF is_container-hazardous = abap_true.
|
||||
rv_charge = rv_charge + hazard_fee( is_container-size ).
|
||||
ENDIF.
|
||||
IF is_container-permit = abap_true.
|
||||
rv_charge = rv_charge + c_permit_fee.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD net_charge.
|
||||
IF iv_net = 0.
|
||||
RETURN.
|
||||
ENDIF.
|
||||
rv_charge = round( val = iv_net * ( c_percent_base - bulk_discount( iv_count ) )
|
||||
/ c_percent_base dec = 2 ).
|
||||
IF rv_charge < c_min_charge.
|
||||
rv_charge = c_min_charge.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD extra_days_fee.
|
||||
DATA(lv_days) = is_container-days - c_included_days.
|
||||
IF lv_days > 0.
|
||||
rv_fee = day_rate( is_container-size ) * lv_days.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD base_price.
|
||||
CASE iv_size.
|
||||
WHEN c_size_small.
|
||||
rv_price = c_base_small.
|
||||
WHEN c_size_medium.
|
||||
rv_price = c_base_medium.
|
||||
WHEN c_size_large.
|
||||
rv_price = c_base_large.
|
||||
WHEN OTHERS.
|
||||
rv_price = 0.
|
||||
ENDCASE.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD day_rate.
|
||||
CASE iv_size.
|
||||
WHEN c_size_small.
|
||||
rv_rate = c_rate_small.
|
||||
WHEN c_size_medium.
|
||||
rv_rate = c_rate_medium.
|
||||
WHEN c_size_large.
|
||||
rv_rate = c_rate_large.
|
||||
WHEN OTHERS.
|
||||
rv_rate = 0.
|
||||
ENDCASE.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD hazard_fee.
|
||||
CASE iv_size.
|
||||
WHEN c_size_small.
|
||||
rv_fee = c_hazard_small.
|
||||
WHEN c_size_medium.
|
||||
rv_fee = c_hazard_medium.
|
||||
WHEN c_size_large.
|
||||
rv_fee = c_hazard_large.
|
||||
WHEN OTHERS.
|
||||
rv_fee = 0.
|
||||
ENDCASE.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD bulk_discount.
|
||||
IF iv_count >= c_min_containers.
|
||||
rv_percent = c_percent_bulk.
|
||||
ELSE.
|
||||
rv_percent = 0.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
Reference in New Issue
Block a user