@@ -3,18 +3,93 @@ def self.call(...)
33 new ( ...) . call
44 end
55
6- attr_reader :somleng_client , :skyetel_client
6+ attr_reader :somleng_client , :skyetel_client , :dry_run , :logger , :verbose
77
88 def initialize ( **options )
99 @somleng_client = options . fetch ( :somleng_client ) { Somleng ::CarrierAPI ::Client . new }
1010 @skyetel_client = options . fetch ( :skyetel_client ) { Skyetel ::Client . new }
11+ @dry_run = options [ :dry_run ]
12+ @verbose = options [ :verbose ]
13+ @logger = options . fetch ( :logger ) { Logger . new ( STDOUT ) }
1114 end
1215
1316 def call
17+ inventory_report = generate_inventory_report
18+ shopping_list = generate_shopping_list ( inventory_report )
19+ purchase_order = generate_purchase_order ( shopping_list )
20+ execute_order ( purchase_order )
21+ update_inventory ( purchase_order )
22+ end
23+
24+ private
25+
26+ def generate_inventory_report
27+ logger . info ( "Generating inventory report..." )
1428 inventory_report = GenerateInventoryReport . call ( client : somleng_client )
29+ logger . info ( "Done." )
30+ log_inventory_report ( inventory_report ) if verbose
31+ inventory_report
32+ end
33+
34+ def generate_shopping_list ( inventory_report )
35+ logger . info ( "Generating shopping list..." )
1536 shopping_list = GenerateShoppingList . call ( inventory_report :)
37+ logger . info ( "Done." )
38+ log_shopping_list ( shopping_list ) if verbose
39+ shopping_list
40+ end
41+
42+ def generate_purchase_order ( shopping_list )
43+ logger . info ( "Generating purchase order..." )
1644 purchase_order = GeneratePurchaseOrder . call ( shopping_list :, client : skyetel_client )
45+ logger . info ( "Done." )
46+ logger . info ( "Purchase order contains #{ purchase_order . to_order . count } numbers." ) if verbose
47+ purchase_order
48+ end
49+
50+ def execute_order ( purchase_order )
51+ if dry_run
52+ logger . info ( "Dry run. Skipping order execution." )
53+ return
54+ end
55+
56+ logger . info ( "Executing order..." )
1757 ExecuteOrder . call ( purchase_order :, client : skyetel_client )
58+ logger . info ( "Done." )
59+ end
60+
61+ def update_inventory ( purchase_order )
62+ if dry_run
63+ logger . info ( "Dry run. Skipping inventory update." )
64+ return
65+ end
66+
67+ logger . info ( "Updating inventory..." )
1868 UpdateInventory . call ( purchase_order :, client : somleng_client )
69+ logger . info ( "Done." )
70+ end
71+
72+ def log_inventory_report ( inventory_report )
73+ logger . info ( "Inventory report contains #{ inventory_report . line_items . count } cities." )
74+ report_summary = inventory_report . line_items . each_with_object ( { } ) do |line_item , result |
75+ result [ "#{ line_item . country } /#{ line_item . region } /#{ line_item . locality } " ] = line_item . quantity
76+ end
77+
78+ logger . info ( "Inventory report: #{ JSON . pretty_generate ( report_summary ) } " )
79+ end
80+
81+ def log_shopping_list ( shopping_list )
82+ logger . info ( "Shopping list generated with the following options: MIN_STOCK: #{ shopping_list . min_stock } , MAX_STOCK: #{ shopping_list . max_stock } ." )
83+ if shopping_list . line_items . count == 0
84+ logger . warn ( "Shopping list contains no items." )
85+ cities = shopping_list . cities . map { |city | "#{ city . country } /#{ city . region } /#{ city . name } " }
86+ logger . info ( "Shopping list generated for the following cities: #{ JSON . pretty_generate ( cities ) } " )
87+ else
88+ logger . info ( "Shopping list contains #{ shopping_list . line_items . count } items." )
89+ report_summary = shopping_list . line_items . each_with_object ( { } ) do |line_item , result |
90+ result [ "#{ line_item . country } /#{ line_item . region } /#{ line_item . locality } " ] = line_item . quantity
91+ end
92+ logger . info ( "Shopping list: #{ JSON . pretty_generate ( report_summary ) } " )
93+ end
1994 end
2095end
0 commit comments