lightspeed_sandbox_simulator 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +5 -0
  3. data/LICENSE +21 -0
  4. data/README.md +215 -0
  5. data/bin/simulate +162 -0
  6. data/lib/lightspeed_sandbox_simulator/configuration.rb +151 -0
  7. data/lib/lightspeed_sandbox_simulator/data/bar_nightclub/categories.json +9 -0
  8. data/lib/lightspeed_sandbox_simulator/data/bar_nightclub/items.json +26 -0
  9. data/lib/lightspeed_sandbox_simulator/data/bar_nightclub/tenders.json +8 -0
  10. data/lib/lightspeed_sandbox_simulator/data/cafe_bakery/categories.json +9 -0
  11. data/lib/lightspeed_sandbox_simulator/data/cafe_bakery/items.json +28 -0
  12. data/lib/lightspeed_sandbox_simulator/data/cafe_bakery/tenders.json +8 -0
  13. data/lib/lightspeed_sandbox_simulator/data/restaurant/categories.json +9 -0
  14. data/lib/lightspeed_sandbox_simulator/data/restaurant/items.json +29 -0
  15. data/lib/lightspeed_sandbox_simulator/data/restaurant/tenders.json +9 -0
  16. data/lib/lightspeed_sandbox_simulator/data/retail_general/categories.json +9 -0
  17. data/lib/lightspeed_sandbox_simulator/data/retail_general/items.json +17 -0
  18. data/lib/lightspeed_sandbox_simulator/data/retail_general/tenders.json +8 -0
  19. data/lib/lightspeed_sandbox_simulator/database.rb +116 -0
  20. data/lib/lightspeed_sandbox_simulator/db/factories/api_requests.rb +10 -0
  21. data/lib/lightspeed_sandbox_simulator/db/factories/business_types.rb +9 -0
  22. data/lib/lightspeed_sandbox_simulator/db/factories/categories.rb +9 -0
  23. data/lib/lightspeed_sandbox_simulator/db/factories/items.rb +11 -0
  24. data/lib/lightspeed_sandbox_simulator/db/factories/simulated_orders.rb +17 -0
  25. data/lib/lightspeed_sandbox_simulator/db/factories/simulated_payments.rb +13 -0
  26. data/lib/lightspeed_sandbox_simulator/db/migrate/20260313000001_enable_pgcrypto.rb +7 -0
  27. data/lib/lightspeed_sandbox_simulator/db/migrate/20260313000002_create_business_types.rb +14 -0
  28. data/lib/lightspeed_sandbox_simulator/db/migrate/20260313000003_create_categories.rb +13 -0
  29. data/lib/lightspeed_sandbox_simulator/db/migrate/20260313000004_create_items.rb +14 -0
  30. data/lib/lightspeed_sandbox_simulator/db/migrate/20260313000005_create_simulated_orders.rb +23 -0
  31. data/lib/lightspeed_sandbox_simulator/db/migrate/20260313000006_create_simulated_payments.rb +16 -0
  32. data/lib/lightspeed_sandbox_simulator/db/migrate/20260313000007_create_api_requests.rb +18 -0
  33. data/lib/lightspeed_sandbox_simulator/db/migrate/20260313000008_create_daily_summaries.rb +20 -0
  34. data/lib/lightspeed_sandbox_simulator/generators/data_loader.rb +75 -0
  35. data/lib/lightspeed_sandbox_simulator/generators/entity_generator.rb +96 -0
  36. data/lib/lightspeed_sandbox_simulator/generators/order_generator.rb +293 -0
  37. data/lib/lightspeed_sandbox_simulator/models/api_request.rb +9 -0
  38. data/lib/lightspeed_sandbox_simulator/models/business_type.rb +12 -0
  39. data/lib/lightspeed_sandbox_simulator/models/category.rb +12 -0
  40. data/lib/lightspeed_sandbox_simulator/models/daily_summary.rb +44 -0
  41. data/lib/lightspeed_sandbox_simulator/models/item.rb +11 -0
  42. data/lib/lightspeed_sandbox_simulator/models/simulated_order.rb +15 -0
  43. data/lib/lightspeed_sandbox_simulator/models/simulated_payment.rb +13 -0
  44. data/lib/lightspeed_sandbox_simulator/seeder.rb +79 -0
  45. data/lib/lightspeed_sandbox_simulator/services/base_service.rb +158 -0
  46. data/lib/lightspeed_sandbox_simulator/services/lightspeed/business_service.rb +21 -0
  47. data/lib/lightspeed_sandbox_simulator/services/lightspeed/menu_service.rb +70 -0
  48. data/lib/lightspeed_sandbox_simulator/services/lightspeed/order_service.rb +74 -0
  49. data/lib/lightspeed_sandbox_simulator/services/lightspeed/payment_method_service.rb +30 -0
  50. data/lib/lightspeed_sandbox_simulator/services/lightspeed/payment_service.rb +55 -0
  51. data/lib/lightspeed_sandbox_simulator/services/lightspeed/services_manager.rb +54 -0
  52. data/lib/lightspeed_sandbox_simulator.rb +30 -0
  53. metadata +332 -0
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LightspeedSandboxSimulator
4
+ module Services
5
+ module Lightspeed
6
+ class MenuService < BaseService
7
+ def list_categories
8
+ request(:get, endpoint('menu/categories'))
9
+ end
10
+
11
+ def create_category(name:, sort_order: nil)
12
+ payload = { name: name }
13
+ payload[:sortOrder] = sort_order if sort_order
14
+ request(:post, endpoint('menu/categories'), payload: payload)
15
+ end
16
+
17
+ def update_category(id:, name:, sort_order: nil)
18
+ payload = { name: name }
19
+ payload[:sortOrder] = sort_order if sort_order
20
+ request(:put, endpoint("menu/categories/#{id}"), payload: payload)
21
+ end
22
+
23
+ def delete_category(id:)
24
+ request(:delete, endpoint("menu/categories/#{id}"))
25
+ end
26
+
27
+ def list_items
28
+ request(:get, endpoint('menu/items'))
29
+ end
30
+
31
+ def create_item(name:, price:, category_id: nil, taxable: true, sku: nil, description: nil)
32
+ payload = { name: name, price: price, taxable: taxable }
33
+ payload[:categoryId] = category_id if category_id
34
+ payload[:sku] = sku if sku
35
+ payload[:description] = description if description
36
+ request(:post, endpoint('menu/items'), payload: payload)
37
+ end
38
+
39
+ def update_item(id:, **attributes)
40
+ payload = {}
41
+ payload[:name] = attributes[:name] if attributes.key?(:name)
42
+ payload[:price] = attributes[:price] if attributes.key?(:price)
43
+ payload[:categoryId] = attributes[:category_id] if attributes.key?(:category_id)
44
+ payload[:taxable] = attributes[:taxable] if attributes.key?(:taxable)
45
+ request(:put, endpoint("menu/items/#{id}"), payload: payload)
46
+ end
47
+
48
+ def delete_item(id:)
49
+ request(:delete, endpoint("menu/items/#{id}"))
50
+ end
51
+
52
+ def find_category_by_name(name)
53
+ categories = list_categories
54
+ categories = categories['categories'] if categories.is_a?(Hash) && categories.key?('categories')
55
+ return nil unless categories.is_a?(Array)
56
+
57
+ categories.find { |c| c['name']&.downcase == name.downcase }
58
+ end
59
+
60
+ def find_item_by_name(name)
61
+ items = list_items
62
+ items = items['items'] if items.is_a?(Hash) && items.key?('items')
63
+ return nil unless items.is_a?(Array)
64
+
65
+ items.find { |i| i['name']&.downcase == name.downcase }
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LightspeedSandboxSimulator
4
+ module Services
5
+ module Lightspeed
6
+ class OrderService < BaseService
7
+ ORDER_TYPES = { local: 'local', to_go: 'toGo' }.freeze
8
+
9
+ def create_local_order(items:, table_number: nil, covers: nil)
10
+ payload = build_order_payload(items)
11
+ payload[:tableNumber] = table_number if table_number
12
+ payload[:covers] = covers if covers
13
+ request(:post, "#{API_PREFIX}/businesses/#{config.business_id}/orders/local",
14
+ payload: payload, resource_type: 'Order')
15
+ end
16
+
17
+ def create_to_go_order(items:, customer_name: nil)
18
+ payload = build_order_payload(items)
19
+ payload[:customerName] = customer_name if customer_name
20
+ request(:post, "#{API_PREFIX}/businesses/#{config.business_id}/orders/toGo",
21
+ payload: payload, resource_type: 'Order')
22
+ end
23
+
24
+ def fetch_orders(start_date:, end_date:, cursor: nil, limit: 100)
25
+ params = { startDate: format_date(start_date), endDate: format_date(end_date), limit: limit }
26
+ params[:cursor] = cursor if cursor
27
+ request(:get, endpoint('orders'), params: params)
28
+ end
29
+
30
+ def fetch_all_orders(start_date:, end_date:)
31
+ all_orders = []
32
+ cursor = nil
33
+
34
+ loop do
35
+ result = fetch_orders(start_date: start_date, end_date: end_date, cursor: cursor)
36
+ return all_orders unless result.is_a?(Hash)
37
+
38
+ orders = result['orders'] || []
39
+ all_orders.concat(orders)
40
+
41
+ cursor = result['cursor']
42
+ break if cursor.nil? || cursor.to_s.empty? || orders.empty?
43
+ end
44
+
45
+ all_orders
46
+ end
47
+
48
+ private
49
+
50
+ def build_order_payload(items)
51
+ {
52
+ items: items.map { |item| build_item_payload(item) }
53
+ }
54
+ end
55
+
56
+ def build_item_payload(item)
57
+ entry = { itemId: item[:item_id], quantity: item[:quantity] || 1 }
58
+ entry[:unitPrice] = item[:unit_price] if item[:unit_price]
59
+ entry[:discountAmount] = item[:discount] if item[:discount]&.positive?
60
+ entry[:notes] = item[:notes] if item[:notes]
61
+ entry
62
+ end
63
+
64
+ def format_date(value)
65
+ case value
66
+ when Date then value.iso8601
67
+ when Time then value.to_date.iso8601
68
+ else value.to_s
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LightspeedSandboxSimulator
4
+ module Services
5
+ module Lightspeed
6
+ class PaymentMethodService < BaseService
7
+ def list_payment_methods
8
+ request(:get, endpoint('payment-methods'))
9
+ end
10
+
11
+ def create_payment_method(name:, type: 'OTHER')
12
+ payload = { name: name, type: type }
13
+ request(:post, endpoint('payment-methods'), payload: payload)
14
+ end
15
+
16
+ def delete_payment_method(id:)
17
+ request(:delete, endpoint("payment-methods/#{id}"))
18
+ end
19
+
20
+ def find_payment_method_by_name(name)
21
+ methods = list_payment_methods
22
+ methods = methods['paymentMethods'] if methods.is_a?(Hash) && methods.key?('paymentMethods')
23
+ return nil unless methods.is_a?(Array)
24
+
25
+ methods.find { |m| m['name']&.downcase == name.downcase }
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LightspeedSandboxSimulator
4
+ module Services
5
+ module Lightspeed
6
+ class PaymentService < BaseService
7
+ def create_payment(order_id:, amount:, payment_method_id:, tip_amount: 0, staff_id: nil)
8
+ payload = {
9
+ orderId: order_id,
10
+ paymentAmount: amount,
11
+ tipAmount: tip_amount,
12
+ paymentMethodId: payment_method_id
13
+ }
14
+ payload[:staffId] = staff_id if staff_id
15
+ request(:post, "#{API_PREFIX}/businesses/#{config.business_id}/payments",
16
+ payload: payload, resource_type: 'Payment')
17
+ end
18
+
19
+ def fetch_payments(start_date:, end_date:, cursor: nil, limit: 100)
20
+ params = { startDate: format_date(start_date), endDate: format_date(end_date), limit: limit }
21
+ params[:cursor] = cursor if cursor
22
+ request(:get, endpoint('payments'), params: params)
23
+ end
24
+
25
+ def fetch_all_payments(start_date:, end_date:)
26
+ all_payments = []
27
+ cursor = nil
28
+
29
+ loop do
30
+ result = fetch_payments(start_date: start_date, end_date: end_date, cursor: cursor)
31
+ return all_payments unless result.is_a?(Hash)
32
+
33
+ payments = result['payments'] || []
34
+ all_payments.concat(payments)
35
+
36
+ cursor = result['cursor']
37
+ break if cursor.nil? || cursor.to_s.empty? || payments.empty?
38
+ end
39
+
40
+ all_payments
41
+ end
42
+
43
+ private
44
+
45
+ def format_date(value)
46
+ case value
47
+ when Date then value.iso8601
48
+ when Time then value.to_date.iso8601
49
+ else value.to_s
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'concurrent'
4
+
5
+ module LightspeedSandboxSimulator
6
+ module Services
7
+ module Lightspeed
8
+ class ServicesManager
9
+ def initialize(config: nil)
10
+ @config = config || LightspeedSandboxSimulator.configuration
11
+ @mutex = Mutex.new
12
+ end
13
+
14
+ def menu
15
+ thread_safe_memoize(:@menu) { MenuService.new(config: @config) }
16
+ end
17
+
18
+ def payment_methods
19
+ thread_safe_memoize(:@payment_methods) { PaymentMethodService.new(config: @config) }
20
+ end
21
+
22
+ def orders
23
+ thread_safe_memoize(:@orders) { OrderService.new(config: @config) }
24
+ end
25
+
26
+ def payments
27
+ thread_safe_memoize(:@payments) { PaymentService.new(config: @config) }
28
+ end
29
+
30
+ def business
31
+ thread_safe_memoize(:@business) { BusinessService.new(config: @config) }
32
+ end
33
+
34
+ private
35
+
36
+ def thread_safe_memoize(ivar_name)
37
+ value = instance_variable_get(ivar_name)
38
+ return value if value
39
+
40
+ @mutex.synchronize do
41
+ # :nocov:
42
+ value = instance_variable_get(ivar_name)
43
+ return value if value
44
+ # :nocov:
45
+
46
+ value = yield
47
+ instance_variable_set(ivar_name, value)
48
+ value
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'zeitwerk'
4
+ require 'logger'
5
+
6
+ module LightspeedSandboxSimulator
7
+ class Error < StandardError; end
8
+ class ConfigurationError < Error; end
9
+ class ApiError < Error; end
10
+
11
+ class << self
12
+ def configuration
13
+ @configuration ||= Configuration.new
14
+ end
15
+
16
+ def configure
17
+ yield(configuration)
18
+ end
19
+
20
+ def logger
21
+ configuration.logger
22
+ end
23
+ end
24
+ end
25
+
26
+ loader = Zeitwerk::Loader.for_gem
27
+ loader.setup
28
+ # :nocov:
29
+ loader.eager_load if ENV['RACK_ENV'] == 'production'
30
+ # :nocov:
metadata ADDED
@@ -0,0 +1,332 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lightspeed_sandbox_simulator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - dan1d
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: activerecord
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '8.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '8.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: concurrent-ruby
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '1.2'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.2'
40
+ - !ruby/object:Gem::Dependency
41
+ name: dotenv
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '3.0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: factory_bot
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '6.4'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '6.4'
68
+ - !ruby/object:Gem::Dependency
69
+ name: faker
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '3.2'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '3.2'
82
+ - !ruby/object:Gem::Dependency
83
+ name: httparty
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0.22'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '0.22'
96
+ - !ruby/object:Gem::Dependency
97
+ name: pg
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '1.5'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.5'
110
+ - !ruby/object:Gem::Dependency
111
+ name: thor
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.3'
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1.3'
124
+ - !ruby/object:Gem::Dependency
125
+ name: tzinfo
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '2.0'
131
+ type: :runtime
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '2.0'
138
+ - !ruby/object:Gem::Dependency
139
+ name: zeitwerk
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '2.6'
145
+ type: :runtime
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '2.6'
152
+ - !ruby/object:Gem::Dependency
153
+ name: database_cleaner-active_record
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '2.1'
159
+ type: :development
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '2.1'
166
+ - !ruby/object:Gem::Dependency
167
+ name: rspec
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '3.12'
173
+ type: :development
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '3.12'
180
+ - !ruby/object:Gem::Dependency
181
+ name: rubocop
182
+ requirement: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '1.50'
187
+ type: :development
188
+ prerelease: false
189
+ version_requirements: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: '1.50'
194
+ - !ruby/object:Gem::Dependency
195
+ name: rubocop-rspec
196
+ requirement: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - "~>"
199
+ - !ruby/object:Gem::Version
200
+ version: '3.0'
201
+ type: :development
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: '3.0'
208
+ - !ruby/object:Gem::Dependency
209
+ name: simplecov
210
+ requirement: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '0.22'
215
+ type: :development
216
+ prerelease: false
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '0.22'
222
+ - !ruby/object:Gem::Dependency
223
+ name: vcr
224
+ requirement: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - "~>"
227
+ - !ruby/object:Gem::Version
228
+ version: '6.1'
229
+ type: :development
230
+ prerelease: false
231
+ version_requirements: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - "~>"
234
+ - !ruby/object:Gem::Version
235
+ version: '6.1'
236
+ - !ruby/object:Gem::Dependency
237
+ name: webmock
238
+ requirement: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - "~>"
241
+ - !ruby/object:Gem::Version
242
+ version: '3.18'
243
+ type: :development
244
+ prerelease: false
245
+ version_requirements: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - "~>"
248
+ - !ruby/object:Gem::Version
249
+ version: '3.18'
250
+ description: A Ruby gem for simulating POS operations against the Lightspeed K-Series
251
+ API. Generates realistic orders, payments, and transaction data for testing.
252
+ email:
253
+ - dan1d@users.noreply.github.com
254
+ executables:
255
+ - simulate
256
+ extensions: []
257
+ extra_rdoc_files: []
258
+ files:
259
+ - Gemfile
260
+ - LICENSE
261
+ - README.md
262
+ - bin/simulate
263
+ - lib/lightspeed_sandbox_simulator.rb
264
+ - lib/lightspeed_sandbox_simulator/configuration.rb
265
+ - lib/lightspeed_sandbox_simulator/data/bar_nightclub/categories.json
266
+ - lib/lightspeed_sandbox_simulator/data/bar_nightclub/items.json
267
+ - lib/lightspeed_sandbox_simulator/data/bar_nightclub/tenders.json
268
+ - lib/lightspeed_sandbox_simulator/data/cafe_bakery/categories.json
269
+ - lib/lightspeed_sandbox_simulator/data/cafe_bakery/items.json
270
+ - lib/lightspeed_sandbox_simulator/data/cafe_bakery/tenders.json
271
+ - lib/lightspeed_sandbox_simulator/data/restaurant/categories.json
272
+ - lib/lightspeed_sandbox_simulator/data/restaurant/items.json
273
+ - lib/lightspeed_sandbox_simulator/data/restaurant/tenders.json
274
+ - lib/lightspeed_sandbox_simulator/data/retail_general/categories.json
275
+ - lib/lightspeed_sandbox_simulator/data/retail_general/items.json
276
+ - lib/lightspeed_sandbox_simulator/data/retail_general/tenders.json
277
+ - lib/lightspeed_sandbox_simulator/database.rb
278
+ - lib/lightspeed_sandbox_simulator/db/factories/api_requests.rb
279
+ - lib/lightspeed_sandbox_simulator/db/factories/business_types.rb
280
+ - lib/lightspeed_sandbox_simulator/db/factories/categories.rb
281
+ - lib/lightspeed_sandbox_simulator/db/factories/items.rb
282
+ - lib/lightspeed_sandbox_simulator/db/factories/simulated_orders.rb
283
+ - lib/lightspeed_sandbox_simulator/db/factories/simulated_payments.rb
284
+ - lib/lightspeed_sandbox_simulator/db/migrate/20260313000001_enable_pgcrypto.rb
285
+ - lib/lightspeed_sandbox_simulator/db/migrate/20260313000002_create_business_types.rb
286
+ - lib/lightspeed_sandbox_simulator/db/migrate/20260313000003_create_categories.rb
287
+ - lib/lightspeed_sandbox_simulator/db/migrate/20260313000004_create_items.rb
288
+ - lib/lightspeed_sandbox_simulator/db/migrate/20260313000005_create_simulated_orders.rb
289
+ - lib/lightspeed_sandbox_simulator/db/migrate/20260313000006_create_simulated_payments.rb
290
+ - lib/lightspeed_sandbox_simulator/db/migrate/20260313000007_create_api_requests.rb
291
+ - lib/lightspeed_sandbox_simulator/db/migrate/20260313000008_create_daily_summaries.rb
292
+ - lib/lightspeed_sandbox_simulator/generators/data_loader.rb
293
+ - lib/lightspeed_sandbox_simulator/generators/entity_generator.rb
294
+ - lib/lightspeed_sandbox_simulator/generators/order_generator.rb
295
+ - lib/lightspeed_sandbox_simulator/models/api_request.rb
296
+ - lib/lightspeed_sandbox_simulator/models/business_type.rb
297
+ - lib/lightspeed_sandbox_simulator/models/category.rb
298
+ - lib/lightspeed_sandbox_simulator/models/daily_summary.rb
299
+ - lib/lightspeed_sandbox_simulator/models/item.rb
300
+ - lib/lightspeed_sandbox_simulator/models/simulated_order.rb
301
+ - lib/lightspeed_sandbox_simulator/models/simulated_payment.rb
302
+ - lib/lightspeed_sandbox_simulator/seeder.rb
303
+ - lib/lightspeed_sandbox_simulator/services/base_service.rb
304
+ - lib/lightspeed_sandbox_simulator/services/lightspeed/business_service.rb
305
+ - lib/lightspeed_sandbox_simulator/services/lightspeed/menu_service.rb
306
+ - lib/lightspeed_sandbox_simulator/services/lightspeed/order_service.rb
307
+ - lib/lightspeed_sandbox_simulator/services/lightspeed/payment_method_service.rb
308
+ - lib/lightspeed_sandbox_simulator/services/lightspeed/payment_service.rb
309
+ - lib/lightspeed_sandbox_simulator/services/lightspeed/services_manager.rb
310
+ homepage: https://github.com/dan1d/lightspeed_sandbox_simulator
311
+ licenses:
312
+ - MIT
313
+ metadata:
314
+ rubygems_mfa_required: 'true'
315
+ rdoc_options: []
316
+ require_paths:
317
+ - lib
318
+ required_ruby_version: !ruby/object:Gem::Requirement
319
+ requirements:
320
+ - - ">="
321
+ - !ruby/object:Gem::Version
322
+ version: 3.2.0
323
+ required_rubygems_version: !ruby/object:Gem::Requirement
324
+ requirements:
325
+ - - ">="
326
+ - !ruby/object:Gem::Version
327
+ version: '0'
328
+ requirements: []
329
+ rubygems_version: 3.6.9
330
+ specification_version: 4
331
+ summary: Lightspeed K-Series POS sandbox data simulator
332
+ test_files: []