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:
Kral
2026-10-05 13:35:54 +02:00
parent 1c4667a0fc
commit 13360292dd
781 changed files with 50211 additions and 22 deletions

View File

@@ -0,0 +1,189 @@
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
AND 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.

View File

@@ -0,0 +1,87 @@
CLASS ltc_frame_pricer DEFINITION FINAL FOR TESTING
DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
TYPES ty_amount TYPE p LENGTH 9 DECIMALS 2.
CONSTANTS:
c_exp_standard TYPE ty_amount VALUE '59.20',
c_exp_premium TYPE ty_amount VALUE '155.00',
c_exp_small TYPE ty_amount VALUE '37.84',
c_exp_oversized TYPE ty_amount VALUE '119.40',
c_exp_gold TYPE ty_amount VALUE '271.00',
c_exp_zero TYPE ty_amount VALUE '0.00'.
DATA mo_cut TYPE REF TO {{p}}frame_pricer.
METHODS setup.
METHODS standard_order FOR TESTING.
METHODS premium_order FOR TESTING.
METHODS small_frame FOR TESTING.
METHODS oversized_frame FOR TESTING.
METHODS no_setup_fee_for_five FOR TESTING.
METHODS invalid_input FOR TESTING.
ENDCLASS.
CLASS ltc_frame_pricer IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}frame_pricer( ).
ENDMETHOD.
METHOD standard_order.
cl_abap_unit_assert=>assert_equals(
exp = c_exp_standard
act = mo_cut->calculate_price( iv_width_cm = 30
iv_height_cm = 40
iv_moulding = 'S'
iv_glass = 'S'
iv_quantity = 1 ) ).
ENDMETHOD.
METHOD premium_order.
cl_abap_unit_assert=>assert_equals(
exp = c_exp_premium
act = mo_cut->calculate_price( iv_width_cm = 30
iv_height_cm = 40
iv_moulding = 'P'
iv_glass = 'A'
iv_quantity = 2 ) ).
ENDMETHOD.
METHOD small_frame.
cl_abap_unit_assert=>assert_equals(
exp = c_exp_small
act = mo_cut->calculate_price( iv_width_cm = 10
iv_height_cm = 14
iv_moulding = 'S'
iv_glass = 'N'
iv_quantity = 1 ) ).
ENDMETHOD.
METHOD oversized_frame.
cl_abap_unit_assert=>assert_equals(
exp = c_exp_oversized
act = mo_cut->calculate_price( iv_width_cm = 150
iv_height_cm = 140
iv_moulding = 'S'
iv_glass = 'S'
iv_quantity = 1 ) ).
ENDMETHOD.
METHOD no_setup_fee_for_five.
cl_abap_unit_assert=>assert_equals(
exp = c_exp_gold
act = mo_cut->calculate_price( iv_width_cm = 30
iv_height_cm = 40
iv_moulding = 'G'
iv_glass = 'N'
iv_quantity = 5 ) ).
ENDMETHOD.
METHOD invalid_input.
cl_abap_unit_assert=>assert_equals(
exp = c_exp_zero
act = mo_cut->calculate_price( iv_width_cm = 0
iv_height_cm = 40
iv_moulding = 'S'
iv_glass = 'S'
iv_quantity = 1 ) ).
ENDMETHOD.
ENDCLASS.