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.
- checksums.yaml +7 -0
- data/Gemfile +10 -0
- data/LICENSE +21 -0
- data/README.md +380 -0
- data/bin/simulate +309 -0
- data/lib/epos_now_sandbox_simulator/configuration.rb +173 -0
- data/lib/epos_now_sandbox_simulator/data/bar_nightclub/categories.json +9 -0
- data/lib/epos_now_sandbox_simulator/data/bar_nightclub/items.json +26 -0
- data/lib/epos_now_sandbox_simulator/data/bar_nightclub/tenders.json +8 -0
- data/lib/epos_now_sandbox_simulator/data/cafe_bakery/categories.json +9 -0
- data/lib/epos_now_sandbox_simulator/data/cafe_bakery/items.json +28 -0
- data/lib/epos_now_sandbox_simulator/data/cafe_bakery/tenders.json +8 -0
- data/lib/epos_now_sandbox_simulator/data/restaurant/categories.json +9 -0
- data/lib/epos_now_sandbox_simulator/data/restaurant/items.json +29 -0
- data/lib/epos_now_sandbox_simulator/data/restaurant/tenders.json +9 -0
- data/lib/epos_now_sandbox_simulator/data/retail_general/categories.json +9 -0
- data/lib/epos_now_sandbox_simulator/data/retail_general/items.json +17 -0
- data/lib/epos_now_sandbox_simulator/data/retail_general/tenders.json +8 -0
- data/lib/epos_now_sandbox_simulator/database.rb +136 -0
- data/lib/epos_now_sandbox_simulator/db/factories/api_requests.rb +13 -0
- data/lib/epos_now_sandbox_simulator/db/factories/business_types.rb +34 -0
- data/lib/epos_now_sandbox_simulator/db/factories/categories.rb +10 -0
- data/lib/epos_now_sandbox_simulator/db/factories/items.rb +12 -0
- data/lib/epos_now_sandbox_simulator/db/factories/simulated_orders.rb +25 -0
- data/lib/epos_now_sandbox_simulator/db/factories/simulated_payments.rb +14 -0
- data/lib/epos_now_sandbox_simulator/db/migrate/20260312000001_enable_pgcrypto.rb +7 -0
- data/lib/epos_now_sandbox_simulator/db/migrate/20260312000002_create_business_types.rb +16 -0
- data/lib/epos_now_sandbox_simulator/db/migrate/20260312000003_create_categories.rb +16 -0
- data/lib/epos_now_sandbox_simulator/db/migrate/20260312000004_create_items.rb +19 -0
- data/lib/epos_now_sandbox_simulator/db/migrate/20260312000005_create_simulated_orders.rb +27 -0
- data/lib/epos_now_sandbox_simulator/db/migrate/20260312000006_create_simulated_payments.rb +22 -0
- data/lib/epos_now_sandbox_simulator/db/migrate/20260312000007_create_api_requests.rb +22 -0
- data/lib/epos_now_sandbox_simulator/db/migrate/20260312000008_create_daily_summaries.rb +21 -0
- data/lib/epos_now_sandbox_simulator/generators/data_loader.rb +100 -0
- data/lib/epos_now_sandbox_simulator/generators/entity_generator.rb +103 -0
- data/lib/epos_now_sandbox_simulator/generators/order_generator.rb +336 -0
- data/lib/epos_now_sandbox_simulator/models/api_request.rb +16 -0
- data/lib/epos_now_sandbox_simulator/models/business_type.rb +16 -0
- data/lib/epos_now_sandbox_simulator/models/category.rb +18 -0
- data/lib/epos_now_sandbox_simulator/models/daily_summary.rb +43 -0
- data/lib/epos_now_sandbox_simulator/models/item.rb +20 -0
- data/lib/epos_now_sandbox_simulator/models/simulated_order.rb +21 -0
- data/lib/epos_now_sandbox_simulator/models/simulated_payment.rb +17 -0
- data/lib/epos_now_sandbox_simulator/seeder.rb +119 -0
- data/lib/epos_now_sandbox_simulator/services/base_service.rb +248 -0
- data/lib/epos_now_sandbox_simulator/services/epos_now/inventory_service.rb +178 -0
- data/lib/epos_now_sandbox_simulator/services/epos_now/services_manager.rb +56 -0
- data/lib/epos_now_sandbox_simulator/services/epos_now/tax_service.rb +45 -0
- data/lib/epos_now_sandbox_simulator/services/epos_now/tender_service.rb +90 -0
- data/lib/epos_now_sandbox_simulator/services/epos_now/transaction_service.rb +171 -0
- data/lib/epos_now_sandbox_simulator.rb +49 -0
- 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: []
|