ADT fallback: Accept headers for FUNC; G0189 accepted; regen2 results

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
This commit is contained in:
Kral
2026-10-03 16:31:03 +02:00
parent 428b3565b2
commit 7510131a7d
335 changed files with 12047 additions and 5545 deletions

View File

@@ -1,60 +0,0 @@
CLASS {{p}}cx_presc_error DEFINITION
PUBLIC
INHERITING FROM cx_root
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_reason TYPE c LENGTH 12.
CONSTANTS:
BEGIN OF c_reason,
empty TYPE ty_reason VALUE 'EMPTY',
expired TYPE ty_reason VALUE 'EXPIRED',
quantity TYPE ty_reason VALUE 'QUANTITY',
unknown TYPE ty_reason VALUE 'UNKNOWN',
dose TYPE ty_reason VALUE 'DOSE',
duplicate TYPE ty_reason VALUE 'DUPLICATE',
END OF c_reason.
METHODS constructor
IMPORTING iv_reason TYPE ty_reason.
METHODS get_reason
RETURNING VALUE(rv_reason) TYPE ty_reason.
METHODS get_message_text
RETURNING VALUE(rv_text) TYPE string.
PRIVATE SECTION.
DATA mv_reason TYPE ty_reason.
ENDCLASS.
CLASS {{p}}cx_presc_error IMPLEMENTATION.
METHOD constructor.
super->constructor( ).
mv_reason = iv_reason.
ENDMETHOD.
METHOD get_reason.
rv_reason = mv_reason.
ENDMETHOD.
METHOD get_message_text.
CASE mv_reason.
WHEN c_reason-empty.
rv_text = 'The prescription has no items'.
WHEN c_reason-expired.
rv_text = 'The prescription is expired'.
WHEN c_reason-quantity.
rv_text = 'The quantity is not positive'.
WHEN c_reason-unknown.
rv_text = 'The drug is not in the drug master'.
WHEN c_reason-dose.
rv_text = 'The daily dose is not allowed'.
WHEN c_reason-duplicate.
rv_text = 'The drug appears more than once'.
ENDCASE.
ENDMETHOD.
ENDCLASS.

View File

@@ -1,103 +0,0 @@
CLASS {{p}}prescription_check DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES ty_drug_id TYPE c LENGTH 10.
TYPES:
BEGIN OF ty_item,
drug_id TYPE ty_drug_id,
quantity TYPE i,
daily_dose TYPE i,
END OF ty_item,
tt_item TYPE STANDARD TABLE OF ty_item WITH EMPTY KEY.
METHODS constructor.
METHODS validate
IMPORTING iv_issue_date TYPE d
iv_valid_days TYPE i
iv_as_of_date TYPE d
it_item TYPE tt_item
RAISING {{p}}cx_presc_error.
PRIVATE SECTION.
DATA mo_drug_master TYPE REF TO {{p}}drug_master.
METHODS expiry_date
IMPORTING iv_issue_date TYPE d
iv_valid_days TYPE i
RETURNING VALUE(rv_expiry) TYPE d.
METHODS check_items
IMPORTING it_item TYPE tt_item
RAISING {{p}}cx_presc_error.
METHODS check_item
IMPORTING is_item TYPE ty_item
RAISING {{p}}cx_presc_error.
METHODS check_duplicates
IMPORTING it_item TYPE tt_item
RAISING {{p}}cx_presc_error.
ENDCLASS.
CLASS {{p}}prescription_check IMPLEMENTATION.
METHOD constructor.
mo_drug_master = NEW {{p}}drug_master( ).
ENDMETHOD.
METHOD validate.
IF it_item IS INITIAL.
RAISE EXCEPTION TYPE {{p}}cx_presc_error
EXPORTING iv_reason = {{p}}cx_presc_error=>c_reason-empty.
ENDIF.
IF iv_as_of_date > expiry_date( iv_issue_date = iv_issue_date
iv_valid_days = iv_valid_days ).
RAISE EXCEPTION TYPE {{p}}cx_presc_error
EXPORTING iv_reason = {{p}}cx_presc_error=>c_reason-expired.
ENDIF.
check_items( it_item ).
check_duplicates( it_item ).
ENDMETHOD.
METHOD expiry_date.
rv_expiry = iv_issue_date + iv_valid_days.
ENDMETHOD.
METHOD check_items.
LOOP AT it_item INTO DATA(ls_item).
check_item( ls_item ).
ENDLOOP.
ENDMETHOD.
METHOD check_item.
IF is_item-quantity < 1.
RAISE EXCEPTION TYPE {{p}}cx_presc_error
EXPORTING iv_reason = {{p}}cx_presc_error=>c_reason-quantity.
ENDIF.
DATA(ls_drug) = mo_drug_master->get_drug( is_item-drug_id ).
IF ls_drug IS INITIAL.
RAISE EXCEPTION TYPE {{p}}cx_presc_error
EXPORTING iv_reason = {{p}}cx_presc_error=>c_reason-unknown.
ENDIF.
IF is_item-daily_dose < 1 OR is_item-daily_dose > ls_drug-max_daily_dose.
RAISE EXCEPTION TYPE {{p}}cx_presc_error
EXPORTING iv_reason = {{p}}cx_presc_error=>c_reason-dose.
ENDIF.
ENDMETHOD.
METHOD check_duplicates.
DATA lt_seen TYPE HASHED TABLE OF ty_item WITH UNIQUE KEY drug_id.
LOOP AT it_item INTO DATA(ls_item).
INSERT ls_item INTO TABLE lt_seen.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE {{p}}cx_presc_error
EXPORTING iv_reason = {{p}}cx_presc_error=>c_reason-duplicate.
ENDIF.
ENDLOOP.
ENDMETHOD.
ENDCLASS.

View File

@@ -1,104 +0,0 @@
CLASS ltc_presc_check DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}prescription_check.
METHODS setup.
METHODS valid_prescription FOR TESTING.
METHODS empty_prescription FOR TESTING.
METHODS expired_prescription FOR TESTING.
METHODS unknown_drug FOR TESTING.
METHODS bad_quantity FOR TESTING.
METHODS bad_dose FOR TESTING.
METHODS duplicate_drug FOR TESTING.
METHODS message_of_empty FOR TESTING.
METHODS valid_item
RETURNING VALUE(rt_item) TYPE {{p}}prescription_check=>tt_item.
METHODS expect_reason
IMPORTING iv_reason TYPE {{p}}cx_presc_error=>ty_reason
it_item TYPE {{p}}prescription_check=>tt_item.
ENDCLASS.
CLASS ltc_presc_check IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}prescription_check( ).
ENDMETHOD.
METHOD valid_item.
rt_item = VALUE #( ( drug_id = 'IBU400' quantity = 10 daily_dose = 1200 ) ).
ENDMETHOD.
METHOD expect_reason.
DATA lv_raised TYPE abap_bool.
TRY.
mo_cut->validate( iv_issue_date = '20240101'
iv_valid_days = 30
iv_as_of_date = '20240110'
it_item = it_item ).
CATCH {{p}}cx_presc_error INTO DATA(lx_error).
lv_raised = abap_true.
cl_abap_unit_assert=>assert_equals( exp = iv_reason
act = lx_error->get_reason( ) ).
ENDTRY.
cl_abap_unit_assert=>assert_true( act = lv_raised ).
ENDMETHOD.
METHOD valid_prescription.
TRY.
mo_cut->validate( iv_issue_date = '20240101'
iv_valid_days = 30
iv_as_of_date = '20240110'
it_item = valid_item( ) ).
CATCH {{p}}cx_presc_error.
cl_abap_unit_assert=>fail( msg = 'Unexpected exception' ).
ENDTRY.
ENDMETHOD.
METHOD empty_prescription.
expect_reason( iv_reason = {{p}}cx_presc_error=>c_reason-empty
it_item = VALUE {{p}}prescription_check=>tt_item( ) ).
ENDMETHOD.
METHOD expired_prescription.
DATA lv_raised TYPE abap_bool.
TRY.
mo_cut->validate( iv_issue_date = '20240101'
iv_valid_days = 30
iv_as_of_date = '20240201'
it_item = valid_item( ) ).
CATCH {{p}}cx_presc_error INTO DATA(lx_error).
lv_raised = abap_true.
cl_abap_unit_assert=>assert_equals( exp = {{p}}cx_presc_error=>c_reason-expired
act = lx_error->get_reason( ) ).
ENDTRY.
cl_abap_unit_assert=>assert_true( act = lv_raised ).
ENDMETHOD.
METHOD unknown_drug.
expect_reason( iv_reason = {{p}}cx_presc_error=>c_reason-unknown
it_item = VALUE #( ( drug_id = 'NODRUG' quantity = 5 daily_dose = 10 ) ) ).
ENDMETHOD.
METHOD bad_quantity.
expect_reason( iv_reason = {{p}}cx_presc_error=>c_reason-quantity
it_item = VALUE #( ( drug_id = 'IBU400' quantity = 0 daily_dose = 1200 ) ) ).
ENDMETHOD.
METHOD bad_dose.
expect_reason( iv_reason = {{p}}cx_presc_error=>c_reason-dose
it_item = VALUE #( ( drug_id = 'META50' quantity = 5 daily_dose = 500 ) ) ).
ENDMETHOD.
METHOD duplicate_drug.
expect_reason( iv_reason = {{p}}cx_presc_error=>c_reason-duplicate
it_item = VALUE #( ( drug_id = 'IBU400' quantity = 10 daily_dose = 1200 )
( drug_id = 'IBU400' quantity = 10 daily_dose = 1200 ) ) ).
ENDMETHOD.
METHOD message_of_empty.
DATA(lo_error) = NEW {{p}}cx_presc_error( iv_reason = {{p}}cx_presc_error=>c_reason-empty ).
cl_abap_unit_assert=>assert_equals( exp = 'The prescription has no items'
act = lo_error->get_message_text( ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,115 @@
CLASS {{p}}provision_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
ty_material TYPE c LENGTH 18,
ty_quantity TYPE p LENGTH 13 DECIMALS 3,
ty_price TYPE p LENGTH 11 DECIMALS 2,
ty_amount TYPE p LENGTH 13 DECIMALS 2,
ty_reason TYPE c LENGTH 20.
TYPES:
BEGIN OF ty_line,
material TYPE ty_material,
quantity TYPE ty_quantity,
price TYPE ty_price,
END OF ty_line.
TYPES tt_lines TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY.
CONSTANTS:
c_max_lines TYPE i VALUE 999,
c_value_limit TYPE ty_amount VALUE '100000.00',
c_empty_order TYPE ty_reason VALUE 'EMPTY_ORDER',
c_too_many_lines TYPE ty_reason VALUE 'TOO_MANY_LINES',
c_material_missing TYPE ty_reason VALUE 'MATERIAL_MISSING',
c_quantity_invalid TYPE ty_reason VALUE 'QUANTITY_INVALID',
c_price_negative TYPE ty_reason VALUE 'PRICE_NEGATIVE',
c_duplicate_material TYPE ty_reason VALUE 'DUPLICATE_MATERIAL',
c_limit_exceeded TYPE ty_reason VALUE 'LIMIT_EXCEEDED'.
METHODS constructor.
METHODS check_order
IMPORTING it_lines TYPE tt_lines
RAISING {{p}}cx_prov_error.
METHODS calculate_value
IMPORTING it_lines TYPE tt_lines
RETURNING VALUE(rv_value) TYPE ty_amount
RAISING {{p}}cx_prov_error.
PRIVATE SECTION.
TYPES tt_materials TYPE HASHED TABLE OF ty_material WITH UNIQUE KEY table_line.
METHODS check_lines
IMPORTING it_lines TYPE tt_lines
RAISING {{p}}cx_prov_error.
METHODS total_value
IMPORTING it_lines TYPE tt_lines
RETURNING VALUE(rv_value) TYPE ty_amount.
METHODS raise_error
IMPORTING iv_reason TYPE ty_reason
RAISING {{p}}cx_prov_error.
ENDCLASS.
CLASS {{p}}provision_calc IMPLEMENTATION.
METHOD constructor.
ENDMETHOD.
METHOD check_order.
IF it_lines IS INITIAL.
raise_error( c_empty_order ).
ENDIF.
IF lines( it_lines ) > c_max_lines.
raise_error( c_too_many_lines ).
ENDIF.
check_lines( it_lines ).
IF total_value( it_lines ) > c_value_limit.
raise_error( c_limit_exceeded ).
ENDIF.
ENDMETHOD.
METHOD calculate_value.
check_order( it_lines ).
rv_value = total_value( it_lines ).
ENDMETHOD.
METHOD check_lines.
DATA lt_seen TYPE tt_materials.
LOOP AT it_lines INTO DATA(ls_line).
IF ls_line-material IS INITIAL.
raise_error( c_material_missing ).
ENDIF.
IF ls_line-quantity <= 0.
raise_error( c_quantity_invalid ).
ENDIF.
IF ls_line-price < 0.
raise_error( c_price_negative ).
ENDIF.
IF line_exists( lt_seen[ table_line = ls_line-material ] ).
raise_error( c_duplicate_material ).
ENDIF.
INSERT ls_line-material INTO TABLE lt_seen.
ENDLOOP.
ENDMETHOD.
METHOD total_value.
DATA lv_total TYPE p LENGTH 16 DECIMALS 5.
LOOP AT it_lines INTO DATA(ls_line).
lv_total = lv_total + ls_line-quantity * ls_line-price.
ENDLOOP.
rv_value = round( val = lv_total dec = 2 ).
ENDMETHOD.
METHOD raise_error.
RAISE EXCEPTION TYPE {{p}}cx_prov_error
EXPORTING
iv_reason = iv_reason.
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,95 @@
CLASS ltc_provision_calc DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}provision_calc.
METHODS setup.
METHODS empty_order FOR TESTING.
METHODS material_missing FOR TESTING.
METHODS duplicate_material FOR TESTING.
METHODS value_of_valid_order FOR TESTING.
METHODS limit_exceeded FOR TESTING.
METHODS rounds_total FOR TESTING.
ENDCLASS.
CLASS ltc_provision_calc IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}provision_calc( ).
ENDMETHOD.
METHOD empty_order.
DATA lt_lines TYPE {{p}}provision_calc=>tt_lines.
TRY.
mo_cut->check_order( lt_lines ).
cl_abap_unit_assert=>fail( ).
CATCH {{p}}cx_prov_error INTO DATA(lx_error).
cl_abap_unit_assert=>assert_equals( exp = {{p}}provision_calc=>c_empty_order
act = lx_error->reason ).
ENDTRY.
ENDMETHOD.
METHOD material_missing.
DATA lt_lines TYPE {{p}}provision_calc=>tt_lines.
lt_lines = VALUE #( ( material = ` ` quantity = 1 price = 1 ) ).
TRY.
mo_cut->check_order( lt_lines ).
cl_abap_unit_assert=>fail( ).
CATCH {{p}}cx_prov_error INTO DATA(lx_error).
cl_abap_unit_assert=>assert_equals( exp = {{p}}provision_calc=>c_material_missing
act = lx_error->reason ).
ENDTRY.
ENDMETHOD.
METHOD duplicate_material.
DATA lt_lines TYPE {{p}}provision_calc=>tt_lines.
lt_lines = VALUE #( ( material = 'ROPE' quantity = 1 price = 1 )
( material = 'ROPE' quantity = 2 price = 1 ) ).
TRY.
mo_cut->check_order( lt_lines ).
cl_abap_unit_assert=>fail( ).
CATCH {{p}}cx_prov_error INTO DATA(lx_error).
cl_abap_unit_assert=>assert_equals( exp = {{p}}provision_calc=>c_duplicate_material
act = lx_error->reason ).
ENDTRY.
ENDMETHOD.
METHOD value_of_valid_order.
DATA lt_lines TYPE {{p}}provision_calc=>tt_lines.
lt_lines = VALUE #( ( material = 'ROPE' quantity = 2 price = '3.50' )
( material = 'BOLT' quantity = 3 price = '1.25' ) ).
DATA lv_expected TYPE {{p}}provision_calc=>ty_amount VALUE '10.75'.
DATA lv_value TYPE {{p}}provision_calc=>ty_amount.
TRY.
lv_value = mo_cut->calculate_value( lt_lines ).
CATCH {{p}}cx_prov_error INTO DATA(lx_error).
cl_abap_unit_assert=>fail( msg = |Unexpected reason { lx_error->reason }| ).
ENDTRY.
cl_abap_unit_assert=>assert_equals( exp = lv_expected act = lv_value ).
ENDMETHOD.
METHOD limit_exceeded.
DATA lt_lines TYPE {{p}}provision_calc=>tt_lines.
lt_lines = VALUE #( ( material = 'ENGINE' quantity = 1 price = '100000.01' ) ).
TRY.
mo_cut->check_order( lt_lines ).
cl_abap_unit_assert=>fail( ).
CATCH {{p}}cx_prov_error INTO DATA(lx_error).
cl_abap_unit_assert=>assert_equals( exp = {{p}}provision_calc=>c_limit_exceeded
act = lx_error->reason ).
ENDTRY.
ENDMETHOD.
METHOD rounds_total.
DATA lt_lines TYPE {{p}}provision_calc=>tt_lines.
lt_lines = VALUE #( ( material = 'ROPE' quantity = '1.005' price = '1.00' )
( material = 'BOLT' quantity = '1.005' price = '1.00' ) ).
DATA lv_expected TYPE {{p}}provision_calc=>ty_amount VALUE '2.01'.
DATA lv_value TYPE {{p}}provision_calc=>ty_amount.
TRY.
lv_value = mo_cut->calculate_value( lt_lines ).
CATCH {{p}}cx_prov_error INTO DATA(lx_error).
cl_abap_unit_assert=>fail( msg = |Unexpected reason { lx_error->reason }| ).
ENDTRY.
cl_abap_unit_assert=>assert_equals( exp = lv_expected act = lv_value ).
ENDMETHOD.
ENDCLASS.