CLASS {{p}}feed_stock DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. INTERFACES {{p}}if_feed_stock. PRIVATE SECTION. TYPES tt_sum TYPE HASHED TABLE OF {{p}}if_feed_stock=>ty_stock WITH UNIQUE KEY feed_type. METHODS sum_deliveries IMPORTING it_supplier_a TYPE {{p}}if_feed_stock=>tt_delivery it_supplier_b TYPE {{p}}if_feed_stock=>tt_delivery RETURNING VALUE(rt_sum) TYPE tt_sum. METHODS add_delivery IMPORTING is_delivery TYPE {{p}}if_feed_stock=>ty_delivery CHANGING ct_sum TYPE tt_sum. METHODS is_counted IMPORTING is_delivery TYPE {{p}}if_feed_stock=>ty_delivery RETURNING VALUE(rv_counted) TYPE abap_bool. ENDCLASS. CLASS {{p}}feed_stock IMPLEMENTATION. METHOD {{p}}if_feed_stock~consolidate. DATA(lt_sum) = sum_deliveries( it_supplier_a = it_supplier_a it_supplier_b = it_supplier_b ). LOOP AT lt_sum ASSIGNING FIELD-SYMBOL(). IF -quantity IS INITIAL. CONTINUE. ENDIF. APPEND TO rt_stock. ENDLOOP. SORT rt_stock BY feed_type. ENDMETHOD. METHOD {{p}}if_feed_stock~quantity_of. DATA lt_stock TYPE {{p}}if_feed_stock=>tt_stock. lt_stock = it_stock. SORT lt_stock BY feed_type. READ TABLE lt_stock ASSIGNING FIELD-SYMBOL() WITH KEY feed_type = iv_feed_type BINARY SEARCH. IF sy-subrc = 0. rv_quantity = -quantity. ENDIF. ENDMETHOD. METHOD {{p}}if_feed_stock~top_feed. IF it_stock IS INITIAL. RETURN. ENDIF. DATA(lt_ranked) = it_stock. SORT lt_ranked BY quantity DESCENDING feed_type ASCENDING. rv_feed_type = lt_ranked[ 1 ]-feed_type. ENDMETHOD. METHOD sum_deliveries. DATA lt_all TYPE {{p}}if_feed_stock=>tt_delivery. DATA lt_sum TYPE tt_sum. APPEND LINES OF it_supplier_a TO lt_all. APPEND LINES OF it_supplier_b TO lt_all. LOOP AT lt_all ASSIGNING FIELD-SYMBOL(). IF is_counted( ) = abap_false. CONTINUE. ENDIF. add_delivery( EXPORTING is_delivery = CHANGING ct_sum = lt_sum ). ENDLOOP. rt_sum = lt_sum. ENDMETHOD. METHOD add_delivery. ASSIGN ct_sum[ feed_type = is_delivery-feed_type ] TO FIELD-SYMBOL(). IF sy-subrc <> 0. INSERT VALUE #( feed_type = is_delivery-feed_type unit = is_delivery-unit quantity = is_delivery-quantity deliveries = 1 ) INTO TABLE ct_sum ASSIGNING . RETURN. ENDIF. -quantity = -quantity + is_delivery-quantity. -deliveries = -deliveries + 1. ENDMETHOD. METHOD is_counted. rv_counted = xsdbool( is_delivery-feed_type IS NOT INITIAL AND is_delivery-quantity IS NOT INITIAL ). ENDMETHOD. ENDCLASS.