perka 1.4 → 1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/lib/perka/client_api.rb +56 -66
- data/lib/perka/model/coupon.rb +33 -32
- data/lib/perka/model/merchant.rb +27 -25
- data/lib/perka/model/program.rb +15 -14
- data/lib/perka/model/program_tier.rb +11 -10
- data/lib/perka/version.rb +1 -1
- data/lib/perka_fast.rb +9 -9
- data/spec/api_integrator_spec.rb +48 -5
- metadata +4 -4
data/Rakefile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env rake
|
2
2
|
require 'rake/testtask'
|
3
3
|
|
4
|
-
API_SRC = "https://getperka.com/api/2/describe"
|
4
|
+
API_SRC = "https://sandbox.getperka.com/api/2/describe"
|
5
5
|
SRC_DIR = "#{File.dirname(__FILE__)}/src"
|
6
6
|
OUTPUT_DIR = "#{File.dirname(__FILE__)}/target"
|
7
7
|
FLATPACK_OUTPUT_DIR = "#{OUTPUT_DIR}/generated"
|
data/lib/perka/client_api.rb
CHANGED
@@ -11,22 +11,30 @@ module Perka
|
|
11
11
|
to_return
|
12
12
|
end
|
13
13
|
|
14
|
-
#
|
14
|
+
# Retrieves the customer associated with the given uuid. The response will include
|
15
|
+
# reward and tierTraversal information for the merchant associated with the
|
16
|
+
# logged in clerk or merchantUser.
|
17
|
+
def customer_uuid_get(uuid)
|
18
|
+
to_return = Flatpack::Client::FlatpackRequest.new(self, "GET", "/api/2/customer/{uuid}", uuid)
|
19
|
+
to_return
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns the current customer's PointsActivity status across all merchants
|
15
23
|
# with a points-based loyalty system.
|
16
24
|
def customer_points_get
|
17
25
|
to_return = Flatpack::Client::FlatpackRequest.new(self, "GET", "/api/2/customer/points")
|
18
26
|
to_return
|
19
27
|
end
|
20
28
|
|
21
|
-
# Performs a deep serialization of an entity. This endpoint is intended to provide
|
22
|
-
# supplementary one-to-many relationship data that is not normally serialized
|
29
|
+
# Performs a deep serialization of an entity. This endpoint is intended to provide
|
30
|
+
# supplementary one-to-many relationship data that is not normally serialized
|
23
31
|
# to keep payload sizes manageable.
|
24
32
|
def describe_type_uuid_get(type, uuid)
|
25
33
|
to_return = DescribeTypeUuidGet.new(self, type, uuid)
|
26
34
|
to_return
|
27
35
|
end
|
28
36
|
|
29
|
-
# Provides a machine-readable description of an entity type per the logged-in
|
37
|
+
# Provides a machine-readable description of an entity type per the logged-in
|
30
38
|
# role.
|
31
39
|
def describe_type_get(type)
|
32
40
|
to_return = Flatpack::Client::FlatpackRequest.new(self, "GET", "/api/2/describe/{type}", type)
|
@@ -39,7 +47,7 @@ module Perka
|
|
39
47
|
to_return
|
40
48
|
end
|
41
49
|
|
42
|
-
# A diagnostic endpoint to extract the information from an OAuth2 authorization
|
50
|
+
# A diagnostic endpoint to extract the information from an OAuth2 authorization
|
43
51
|
# code, login token, session token, or refresh token.
|
44
52
|
def describe_token_get
|
45
53
|
to_return = DescribeTokenGet.new(self)
|
@@ -52,9 +60,9 @@ module Perka
|
|
52
60
|
to_return
|
53
61
|
end
|
54
62
|
|
55
|
-
# Add or replace an annotation applied to a persistent entity. If the value
|
56
|
-
# of <entityReference payloadName='entityAnnotation'> EntityAnnotation</entityReference>
|
57
|
-
# is missing or <code>null</code>, the annotation will be removed. This method
|
63
|
+
# Add or replace an annotation applied to a persistent entity. If the value
|
64
|
+
# of <entityReference payloadName='entityAnnotation'> EntityAnnotation</entityReference>
|
65
|
+
# is missing or <code>null</code>, the annotation will be removed. This method
|
58
66
|
# will return the previously-stored annotation, if any.
|
59
67
|
def annotation_put(entity)
|
60
68
|
to_return = Flatpack::Client::FlatpackRequest.new(self, "PUT", "/api/2/annotation")
|
@@ -62,20 +70,20 @@ module Perka
|
|
62
70
|
to_return
|
63
71
|
end
|
64
72
|
|
65
|
-
# Creates a new customer associated with the current <entityReference payloadName='integratorUser'>
|
66
|
-
# IntegratorUser</entityReference>, or returns an existing customer if a matching
|
67
|
-
# customer already exists. The given <entityReference payloadName='userCredentials'>
|
68
|
-
# UserCredentials</entityReference> must include an email, phone, or both. The
|
69
|
-
# following rules will be used to determine if a new customer should be created
|
70
|
-
# <ul> <li>If a customer exists with a matching <b>confirmed</b> email address
|
71
|
-
# or <b>confirmed</b> phone number, that customer will be returned.</li> <li>If
|
72
|
-
# a customer exists that is associated with the current <entityReference payloadName='integratorUser'>
|
73
|
-
# IntegratorUser</entityReference>, and has a matching <b>unconfirmed</b> email
|
74
|
-
# address or <b>unconfirmed</b> phone number, that customer will be returned.
|
75
|
-
# The email check will happen first, and will short-circuit the phone check
|
76
|
-
# if a match is found.</li> <li>Otherwise, a new customer will be created and
|
77
|
-
# associated with your <entityReference payloadName='integratorUser'> IntegratorUser</entityReference>.
|
78
|
-
# The given phone number and email address will be stored as unconfirmed values.
|
73
|
+
# Creates a new customer associated with the current <entityReference payloadName='integratorUser'>
|
74
|
+
# IntegratorUser</entityReference>, or returns an existing customer if a matching
|
75
|
+
# customer already exists. The given <entityReference payloadName='userCredentials'>
|
76
|
+
# UserCredentials</entityReference> must include an email, phone, or both. The
|
77
|
+
# following rules will be used to determine if a new customer should be created
|
78
|
+
# <ul> <li>If a customer exists with a matching <b>confirmed</b> email address
|
79
|
+
# or <b>confirmed</b> phone number, that customer will be returned.</li> <li>If
|
80
|
+
# a customer exists that is associated with the current <entityReference payloadName='integratorUser'>
|
81
|
+
# IntegratorUser</entityReference>, and has a matching <b>unconfirmed</b> email
|
82
|
+
# address or <b>unconfirmed</b> phone number, that customer will be returned.
|
83
|
+
# The email check will happen first, and will short-circuit the phone check
|
84
|
+
# if a match is found.</li> <li>Otherwise, a new customer will be created and
|
85
|
+
# associated with your <entityReference payloadName='integratorUser'> IntegratorUser</entityReference>.
|
86
|
+
# The given phone number and email address will be stored as unconfirmed values.
|
79
87
|
# </ul>
|
80
88
|
def integrator_customer_post(entity)
|
81
89
|
to_return = Flatpack::Client::FlatpackRequest.new(self, "POST", "/api/2/integrator/customer")
|
@@ -89,7 +97,7 @@ module Perka
|
|
89
97
|
to_return
|
90
98
|
end
|
91
99
|
|
92
|
-
# Completely destroys all customer data associated with the current integrator
|
100
|
+
# Completely destroys all customer data associated with the current integrator
|
93
101
|
# user. This endpoint is only available in the sandbox environment.
|
94
102
|
def integrator_destroy_delete
|
95
103
|
to_return = Flatpack::Client::FlatpackRequest.new(self, "DELETE", "/api/2/integrator/destroy")
|
@@ -108,7 +116,7 @@ module Perka
|
|
108
116
|
to_return
|
109
117
|
end
|
110
118
|
|
111
|
-
# Updates an existing <entityReference payloadName='customer'> Customer</entityReference>
|
119
|
+
# Updates an existing <entityReference payloadName='customer'> Customer</entityReference>
|
112
120
|
# manageed by the current <entityReference payloadName='integratorUser'> IntegratorUser</entityReference>.
|
113
121
|
def integrator_customer_put(entity)
|
114
122
|
to_return = Flatpack::Client::FlatpackRequest.new(self, "PUT", "/api/2/integrator/customer")
|
@@ -116,33 +124,28 @@ module Perka
|
|
116
124
|
to_return
|
117
125
|
end
|
118
126
|
|
119
|
-
# Returns a sparse payload of all live <entityReference payloadName='merchantLocation'>
|
120
|
-
# locations</entityReference> and their associated <entityReference payloadName='merchant'>
|
127
|
+
# Returns a sparse payload of all live <entityReference payloadName='merchantLocation'>
|
128
|
+
# locations</entityReference> and their associated <entityReference payloadName='merchant'>
|
121
129
|
# merchants</entityReference>.
|
122
130
|
def merchant_locations_get
|
123
131
|
to_return = Flatpack::Client::FlatpackRequest.new(self, "GET", "/api/2/merchant/locations")
|
124
132
|
to_return
|
125
133
|
end
|
126
134
|
|
127
|
-
#
|
128
|
-
#
|
129
|
-
|
130
|
-
|
131
|
-
to_return
|
132
|
-
end
|
133
|
-
|
134
|
-
# Reward a Customer. This method will implicitly create a <entityReference payloadName='visit'>
|
135
|
-
# Visit</entityReference> which will be returned.
|
135
|
+
# Rewards a Customer. This method will implicitly create a <entityReference
|
136
|
+
# payloadName='visit'> Visit</entityReference> which will be returned. The response
|
137
|
+
# will also include any s manipulated by this visit, as well as the customer's
|
138
|
+
# most recent @{link TierTraversal} at the associated @{link Merchant}
|
136
139
|
def customer_reward_put(entity)
|
137
140
|
to_return = Flatpack::Client::FlatpackRequest.new(self, "PUT", "/api/2/customer/reward")
|
138
141
|
to_return.entity = entity
|
139
142
|
to_return
|
140
143
|
end
|
141
144
|
|
142
|
-
# Rewrites the history of a customer's latest validated visit to a merchant.
|
143
|
-
# The <entityReference payloadName='abstractRewardConfirmation'> AbstractRewardConfirmation</entityReference>
|
144
|
-
# instances associated with the <entityReference payloadName='visitConfirmation'>
|
145
|
-
# VisitConfirmation</entityReference> should reflect the desired state of the
|
145
|
+
# Rewrites the history of a customer's latest validated visit to a merchant.
|
146
|
+
# The <entityReference payloadName='abstractRewardConfirmation'> AbstractRewardConfirmation</entityReference>
|
147
|
+
# instances associated with the <entityReference payloadName='visitConfirmation'>
|
148
|
+
# VisitConfirmation</entityReference> should reflect the desired state of the
|
146
149
|
# Visit. <p> This method will return the updated Visit.
|
147
150
|
def customer_visit_amend_put(entity)
|
148
151
|
to_return = Flatpack::Client::FlatpackRequest.new(self, "PUT", "/api/2/customer/visit/amend")
|
@@ -150,9 +153,9 @@ module Perka
|
|
150
153
|
to_return
|
151
154
|
end
|
152
155
|
|
153
|
-
# Creates a new outstanding visit for the current customer at the given location.
|
154
|
-
# If the customer has no active Rewards at the associated merchant, a new Reward
|
155
|
-
# will be created for each of the merchant's programs. Information about the
|
156
|
+
# Creates a new outstanding visit for the current customer at the given location.
|
157
|
+
# If the customer has no active Rewards at the associated merchant, a new Reward
|
158
|
+
# will be created for each of the merchant's programs. Information about the
|
156
159
|
# visit, and all active rewards for the associated merchant will be returned.
|
157
160
|
def customer_visit_post(entity)
|
158
161
|
to_return = Flatpack::Client::FlatpackRequest.new(self, "POST", "/api/2/customer/visit")
|
@@ -160,17 +163,17 @@ module Perka
|
|
160
163
|
to_return
|
161
164
|
end
|
162
165
|
|
163
|
-
# Returns a sparse list of visits at the current merchant location that are
|
164
|
-
# un-validated, or that occurred after the time of the most recent validated
|
165
|
-
# visit given. This request must be made with a anonymous clerk role that corresponds
|
166
|
+
# Returns a sparse list of visits at the current merchant location that are
|
167
|
+
# un-validated, or that occurred after the time of the most recent validated
|
168
|
+
# visit given. This request must be made with a anonymous clerk role that corresponds
|
166
169
|
# to exactly one MerchantLocation.
|
167
170
|
def customer_visit_get
|
168
171
|
to_return = CustomerVisitGet.new(self)
|
169
172
|
to_return
|
170
173
|
end
|
171
174
|
|
172
|
-
# Checks for the validation of an outstanding visit and returns a sparse payload
|
173
|
-
# of <entityReference payloadName='visit'> Visit</entityReference> and related
|
175
|
+
# Checks for the validation of an outstanding visit and returns a sparse payload
|
176
|
+
# of <entityReference payloadName='visit'> Visit</entityReference> and related
|
174
177
|
# items.
|
175
178
|
def customer_visit_validate_get
|
176
179
|
to_return = CustomerVisitValidateGet.new(self)
|
@@ -192,8 +195,8 @@ module Perka
|
|
192
195
|
super(api, "GET", "/api/2/describe/{type}/{uuid}", *args)
|
193
196
|
end
|
194
197
|
|
195
|
-
# An ISO8601-formatted datetime that will be used to filter the entities in
|
196
|
-
# the payload's data section to those that were created or updated after the
|
198
|
+
# An ISO8601-formatted datetime that will be used to filter the entities in
|
199
|
+
# the payload's data section to those that were created or updated after the
|
197
200
|
# specified time
|
198
201
|
def with_last_modified(last_modified)
|
199
202
|
query_parameter('lastModified', last_modified);
|
@@ -213,29 +216,16 @@ module Perka
|
|
213
216
|
|
214
217
|
end
|
215
218
|
|
216
|
-
class CustomerRewardGet < Flatpack::Client::FlatpackRequest
|
217
|
-
|
218
|
-
def initialize(api, *args)
|
219
|
-
super(api, "GET", "/api/2/customer/reward", *args)
|
220
|
-
end
|
221
|
-
|
222
|
-
# A UUID allocated by the server
|
223
|
-
def with_customer_uuid(customer_uuid)
|
224
|
-
query_parameter('customerUuid', customer_uuid);
|
225
|
-
end
|
226
|
-
|
227
|
-
end
|
228
|
-
|
229
219
|
class CustomerVisitGet < Flatpack::Client::FlatpackRequest
|
230
220
|
|
231
221
|
def initialize(api, *args)
|
232
222
|
super(api, "GET", "/api/2/customer/visit", *args)
|
233
223
|
end
|
234
224
|
|
235
|
-
# By default, requests to this endpoint will hang for a period of time before
|
236
|
-
# returning in order to wait for a visit associated with the location to be
|
237
|
-
# created or updated. Setting this query parameter to <code>true</code> will
|
238
|
-
# disable the hanging get behavior, which is appropriate for requests used
|
225
|
+
# By default, requests to this endpoint will hang for a period of time before
|
226
|
+
# returning in order to wait for a visit associated with the location to be
|
227
|
+
# created or updated. Setting this query parameter to <code>true</code> will
|
228
|
+
# disable the hanging get behavior, which is appropriate for requests used
|
239
229
|
# for first-time UI initialization.
|
240
230
|
def with_fast_poll(fast_poll)
|
241
231
|
query_parameter('fastPoll', fast_poll);
|
data/lib/perka/model/coupon.rb
CHANGED
@@ -3,48 +3,49 @@
|
|
3
3
|
require 'perka/model/base_entity_global'
|
4
4
|
|
5
5
|
module Perka
|
6
|
-
module Model
|
6
|
+
module Model
|
7
7
|
|
8
8
|
# Represents a specific offer extended to a merchant's customer base.
|
9
9
|
class Coupon < BaseEntityGlobal
|
10
10
|
|
11
11
|
PROPERTY_NAMES = [
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
12
|
+
:summary,
|
13
|
+
:redemption_limit,
|
14
|
+
|
15
|
+
# The CouponVisibilites that control where and to whom the Coupon is available.
|
16
|
+
:coupon_visibilities,
|
17
|
+
|
18
|
+
# This property doesn't represent a single instance in time (i.e. a number
|
19
|
+
# of milliseconds past the epoch in UTC time). Instead, this value must
|
20
|
+
# be interpreted using the user's local timezone. For example, if the exact
|
21
|
+
# instant stored in this value is noon UTC time on such-and-such a day,
|
22
|
+
# this value should be interpreted to mean noon on that same date in the
|
23
|
+
# user's local timezone.
|
24
|
+
:local_begins_at,
|
25
|
+
|
26
|
+
# The parent CouponCampaign that aggregates related Coupons.
|
27
|
+
:coupon_campaign,
|
28
|
+
|
29
|
+
# See note on #getLocalBeginsAt() on how to interpret this.
|
30
|
+
:local_ends_at,
|
31
|
+
|
32
|
+
# The short perk icon name (e.g. <code>unicorn</code>).
|
33
|
+
:image_name,
|
34
|
+
:notify_minutes_before,
|
35
|
+
:perk_id,
|
36
|
+
:url,
|
37
|
+
|
38
|
+
# Indicates whether or not the Coupon will be actively pushed to customer
|
39
|
+
# devices, or if it is a passive coupon.
|
40
|
+
:push_enabled,
|
41
|
+
:title
|
42
42
|
]
|
43
43
|
attr_accessor *PROPERTY_NAMES
|
44
44
|
|
45
|
+
|
45
46
|
require 'perka/model/coupon_campaign'
|
46
47
|
TYPE_MAP = {
|
47
|
-
|
48
|
+
:coupon_campaign => Perka::Model::CouponCampaign
|
48
49
|
}
|
49
50
|
|
50
51
|
end
|
data/lib/perka/model/merchant.rb
CHANGED
@@ -3,40 +3,42 @@
|
|
3
3
|
require 'perka/model/base_entity_global'
|
4
4
|
|
5
5
|
module Perka
|
6
|
-
module Model
|
6
|
+
module Model
|
7
7
|
|
8
8
|
# Merchants operate the retail locations that offer a Perka loyalty program.
|
9
9
|
class Merchant < BaseEntityGlobal
|
10
10
|
|
11
11
|
PROPERTY_NAMES = [
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
12
|
+
:last_action_at,
|
13
|
+
:visit_expiration_minutes,
|
14
|
+
:program_tiers,
|
15
|
+
:merchant_locations,
|
16
|
+
:loyalty_type,
|
17
|
+
|
18
|
+
# A list of Clerks, which are limited to acting on specific locations.
|
19
|
+
:clerks,
|
20
|
+
:merchant_state,
|
21
|
+
:sales_demo,
|
22
|
+
:headline,
|
23
|
+
:merchant_capabilities,
|
24
|
+
:merchant_users,
|
25
|
+
:notes,
|
26
|
+
|
27
|
+
# Points-based merchants will define one or more catalog items for which
|
28
|
+
# points can be redeemed.
|
29
|
+
:points_catalog_items,
|
30
|
+
|
31
|
+
# Points-based merchants may offer a signup bonus to new customers for signing
|
32
|
+
# up.
|
33
|
+
:points_signup_bonus,
|
34
|
+
:terms,
|
35
|
+
:website_url,
|
36
|
+
:name
|
36
37
|
]
|
37
38
|
attr_accessor *PROPERTY_NAMES
|
38
39
|
|
39
40
|
|
41
|
+
|
40
42
|
end
|
41
43
|
end
|
42
44
|
end
|
data/lib/perka/model/program.rb
CHANGED
@@ -3,31 +3,32 @@
|
|
3
3
|
require 'perka/model/base_entity_global'
|
4
4
|
|
5
5
|
module Perka
|
6
|
-
module Model
|
6
|
+
module Model
|
7
7
|
|
8
|
-
# Program is a basic buy n(punchesNeeded) of x(purchasedItem), and get a free
|
8
|
+
# Program is a basic buy n(punchesNeeded) of x(purchasedItem), and get a free
|
9
9
|
# y(freeItem) when a customer has reached a certain ProgramTier.
|
10
10
|
class Program < BaseEntityGlobal
|
11
11
|
|
12
12
|
PROPERTY_NAMES = [
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
13
|
+
:program_tier,
|
14
|
+
:program_type,
|
15
|
+
:free_item,
|
16
|
+
:punches_needed,
|
17
|
+
:image_name,
|
18
|
+
:perk_id,
|
19
|
+
:terms,
|
20
|
+
:punches_needed_prefix,
|
21
|
+
:purchased_item,
|
22
|
+
:punches_needed_suffix
|
23
23
|
]
|
24
24
|
attr_accessor *PROPERTY_NAMES
|
25
25
|
|
26
|
+
|
26
27
|
require 'perka/model/program_tier'
|
27
28
|
require 'perka/model/program_type'
|
28
29
|
TYPE_MAP = {
|
29
|
-
|
30
|
-
|
30
|
+
:program_tier => Perka::Model::ProgramTier,
|
31
|
+
:program_type => Perka::Model::ProgramType
|
31
32
|
}
|
32
33
|
|
33
34
|
end
|
@@ -3,26 +3,27 @@
|
|
3
3
|
require 'perka/model/base_entity_global'
|
4
4
|
|
5
5
|
module Perka
|
6
|
-
module Model
|
6
|
+
module Model
|
7
7
|
|
8
|
-
# A program tier defines additional benefits for customers with a certain minimum
|
8
|
+
# A program tier defines additional benefits for customers with a certain minimum
|
9
9
|
# visit count.
|
10
10
|
class ProgramTier < BaseEntityGlobal
|
11
11
|
|
12
12
|
PROPERTY_NAMES = [
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
13
|
+
:merchant,
|
14
|
+
:programs,
|
15
|
+
:tier_traversals,
|
16
|
+
:additional_perks,
|
17
|
+
:points_multiplier,
|
18
|
+
:visits_needed,
|
19
|
+
:name
|
20
20
|
]
|
21
21
|
attr_accessor *PROPERTY_NAMES
|
22
22
|
|
23
|
+
|
23
24
|
require 'perka/model/merchant'
|
24
25
|
TYPE_MAP = {
|
25
|
-
|
26
|
+
:merchant => Perka::Model::Merchant
|
26
27
|
}
|
27
28
|
|
28
29
|
end
|
data/lib/perka/version.rb
CHANGED
data/lib/perka_fast.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# Generated File - DO NOT EDIT
|
2
2
|
|
3
3
|
require "perka/client_api"
|
4
|
+
require "perka/model/customer"
|
4
5
|
require "perka/model/points_activity"
|
5
6
|
require "perka/model/base_entity_global"
|
6
7
|
require "perka/model/property"
|
7
8
|
require "perka/model/api_description"
|
8
9
|
require "perka/model/entity_annotation"
|
9
10
|
require "perka/model/user_credentials"
|
10
|
-
require "perka/model/customer"
|
11
11
|
require "perka/model/merchant"
|
12
12
|
require "perka/model/abstract_user"
|
13
13
|
require "perka/model/clerk"
|
@@ -15,18 +15,18 @@ require "perka/model/integrator_user"
|
|
15
15
|
require "perka/model/internal_user"
|
16
16
|
require "perka/model/merchant_user"
|
17
17
|
require "perka/model/merchant_location"
|
18
|
-
require "perka/model/reward"
|
19
18
|
require "perka/model/reward_grant"
|
20
19
|
require "perka/model/visit"
|
21
20
|
require "perka/model/visit_confirmation"
|
22
|
-
require "perka/model/points_catalog_item"
|
23
|
-
require "perka/model/type"
|
24
|
-
require "perka/model/endpoint_description"
|
25
|
-
require "perka/model/entity_description"
|
26
21
|
require "perka/model/customer_device"
|
22
|
+
require "perka/model/reward"
|
27
23
|
require "perka/model/sms_message"
|
28
24
|
require "perka/model/social_service_subscription"
|
29
25
|
require "perka/model/tier_traversal"
|
26
|
+
require "perka/model/points_catalog_item"
|
27
|
+
require "perka/model/type"
|
28
|
+
require "perka/model/endpoint_description"
|
29
|
+
require "perka/model/entity_description"
|
30
30
|
require "perka/model/program_tier"
|
31
31
|
require "perka/model/merchant_capability"
|
32
32
|
require "perka/model/outbound_message"
|
@@ -37,18 +37,17 @@ require "perka/model/sms_outbound_message"
|
|
37
37
|
require "perka/model/coupon_visibility"
|
38
38
|
require "perka/model/merchant_device"
|
39
39
|
require "perka/model/street_address"
|
40
|
-
require "perka/model/program"
|
41
|
-
require "perka/model/reward_advancement"
|
42
40
|
require "perka/model/abstract_reward_confirmation"
|
43
41
|
require "perka/model/points_activity_confirmation"
|
44
42
|
require "perka/model/punch_reward_confirmation"
|
45
43
|
require "perka/model/redemption_coupon_confirmation"
|
46
44
|
require "perka/model/redemption_reward_confirmation"
|
47
45
|
require "perka/model/tier_traversal_confirmation"
|
46
|
+
require "perka/model/reward_advancement"
|
48
47
|
require "perka/model/coupon_redemption"
|
49
48
|
require "perka/model/feedback_item"
|
49
|
+
require "perka/model/program"
|
50
50
|
require "perka/model/parameter_description"
|
51
|
-
require "perka/model/coupon"
|
52
51
|
require "perka/model/coupon_target"
|
53
52
|
require "perka/model/bounce_back_target"
|
54
53
|
require "perka/model/composite_target"
|
@@ -64,5 +63,6 @@ require "perka/model/nobody_target"
|
|
64
63
|
require "perka/model/physical_redemption_target"
|
65
64
|
require "perka/model/tier_target"
|
66
65
|
require "perka/model/yield_management_target"
|
66
|
+
require "perka/model/coupon"
|
67
67
|
require "perka/model/program_type"
|
68
68
|
require "perka/model/coupon_campaign"
|
data/spec/api_integrator_spec.rb
CHANGED
@@ -16,11 +16,11 @@ describe Perka::PerkaApi do
|
|
16
16
|
@api = Perka::PerkaApi.new({
|
17
17
|
:flatpack => Flatpack::Core::Flatpack.new({
|
18
18
|
:pretty => true,
|
19
|
-
:verbose =>
|
19
|
+
:verbose => false,
|
20
20
|
:entity_module => Perka::Model
|
21
21
|
}),
|
22
22
|
:server_base => API_BASE,
|
23
|
-
:verbose =>
|
23
|
+
:verbose => false
|
24
24
|
})
|
25
25
|
@api.oauth_integrator_login(INTEGRATOR_ID, INTEGRATOR_SECRET)
|
26
26
|
end
|
@@ -128,7 +128,7 @@ describe Perka::PerkaApi do
|
|
128
128
|
advancement.reward.punches_earned.should eq(2)
|
129
129
|
|
130
130
|
# We'll now pull down the customer's reward status
|
131
|
-
rewards = @api.
|
131
|
+
rewards = @api.customer_uuid_get(customer.uuid).execute.rewards
|
132
132
|
|
133
133
|
# We should have only one non-activated, non-redeemed reward with 2 punches
|
134
134
|
rewards.length.should eq(1)
|
@@ -150,7 +150,7 @@ describe Perka::PerkaApi do
|
|
150
150
|
})).execute
|
151
151
|
|
152
152
|
# The customer should now one activated, and one non-activated reward
|
153
|
-
rewards = @api.
|
153
|
+
rewards = @api.customer_uuid_get(customer.uuid).execute.rewards
|
154
154
|
rewards.length.should eq(2)
|
155
155
|
active_reward = rewards.detect {|r| r.activated_at }
|
156
156
|
active_reward.activated_at.should_not be_nil
|
@@ -179,13 +179,56 @@ describe Perka::PerkaApi do
|
|
179
179
|
|
180
180
|
# The customer status should now show just one non-active
|
181
181
|
# reward with 2 punches
|
182
|
-
rewards = @api.
|
182
|
+
rewards = @api.customer_uuid_get(customer.uuid).execute.rewards
|
183
183
|
rewards.length.should eq(1)
|
184
184
|
rewards.first.activated_at.should be_nil
|
185
185
|
rewards.first.redeemed_at.should be_nil
|
186
186
|
rewards.first.punches_earned.should eq(2)
|
187
187
|
end
|
188
188
|
|
189
|
+
it "determines the status of an existing customer" do
|
190
|
+
@api.oauth_integrator_login(INTEGRATOR_ID, INTEGRATOR_SECRET)
|
191
|
+
|
192
|
+
# first set up our existing customer
|
193
|
+
cred = Perka::Model::UserCredentials.new(:email => 'joe+yet_another@getperka.com')
|
194
|
+
existing_customer = @api.integrator_customer_post(cred).execute
|
195
|
+
merchants = @api.integrator_managed_merchants_get.execute
|
196
|
+
merchant = @api.describe_entity_get(merchants.first).execute
|
197
|
+
location = merchant.merchant_locations.first
|
198
|
+
program_type = merchant.program_tiers.first.programs.first.program_type
|
199
|
+
|
200
|
+
# switch over to the clerk role
|
201
|
+
@api = @api.oauth_integrator_become("CLERK", location.uuid)
|
202
|
+
|
203
|
+
# and fetch our customer. The customer_uuid_get endpoint will
|
204
|
+
# populate the resulting customer with reward, tier_traversal, and
|
205
|
+
# available coupon information
|
206
|
+
customer = @api.customer_uuid_get(existing_customer.uuid).execute
|
207
|
+
|
208
|
+
# since this customer doesn't have any visits yet, there should be
|
209
|
+
# no tier_traversal or reward information
|
210
|
+
customer.tier_traversals.should be_nil
|
211
|
+
customer.rewards.should be_nil
|
212
|
+
|
213
|
+
# let's go ahaead and create a visit
|
214
|
+
visit = @api.customer_reward_put(Perka::Model::RewardGrant.new({
|
215
|
+
:customer => customer,
|
216
|
+
:reward_confirmations => [
|
217
|
+
Perka::Model::PunchRewardConfirmation.new({
|
218
|
+
:program_type => program_type,
|
219
|
+
:punches_earned => 1
|
220
|
+
})
|
221
|
+
]
|
222
|
+
})).execute
|
223
|
+
|
224
|
+
# Note that since the most recent tierTraversal can be expected in the
|
225
|
+
# response, the visit can be used to check the customer's current status
|
226
|
+
# at the merchant. In this case, our customer should be in the
|
227
|
+
# lowest 'local' tier.
|
228
|
+
visit.customer.tier_traversals.length.should eq(1)
|
229
|
+
visit.customer.tier_traversals.first.program_tier.name.should eq('local')
|
230
|
+
end
|
231
|
+
|
189
232
|
it "annotate entities with arbitrary JSON data" do
|
190
233
|
@api.oauth_integrator_login(INTEGRATOR_ID, INTEGRATOR_SECRET)
|
191
234
|
|
metadata
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: perka
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 5
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: "1.
|
8
|
+
- 5
|
9
|
+
version: "1.5"
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Joe Stelmach
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2012-10-
|
17
|
+
date: 2012-10-17 00:00:00 +05:30
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|