epos_now_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 (52) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +10 -0
  3. data/LICENSE +21 -0
  4. data/README.md +380 -0
  5. data/bin/simulate +309 -0
  6. data/lib/epos_now_sandbox_simulator/configuration.rb +173 -0
  7. data/lib/epos_now_sandbox_simulator/data/bar_nightclub/categories.json +9 -0
  8. data/lib/epos_now_sandbox_simulator/data/bar_nightclub/items.json +26 -0
  9. data/lib/epos_now_sandbox_simulator/data/bar_nightclub/tenders.json +8 -0
  10. data/lib/epos_now_sandbox_simulator/data/cafe_bakery/categories.json +9 -0
  11. data/lib/epos_now_sandbox_simulator/data/cafe_bakery/items.json +28 -0
  12. data/lib/epos_now_sandbox_simulator/data/cafe_bakery/tenders.json +8 -0
  13. data/lib/epos_now_sandbox_simulator/data/restaurant/categories.json +9 -0
  14. data/lib/epos_now_sandbox_simulator/data/restaurant/items.json +29 -0
  15. data/lib/epos_now_sandbox_simulator/data/restaurant/tenders.json +9 -0
  16. data/lib/epos_now_sandbox_simulator/data/retail_general/categories.json +9 -0
  17. data/lib/epos_now_sandbox_simulator/data/retail_general/items.json +17 -0
  18. data/lib/epos_now_sandbox_simulator/data/retail_general/tenders.json +8 -0
  19. data/lib/epos_now_sandbox_simulator/database.rb +136 -0
  20. data/lib/epos_now_sandbox_simulator/db/factories/api_requests.rb +13 -0
  21. data/lib/epos_now_sandbox_simulator/db/factories/business_types.rb +34 -0
  22. data/lib/epos_now_sandbox_simulator/db/factories/categories.rb +10 -0
  23. data/lib/epos_now_sandbox_simulator/db/factories/items.rb +12 -0
  24. data/lib/epos_now_sandbox_simulator/db/factories/simulated_orders.rb +25 -0
  25. data/lib/epos_now_sandbox_simulator/db/factories/simulated_payments.rb +14 -0
  26. data/lib/epos_now_sandbox_simulator/db/migrate/20260312000001_enable_pgcrypto.rb +7 -0
  27. data/lib/epos_now_sandbox_simulator/db/migrate/20260312000002_create_business_types.rb +16 -0
  28. data/lib/epos_now_sandbox_simulator/db/migrate/20260312000003_create_categories.rb +16 -0
  29. data/lib/epos_now_sandbox_simulator/db/migrate/20260312000004_create_items.rb +19 -0
  30. data/lib/epos_now_sandbox_simulator/db/migrate/20260312000005_create_simulated_orders.rb +27 -0
  31. data/lib/epos_now_sandbox_simulator/db/migrate/20260312000006_create_simulated_payments.rb +22 -0
  32. data/lib/epos_now_sandbox_simulator/db/migrate/20260312000007_create_api_requests.rb +22 -0
  33. data/lib/epos_now_sandbox_simulator/db/migrate/20260312000008_create_daily_summaries.rb +21 -0
  34. data/lib/epos_now_sandbox_simulator/generators/data_loader.rb +100 -0
  35. data/lib/epos_now_sandbox_simulator/generators/entity_generator.rb +103 -0
  36. data/lib/epos_now_sandbox_simulator/generators/order_generator.rb +336 -0
  37. data/lib/epos_now_sandbox_simulator/models/api_request.rb +16 -0
  38. data/lib/epos_now_sandbox_simulator/models/business_type.rb +16 -0
  39. data/lib/epos_now_sandbox_simulator/models/category.rb +18 -0
  40. data/lib/epos_now_sandbox_simulator/models/daily_summary.rb +43 -0
  41. data/lib/epos_now_sandbox_simulator/models/item.rb +20 -0
  42. data/lib/epos_now_sandbox_simulator/models/simulated_order.rb +21 -0
  43. data/lib/epos_now_sandbox_simulator/models/simulated_payment.rb +17 -0
  44. data/lib/epos_now_sandbox_simulator/seeder.rb +119 -0
  45. data/lib/epos_now_sandbox_simulator/services/base_service.rb +248 -0
  46. data/lib/epos_now_sandbox_simulator/services/epos_now/inventory_service.rb +178 -0
  47. data/lib/epos_now_sandbox_simulator/services/epos_now/services_manager.rb +56 -0
  48. data/lib/epos_now_sandbox_simulator/services/epos_now/tax_service.rb +45 -0
  49. data/lib/epos_now_sandbox_simulator/services/epos_now/tender_service.rb +90 -0
  50. data/lib/epos_now_sandbox_simulator/services/epos_now/transaction_service.rb +171 -0
  51. data/lib/epos_now_sandbox_simulator.rb +49 -0
  52. metadata +334 -0
@@ -0,0 +1,171 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EposNowSandboxSimulator
4
+ module Services
5
+ module EposNow
6
+ # Manages transactions in Epos Now via V4 API.
7
+ #
8
+ # V4 endpoints:
9
+ # GET /api/v4/Transaction - list (params: status, page)
10
+ # POST /api/v4/Transaction - create
11
+ # GET /api/v4/Transaction/{id} - get by id
12
+ # PUT /api/v4/Transaction/{id} - update
13
+ # DELETE /api/v4/Transaction/{id} - delete
14
+ # GET /api/v4/Transaction/GetByDate - filter by date range
15
+ # GET /api/v4/Transaction/GetLatest - latest transactions
16
+ # POST /api/v4/Transaction/Validate - validate without saving
17
+ #
18
+ # V4 Transaction model:
19
+ # Id, CustomerId, StaffId, TableId, DeviceId, DateTime,
20
+ # StatusId, Barcode, ServiceType, TotalAmount, ServiceCharge,
21
+ # Gratuity, DiscountValue, DiscountReasonId, ReferenceCode,
22
+ # TransactionItems[], Tenders[], Taxes[]
23
+ #
24
+ # V4 ServiceType values (replaces V2 EatOut):
25
+ # 0 = EatIn, 1 = Takeaway, 2 = Delivery
26
+ #
27
+ # V4 key difference: Tenders are embedded in Transaction creation,
28
+ # not separate CRUD entities.
29
+ class TransactionService < BaseService
30
+ # ServiceType values (V4)
31
+ EAT_IN = 0
32
+ TAKEAWAY = 1
33
+ DELIVERY = 2
34
+
35
+ # Fetch transactions (paginated)
36
+ # @param page [Integer, nil] Page number
37
+ # @param status [Integer, nil] Status filter
38
+ # @return [Array<Hash>] Transactions
39
+ def fetch_transactions(page: nil, status: nil)
40
+ if page
41
+ params = { page: page }
42
+ params[:status] = status if status
43
+ request(:get, endpoint("Transaction"), params: params, resource_type: "Transaction") || []
44
+ else
45
+ fetch_all_pages("Transaction")
46
+ end
47
+ end
48
+
49
+ # Fetch transactions by date range (V4-specific endpoint)
50
+ # @param start_date [String, Date] Start date (ISO 8601)
51
+ # @param end_date [String, Date] End date (ISO 8601)
52
+ # @param device_id [Integer, nil] Filter by device
53
+ # @param status [Integer, nil] Filter by status
54
+ # @return [Array<Hash>] Transactions in range
55
+ def fetch_transactions_by_date(start_date:, end_date:, device_id: nil, status: nil)
56
+ params = {
57
+ startDate: start_date.to_s,
58
+ endDate: end_date.to_s
59
+ }
60
+ params[:deviceId] = device_id if device_id
61
+ params[:status] = status if status
62
+
63
+ all_records = []
64
+ page = 1
65
+
66
+ loop do
67
+ page_params = params.merge(page: page)
68
+ results = request(:get, endpoint("Transaction/GetByDate"), params: page_params, resource_type: "Transaction")
69
+ records = results.is_a?(Array) ? results : []
70
+ break if records.empty?
71
+
72
+ all_records.concat(records)
73
+ break if records.size < 200
74
+
75
+ page += 1
76
+ end
77
+
78
+ all_records
79
+ end
80
+
81
+ # Fetch latest transactions
82
+ # @param device_id [Integer, nil] Filter by device
83
+ # @param status [Integer, nil] Filter by status
84
+ # @return [Array<Hash>] Latest transactions
85
+ def fetch_latest_transactions(device_id: nil, status: nil)
86
+ params = {}
87
+ params[:deviceId] = device_id if device_id
88
+ params[:status] = status if status
89
+
90
+ request(:get, endpoint("Transaction/GetLatest"), params: params, resource_type: "Transaction") || []
91
+ end
92
+
93
+ # Get a single transaction by ID
94
+ # @param id [Integer] Transaction ID
95
+ # @param lock [Boolean] Lock the transaction
96
+ # @return [Hash] Transaction
97
+ def get_transaction(id, lock: false)
98
+ path = lock ? "Transaction/#{id}/true" : "Transaction/#{id}/false"
99
+ request(:get, endpoint(path), resource_type: "Transaction", resource_id: id.to_s)
100
+ end
101
+
102
+ # Create a complete transaction with items and tenders (V4 style)
103
+ #
104
+ # In V4, TransactionItems and Tenders are embedded in the
105
+ # Transaction creation payload — no separate API calls needed.
106
+ #
107
+ # @param items [Array<Hash>] Array of {product_id:, quantity:, unit_price:}
108
+ # @param tenders [Array<Hash>] Array of {tender_type_id:, amount:, change_given:}
109
+ # @param service_type [Integer] 0=EatIn, 1=Takeaway, 2=Delivery
110
+ # @param staff_id [Integer, nil] Staff member
111
+ # @param customer_id [Integer, nil] Customer
112
+ # @param gratuity [Float] Tip amount
113
+ # @param discount_value [Float] Discount amount
114
+ # @param service_charge [Float] Service charge amount
115
+ # @return [Hash] Created transaction with embedded items and tenders
116
+ def create_transaction(items:, tenders:, service_type: EAT_IN, staff_id: nil,
117
+ customer_id: nil, gratuity: 0.0, discount_value: 0.0, service_charge: 0.0)
118
+ # Build V4 TransactionItems
119
+ transaction_items = items.map do |item|
120
+ ti = {
121
+ "ProductId" => item[:product_id],
122
+ "Quantity" => item[:quantity] || 1
123
+ }
124
+ ti["UnitPrice"] = item[:unit_price] if item[:unit_price]
125
+ ti["DiscountAmount"] = item[:discount] if item[:discount]&.positive?
126
+ ti["Notes"] = item[:notes] if item[:notes]
127
+ ti
128
+ end
129
+
130
+ # Build V4 Tenders
131
+ transaction_tenders = tenders.map do |tender|
132
+ {
133
+ "TenderTypeId" => tender[:tender_type_id],
134
+ "Amount" => tender[:amount],
135
+ "ChangeGiven" => tender[:change_given] || 0.0
136
+ }
137
+ end
138
+
139
+ payload = {
140
+ "ServiceType" => service_type,
141
+ "Gratuity" => gratuity,
142
+ "DiscountValue" => discount_value,
143
+ "ServiceCharge" => service_charge,
144
+ "TransactionItems" => transaction_items,
145
+ "Tenders" => transaction_tenders
146
+ }
147
+ payload["StaffId"] = staff_id if staff_id
148
+ payload["CustomerId"] = customer_id if customer_id
149
+
150
+ logger.info "Creating transaction (ServiceType=#{service_type}, #{items.size} items, #{tenders.size} tenders)"
151
+ result = request(:post, endpoint("Transaction"), payload: payload, resource_type: "Transaction")
152
+ logger.info "Created transaction ID: #{result["Id"]}"
153
+ result
154
+ end
155
+
156
+ # Delete a transaction (V4: uses request body)
157
+ # @param id [Integer] Transaction ID
158
+ def delete_transaction(id)
159
+ request(:delete, endpoint("Transaction/#{id}"), resource_type: "Transaction", resource_id: id.to_s)
160
+ end
161
+
162
+ # Validate a transaction without saving
163
+ # @param payload [Hash] Transaction payload
164
+ # @return [Hash] Validation result
165
+ def validate_transaction(payload)
166
+ request(:post, endpoint("Transaction/Validate"), payload: payload, resource_type: "Transaction")
167
+ end
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "zeitwerk"
4
+ require "logger"
5
+ require "json"
6
+ require "rest-client"
7
+ require "dotenv"
8
+
9
+ # Load environment variables
10
+ Dotenv.load
11
+
12
+ module EposNowSandboxSimulator
13
+ VERSION = "0.1.0"
14
+
15
+ class Error < StandardError; end
16
+ class ConfigurationError < Error; end
17
+ class ApiError < Error; end
18
+
19
+ class << self
20
+ attr_writer :configuration
21
+
22
+ def configuration
23
+ @configuration ||= Configuration.new
24
+ end
25
+
26
+ def configure
27
+ yield(configuration)
28
+ end
29
+
30
+ def logger
31
+ configuration.logger
32
+ end
33
+
34
+ def root
35
+ File.expand_path("..", __dir__)
36
+ end
37
+ end
38
+ end
39
+
40
+ # Set up Zeitwerk autoloader
41
+ loader = Zeitwerk::Loader.for_gem
42
+ # Migrations and factories follow ActiveRecord conventions, not Zeitwerk naming
43
+ loader.ignore(File.expand_path("epos_now_sandbox_simulator/db", __dir__))
44
+ loader.setup
45
+
46
+ # :nocov:
47
+ # Eager load in production
48
+ loader.eager_load if ENV["RACK_ENV"] == "production"
49
+ # :nocov:
metadata ADDED
@@ -0,0 +1,334 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: epos_now_sandbox_simulator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - dan1d
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-03-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '8.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '8.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: concurrent-ruby
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: dotenv
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: factory_bot
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '6.4'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '6.4'
69
+ - !ruby/object:Gem::Dependency
70
+ name: faker
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.2'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pg
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.5'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.5'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rest-client
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.1'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.1'
111
+ - !ruby/object:Gem::Dependency
112
+ name: thor
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.3'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.3'
125
+ - !ruby/object:Gem::Dependency
126
+ name: tzinfo
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '2.0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '2.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: zeitwerk
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '2.6'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '2.6'
153
+ - !ruby/object:Gem::Dependency
154
+ name: database_cleaner-active_record
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '2.1'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '2.1'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rspec
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '3.12'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '3.12'
181
+ - !ruby/object:Gem::Dependency
182
+ name: rubocop
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '1.50'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '1.50'
195
+ - !ruby/object:Gem::Dependency
196
+ name: rubocop-rspec
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '3.0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '3.0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: simplecov
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: '0.22'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: '0.22'
223
+ - !ruby/object:Gem::Dependency
224
+ name: vcr
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '6.1'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '6.1'
237
+ - !ruby/object:Gem::Dependency
238
+ name: webmock
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - "~>"
242
+ - !ruby/object:Gem::Version
243
+ version: '3.18'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - "~>"
249
+ - !ruby/object:Gem::Version
250
+ version: '3.18'
251
+ description: A Ruby gem for simulating Point of Sale operations against the Epos Now
252
+ API. Generates realistic orders, payments, and transaction data for testing.
253
+ email:
254
+ - dan1d@users.noreply.github.com
255
+ executables:
256
+ - simulate
257
+ extensions: []
258
+ extra_rdoc_files: []
259
+ files:
260
+ - Gemfile
261
+ - LICENSE
262
+ - README.md
263
+ - bin/simulate
264
+ - lib/epos_now_sandbox_simulator.rb
265
+ - lib/epos_now_sandbox_simulator/configuration.rb
266
+ - lib/epos_now_sandbox_simulator/data/bar_nightclub/categories.json
267
+ - lib/epos_now_sandbox_simulator/data/bar_nightclub/items.json
268
+ - lib/epos_now_sandbox_simulator/data/bar_nightclub/tenders.json
269
+ - lib/epos_now_sandbox_simulator/data/cafe_bakery/categories.json
270
+ - lib/epos_now_sandbox_simulator/data/cafe_bakery/items.json
271
+ - lib/epos_now_sandbox_simulator/data/cafe_bakery/tenders.json
272
+ - lib/epos_now_sandbox_simulator/data/restaurant/categories.json
273
+ - lib/epos_now_sandbox_simulator/data/restaurant/items.json
274
+ - lib/epos_now_sandbox_simulator/data/restaurant/tenders.json
275
+ - lib/epos_now_sandbox_simulator/data/retail_general/categories.json
276
+ - lib/epos_now_sandbox_simulator/data/retail_general/items.json
277
+ - lib/epos_now_sandbox_simulator/data/retail_general/tenders.json
278
+ - lib/epos_now_sandbox_simulator/database.rb
279
+ - lib/epos_now_sandbox_simulator/db/factories/api_requests.rb
280
+ - lib/epos_now_sandbox_simulator/db/factories/business_types.rb
281
+ - lib/epos_now_sandbox_simulator/db/factories/categories.rb
282
+ - lib/epos_now_sandbox_simulator/db/factories/items.rb
283
+ - lib/epos_now_sandbox_simulator/db/factories/simulated_orders.rb
284
+ - lib/epos_now_sandbox_simulator/db/factories/simulated_payments.rb
285
+ - lib/epos_now_sandbox_simulator/db/migrate/20260312000001_enable_pgcrypto.rb
286
+ - lib/epos_now_sandbox_simulator/db/migrate/20260312000002_create_business_types.rb
287
+ - lib/epos_now_sandbox_simulator/db/migrate/20260312000003_create_categories.rb
288
+ - lib/epos_now_sandbox_simulator/db/migrate/20260312000004_create_items.rb
289
+ - lib/epos_now_sandbox_simulator/db/migrate/20260312000005_create_simulated_orders.rb
290
+ - lib/epos_now_sandbox_simulator/db/migrate/20260312000006_create_simulated_payments.rb
291
+ - lib/epos_now_sandbox_simulator/db/migrate/20260312000007_create_api_requests.rb
292
+ - lib/epos_now_sandbox_simulator/db/migrate/20260312000008_create_daily_summaries.rb
293
+ - lib/epos_now_sandbox_simulator/generators/data_loader.rb
294
+ - lib/epos_now_sandbox_simulator/generators/entity_generator.rb
295
+ - lib/epos_now_sandbox_simulator/generators/order_generator.rb
296
+ - lib/epos_now_sandbox_simulator/models/api_request.rb
297
+ - lib/epos_now_sandbox_simulator/models/business_type.rb
298
+ - lib/epos_now_sandbox_simulator/models/category.rb
299
+ - lib/epos_now_sandbox_simulator/models/daily_summary.rb
300
+ - lib/epos_now_sandbox_simulator/models/item.rb
301
+ - lib/epos_now_sandbox_simulator/models/simulated_order.rb
302
+ - lib/epos_now_sandbox_simulator/models/simulated_payment.rb
303
+ - lib/epos_now_sandbox_simulator/seeder.rb
304
+ - lib/epos_now_sandbox_simulator/services/base_service.rb
305
+ - lib/epos_now_sandbox_simulator/services/epos_now/inventory_service.rb
306
+ - lib/epos_now_sandbox_simulator/services/epos_now/services_manager.rb
307
+ - lib/epos_now_sandbox_simulator/services/epos_now/tax_service.rb
308
+ - lib/epos_now_sandbox_simulator/services/epos_now/tender_service.rb
309
+ - lib/epos_now_sandbox_simulator/services/epos_now/transaction_service.rb
310
+ homepage: https://github.com/dan1d/epos_now_sandbox_simulator
311
+ licenses:
312
+ - MIT
313
+ metadata:
314
+ rubygems_mfa_required: 'true'
315
+ post_install_message:
316
+ rdoc_options: []
317
+ require_paths:
318
+ - lib
319
+ required_ruby_version: !ruby/object:Gem::Requirement
320
+ requirements:
321
+ - - ">="
322
+ - !ruby/object:Gem::Version
323
+ version: 3.2.0
324
+ required_rubygems_version: !ruby/object:Gem::Requirement
325
+ requirements:
326
+ - - ">="
327
+ - !ruby/object:Gem::Version
328
+ version: '0'
329
+ requirements: []
330
+ rubygems_version: 3.4.10
331
+ signing_key:
332
+ specification_version: 4
333
+ summary: Epos Now POS sandbox data simulator
334
+ test_files: []