Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
103 lines
3.4 KiB
ABAP
103 lines
3.4 KiB
ABAP
CLASS {{p}}canteen_planner DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
PUBLIC SECTION.
|
|
INTERFACES {{p}}if_canteen_plan.
|
|
|
|
PRIVATE SECTION.
|
|
TYPES tt_demand TYPE SORTED TABLE OF {{p}}if_canteen_plan=>ty_order
|
|
WITH UNIQUE KEY ingredient.
|
|
TYPES tt_master TYPE HASHED TABLE OF {{p}}if_canteen_plan=>ty_master
|
|
WITH UNIQUE KEY ingredient.
|
|
|
|
METHODS collect_orders
|
|
IMPORTING it_orders TYPE {{p}}if_canteen_plan=>tt_order
|
|
CHANGING ct_demand TYPE tt_demand.
|
|
|
|
METHODS collect_demand
|
|
IMPORTING it_orders TYPE {{p}}if_canteen_plan=>tt_order
|
|
RETURNING VALUE(rt_demand) TYPE tt_demand.
|
|
|
|
METHODS to_master
|
|
IMPORTING it_catalogue TYPE {{p}}if_canteen_plan=>tt_master
|
|
RETURNING VALUE(rt_master) TYPE tt_master.
|
|
|
|
METHODS packs_needed
|
|
IMPORTING iv_quantity TYPE {{p}}if_canteen_plan=>ty_quantity
|
|
iv_pack_size TYPE {{p}}if_canteen_plan=>ty_quantity
|
|
RETURNING VALUE(rv_packs) TYPE i.
|
|
ENDCLASS.
|
|
|
|
|
|
CLASS {{p}}canteen_planner IMPLEMENTATION.
|
|
METHOD {{p}}if_canteen_plan~merge_orders.
|
|
DATA(lt_demand) = collect_demand( it_orders_a ).
|
|
collect_orders( EXPORTING it_orders = it_orders_b
|
|
CHANGING ct_demand = lt_demand ).
|
|
rt_demand = lt_demand.
|
|
ENDMETHOD.
|
|
|
|
METHOD {{p}}if_canteen_plan~pack_requirement.
|
|
DATA(lt_master) = to_master( it_catalogue ).
|
|
DATA(lt_demand) = collect_demand( it_demand ).
|
|
DATA ls_master TYPE {{p}}if_canteen_plan=>ty_master.
|
|
|
|
LOOP AT lt_demand INTO DATA(ls_demand).
|
|
IF NOT line_exists( lt_master[ ingredient = ls_demand-ingredient ] ).
|
|
CONTINUE.
|
|
ENDIF.
|
|
ls_master = lt_master[ ingredient = ls_demand-ingredient ].
|
|
INSERT VALUE #( ingredient = ls_demand-ingredient
|
|
packs = packs_needed( iv_quantity = ls_demand-quantity
|
|
iv_pack_size = ls_master-pack_size ) )
|
|
INTO TABLE rt_packs.
|
|
ENDLOOP.
|
|
ENDMETHOD.
|
|
|
|
METHOD {{p}}if_canteen_plan~missing_ingredients.
|
|
DATA(lt_master) = to_master( it_catalogue ).
|
|
DATA(lt_demand) = collect_demand( it_demand ).
|
|
|
|
LOOP AT lt_demand INTO DATA(ls_demand).
|
|
IF NOT line_exists( lt_master[ ingredient = ls_demand-ingredient ] ).
|
|
APPEND ls_demand-ingredient TO rt_missing.
|
|
ENDIF.
|
|
ENDLOOP.
|
|
ENDMETHOD.
|
|
|
|
METHOD collect_orders.
|
|
LOOP AT it_orders INTO DATA(ls_order).
|
|
IF ls_order-quantity <= 0.
|
|
CONTINUE.
|
|
ENDIF.
|
|
READ TABLE ct_demand ASSIGNING FIELD-SYMBOL(<ls_demand>)
|
|
WITH TABLE KEY ingredient = ls_order-ingredient.
|
|
IF sy-subrc = 0.
|
|
<ls_demand>-quantity = <ls_demand>-quantity + ls_order-quantity.
|
|
ELSE.
|
|
INSERT VALUE #( ingredient = ls_order-ingredient
|
|
quantity = ls_order-quantity ) INTO TABLE ct_demand.
|
|
ENDIF.
|
|
ENDLOOP.
|
|
ENDMETHOD.
|
|
|
|
METHOD collect_demand.
|
|
DATA(lt_demand) = VALUE tt_demand( ).
|
|
collect_orders( EXPORTING it_orders = it_orders
|
|
CHANGING ct_demand = lt_demand ).
|
|
rt_demand = lt_demand.
|
|
ENDMETHOD.
|
|
|
|
METHOD to_master.
|
|
LOOP AT it_catalogue INTO DATA(ls_catalogue).
|
|
INSERT VALUE #( ingredient = ls_catalogue-ingredient
|
|
pack_size = ls_catalogue-pack_size ) INTO TABLE rt_master.
|
|
ENDLOOP.
|
|
ENDMETHOD.
|
|
|
|
METHOD packs_needed.
|
|
rv_packs = iv_quantity DIV iv_pack_size.
|
|
IF iv_quantity MOD iv_pack_size = 0.
|
|
rv_packs = rv_packs + 1.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
ENDCLASS.
|