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() WITH TABLE KEY ingredient = ls_order-ingredient. IF sy-subrc = 0. -quantity = -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.