perka 1.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. data/.gitignore +7 -0
  2. data/Gemfile +12 -0
  3. data/LICENSE.txt +201 -0
  4. data/README.md +17 -0
  5. data/Rakefile +70 -0
  6. data/lib/perka/client_api.rb +260 -0
  7. data/lib/perka/model/abstract_reward_confirmation.rb +15 -0
  8. data/lib/perka/model/abstract_user.rb +37 -0
  9. data/lib/perka/model/api_description.rb +22 -0
  10. data/lib/perka/model/base_entity_global.rb +27 -0
  11. data/lib/perka/model/bounce_back_target.rb +33 -0
  12. data/lib/perka/model/canned_email_outbound_message.rb +14 -0
  13. data/lib/perka/model/clerk.rb +41 -0
  14. data/lib/perka/model/composite_target.rb +22 -0
  15. data/lib/perka/model/console_message.rb +16 -0
  16. data/lib/perka/model/coupon.rb +52 -0
  17. data/lib/perka/model/coupon_campaign.rb +26 -0
  18. data/lib/perka/model/coupon_redemption.rb +26 -0
  19. data/lib/perka/model/coupon_target.rb +30 -0
  20. data/lib/perka/model/coupon_visibility.rb +29 -0
  21. data/lib/perka/model/customer.rb +41 -0
  22. data/lib/perka/model/customer_device.rb +23 -0
  23. data/lib/perka/model/endpoint_description.rb +49 -0
  24. data/lib/perka/model/entity_annotation.rb +33 -0
  25. data/lib/perka/model/entity_description.rb +31 -0
  26. data/lib/perka/model/everybody_target.rb +15 -0
  27. data/lib/perka/model/feedback_item.rb +28 -0
  28. data/lib/perka/model/first_visit_target.rb +16 -0
  29. data/lib/perka/model/idle_customer_target.rb +20 -0
  30. data/lib/perka/model/integrator_user.rb +16 -0
  31. data/lib/perka/model/internal_user.rb +15 -0
  32. data/lib/perka/model/like_to_unlock_target.rb +14 -0
  33. data/lib/perka/model/list_target.rb +17 -0
  34. data/lib/perka/model/merchant.rb +42 -0
  35. data/lib/perka/model/merchant_capability.rb +16 -0
  36. data/lib/perka/model/merchant_device.rb +29 -0
  37. data/lib/perka/model/merchant_location.rb +46 -0
  38. data/lib/perka/model/merchant_user.rb +29 -0
  39. data/lib/perka/model/nobody_target.rb +15 -0
  40. data/lib/perka/model/outbound_message.rb +14 -0
  41. data/lib/perka/model/parameter_description.rb +29 -0
  42. data/lib/perka/model/participation_target.rb +34 -0
  43. data/lib/perka/model/physical_redemption_target.rb +17 -0
  44. data/lib/perka/model/points_activity.rb +34 -0
  45. data/lib/perka/model/points_activity_confirmation.rb +24 -0
  46. data/lib/perka/model/points_catalog_item.rb +41 -0
  47. data/lib/perka/model/program.rb +35 -0
  48. data/lib/perka/model/program_tier.rb +30 -0
  49. data/lib/perka/model/program_type.rb +27 -0
  50. data/lib/perka/model/property.rb +65 -0
  51. data/lib/perka/model/punch_reward_confirmation.rb +43 -0
  52. data/lib/perka/model/push_message.rb +17 -0
  53. data/lib/perka/model/redemption_coupon_confirmation.rb +26 -0
  54. data/lib/perka/model/redemption_reward_confirmation.rb +26 -0
  55. data/lib/perka/model/reward.rb +38 -0
  56. data/lib/perka/model/reward_advancement.rb +30 -0
  57. data/lib/perka/model/reward_grant.rb +37 -0
  58. data/lib/perka/model/sms_message.rb +15 -0
  59. data/lib/perka/model/sms_outbound_message.rb +14 -0
  60. data/lib/perka/model/social_list_target.rb +14 -0
  61. data/lib/perka/model/social_service_subscription.rb +26 -0
  62. data/lib/perka/model/street_address.rb +27 -0
  63. data/lib/perka/model/tier_target.rb +24 -0
  64. data/lib/perka/model/tier_traversal.rb +30 -0
  65. data/lib/perka/model/tier_traversal_confirmation.rb +28 -0
  66. data/lib/perka/model/type.rb +33 -0
  67. data/lib/perka/model/user_credentials.rb +28 -0
  68. data/lib/perka/model/visit.rb +59 -0
  69. data/lib/perka/model/visit_confirmation.rb +47 -0
  70. data/lib/perka/model/weather_target.rb +27 -0
  71. data/lib/perka/model/yield_management_target.rb +23 -0
  72. data/lib/perka/perka_api.rb +89 -0
  73. data/lib/perka/version.rb +3 -0
  74. data/lib/perka.rb +6 -0
  75. data/lib/perka_fast.rb +68 -0
  76. data/perka.gemspec +20 -0
  77. data/spec/api_integrator_spec.rb +210 -0
  78. data/spec/model_spec.rb +24 -0
  79. metadata +178 -0
@@ -0,0 +1,33 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/yield_management_target'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ class BounceBackTarget < YieldManagementTarget
9
+
10
+ PROPERTY_NAMES = [
11
+
12
+ # Returns the minutes-of-day that the bounceback window closes.
13
+ :local_open_end_at,
14
+
15
+ # Returns the minutes-of-day that the bounceback window opens.
16
+ :local_open_start_at,
17
+
18
+ # Returns the maximum number of times a customer may redeem the bounce-back
19
+ # coupon within any given bounce-back window. This property is separate
20
+ # from the maximum number of times the associated Coupon may be redeemed.
21
+ # The default value is <code>1</code>. A value of <code>0</code> allows
22
+ # unlimited use of the bounce-back offer.
23
+ :redemption_count_per_window,
24
+
25
+ # Returns the minutes-of-day that the bounceback window closes.
26
+ :redemption_days
27
+ ]
28
+ attr_accessor *PROPERTY_NAMES
29
+
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,14 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/outbound_message'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ class CannedEmailOutboundMessage < OutboundMessage
9
+
10
+
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,41 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/abstract_user'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ # A Clerk represents either an employee identity or a role identity used by
9
+ # the validator app. <p> Two distinct classes of Clerks exist: <ul> <li>Named
10
+ # clerks, representing a user authorized to perform actions at zero or more
11
+ # locations <li>Anonymous clerks, representing an access role for a single location
12
+ # </ul> A named clerk must downgrade to an anonymous clerk in order to perform
13
+ # validations at a single location. This avoids the need to store any particular
14
+ # user's credentials in the validator app.
15
+ class Clerk < AbstractUser
16
+
17
+ PROPERTY_NAMES = [
18
+ :email,
19
+ :unconfirmed_email,
20
+
21
+ # The <entityReference payloadName='merchant'> Merchant</entityReference>
22
+ # that owns the clerk account.
23
+ :merchant,
24
+
25
+ # The locations that the clerk is allowed to interact with.
26
+ :merchant_locations,
27
+
28
+ # Indicates if the Clerk is an anonymous role account used by a validator
29
+ # application at a single location.
30
+ :anonymous
31
+ ]
32
+ attr_accessor *PROPERTY_NAMES
33
+
34
+ require 'perka/model/merchant'
35
+ TYPE_MAP = {
36
+ :merchant => Perka::Model::Merchant
37
+ }
38
+
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,22 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/coupon_target'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ # A <entityReference payloadName='couponTarget'> CouponTarget</entityReference>
9
+ # that acts as a union or intersection of other <entityReference payloadName='couponTarget'>
10
+ # CouponTarget</entityReference> objects.
11
+ class CompositeTarget < CouponTarget
12
+
13
+ PROPERTY_NAMES = [
14
+ :operation,
15
+ :children
16
+ ]
17
+ attr_accessor *PROPERTY_NAMES
18
+
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,16 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/outbound_message'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ # Test implementation of OutboundMessage for text messages intended for console
9
+ # output for debugging.
10
+ class ConsoleMessage < OutboundMessage
11
+
12
+
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,52 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/base_entity_global'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ # Represents a specific offer extended to a merchant's customer base.
9
+ class Coupon < BaseEntityGlobal
10
+
11
+ PROPERTY_NAMES = [
12
+ :summary,
13
+ :redemption_limit,
14
+
15
+ # The CouponVisibilites that control where and to whom the Coupon is available.
16
+ :coupon_visibilities,
17
+
18
+ # The parent CouponCampaign that aggregates related Coupons.
19
+ :coupon_campaign,
20
+
21
+ # The short perk icon name (e.g. <code>unicorn</code>).
22
+ :image_name,
23
+
24
+ # This property doesn't represent a single instance in time (i.e. a number
25
+ # of milliseconds past the epoch in UTC time). Instead, this value must
26
+ # be interpreted using the user's local timezone. For example, if the exact
27
+ # instant stored in this value is noon UTC time on such-and-such a day,
28
+ # this value should be interpreted to mean noon on that same date in the
29
+ # user's local timezone.
30
+ :local_begins_at,
31
+
32
+ # See note on #getLocalBeginsAt() on how to interpret this.
33
+ :local_ends_at,
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
+ ]
43
+ attr_accessor *PROPERTY_NAMES
44
+
45
+ require 'perka/model/coupon_campaign'
46
+ TYPE_MAP = {
47
+ :coupon_campaign => Perka::Model::CouponCampaign
48
+ }
49
+
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,26 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/base_entity_global'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ # A CouponCampaign defines a relationship between what a merchant thinks of
9
+ # as a coupon and the collection of Coupon objects that implement the behavior.
10
+ # In general, a campaign consists of Coupons that span a non-contiguous set
11
+ # of time ranges, but that are otherwise identical in configuration.
12
+ class CouponCampaign < BaseEntityGlobal
13
+
14
+ PROPERTY_NAMES = [
15
+ :coupons,
16
+
17
+ # Retains the original <code>RRULE</code> string used to construct the campaign.
18
+ :rrule,
19
+ :title
20
+ ]
21
+ attr_accessor *PROPERTY_NAMES
22
+
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/base_entity_global'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ class CouponRedemption < BaseEntityGlobal
9
+
10
+ PROPERTY_NAMES = [
11
+ :coupon,
12
+ :visit,
13
+ :redeemed_at
14
+ ]
15
+ attr_accessor *PROPERTY_NAMES
16
+
17
+ require 'perka/model/visit'
18
+ require 'perka/model/coupon'
19
+ TYPE_MAP = {
20
+ :visit => Perka::Model::Visit,
21
+ :coupon => Perka::Model::Coupon
22
+ }
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,30 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/base_entity_global'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ # The CustomerClass hierarchy defines memberships rules that have been defined
9
+ # by a Merchant.
10
+ class CouponTarget < BaseEntityGlobal
11
+
12
+ PROPERTY_NAMES = [
13
+ :merchant,
14
+
15
+ # An optional child-to-parent relationship that allows behaviors to be aggregated
16
+ # together.
17
+ :parent
18
+ ]
19
+ attr_accessor *PROPERTY_NAMES
20
+
21
+ require 'perka/model/merchant'
22
+ require 'perka/model/composite_target'
23
+ TYPE_MAP = {
24
+ :merchant => Perka::Model::Merchant,
25
+ :parent => Perka::Model::CompositeTarget
26
+ }
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,29 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/base_entity_global'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ class CouponVisibility < BaseEntityGlobal
9
+
10
+ PROPERTY_NAMES = [
11
+ :merchant_location,
12
+ :coupon,
13
+ :coupon_target,
14
+ :coupon_target_type
15
+ ]
16
+ attr_accessor *PROPERTY_NAMES
17
+
18
+ require 'perka/model/merchant_location'
19
+ require 'perka/model/coupon_target'
20
+ require 'perka/model/coupon'
21
+ TYPE_MAP = {
22
+ :merchant_location => Perka::Model::MerchantLocation,
23
+ :coupon_target => Perka::Model::CouponTarget,
24
+ :coupon => Perka::Model::Coupon
25
+ }
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,41 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/abstract_user'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ # A Customer is someone who visits a <entityReference payloadName='merchantLocation'>
9
+ # MerchantLocation</entityReference> and engages in a retail transaction.
10
+ class Customer < AbstractUser
11
+
12
+ PROPERTY_NAMES = [
13
+ :avatar_url,
14
+ :customer_devices,
15
+
16
+ # The integrator that created the Customer object.
17
+ :managed_by,
18
+ :rewards,
19
+ :sms_messages,
20
+ :social_service_subscriptions,
21
+ :tier_traversals,
22
+
23
+ # You probably want #getLastVisit().
24
+ :visits,
25
+ :waiting_merchant_location,
26
+ :waiting_name_since,
27
+ :specials_messaging_enabled,
28
+ :email
29
+ ]
30
+ attr_accessor *PROPERTY_NAMES
31
+
32
+ require 'perka/model/merchant_location'
33
+ require 'perka/model/integrator_user'
34
+ TYPE_MAP = {
35
+ :waiting_merchant_location => Perka::Model::MerchantLocation,
36
+ :managed_by => Perka::Model::IntegratorUser
37
+ }
38
+
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,23 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/base_entity_global'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ # Represents a smartphone device associated with a specific Customer.
9
+ class CustomerDevice < BaseEntityGlobal
10
+
11
+ PROPERTY_NAMES = [
12
+ :customer
13
+ ]
14
+ attr_accessor *PROPERTY_NAMES
15
+
16
+ require 'perka/model/customer'
17
+ TYPE_MAP = {
18
+ :customer => Perka::Model::Customer
19
+ }
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,49 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'flatpack_core'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ # Describes an <code>HTTP</code> request endpoint.
9
+ class EndpointDescription < Flatpack::Core::BaseHasUuid
10
+
11
+ PROPERTY_NAMES = [
12
+
13
+ # Describes any query parameters for the endpoint.
14
+ :query_parameters,
15
+
16
+ # The expected entity type for the request. Generally, the <code>HTTP POST</code>
17
+ # body.
18
+ :entity,
19
+
20
+ # Describes any parameters embedded in #getPath().
21
+ :path_parameters,
22
+ :doc_string,
23
+
24
+ # Return the role names that are allowed to access the endpoint. A <code>null</code>
25
+ # value means that all roles are allowed, while a zero-length value means
26
+ # that no roles are allowed.
27
+ :role_names,
28
+
29
+ # The HTTP method used to access the endpoint.
30
+ :method,
31
+
32
+ # The expected contents for the HTTP response.
33
+ :return_type,
34
+
35
+ # The path used to access the endpoint.
36
+ :path
37
+ ]
38
+ attr_accessor *PROPERTY_NAMES
39
+
40
+ require 'perka/model/type'
41
+ require 'perka/model/type'
42
+ TYPE_MAP = {
43
+ :entity => Perka::Model::Type,
44
+ :return_type => Perka::Model::Type
45
+ }
46
+
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,33 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/base_entity_global'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ # Allows integrators to associate an arbitrary JSON object with a persistent
9
+ # entity. Any instance of an EntityAnnotation is specific to a particular IntegratorUser
10
+ # and multiple integrators may annotate the same entity. <p> When a request
11
+ # is made to the API server by an integrator or by any other user that is managed
12
+ # by an integrator, any EntityAnnotations associated with objects in the returned
13
+ # payload will be included as extra data.
14
+ class EntityAnnotation < BaseEntityGlobal
15
+
16
+ PROPERTY_NAMES = [
17
+
18
+ # The target entity for the annotation.
19
+ :entity,
20
+
21
+ # The custom data which may be any JSON value.
22
+ :annotation
23
+ ]
24
+ attr_accessor *PROPERTY_NAMES
25
+
26
+ require 'perka/model/base_entity_global'
27
+ TYPE_MAP = {
28
+ :entity => Perka::Model::BaseEntityGlobal
29
+ }
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,31 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'flatpack_core'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ # A description of an entity type.
9
+ class EntityDescription < Flatpack::Core::BaseHasUuid
10
+
11
+ PROPERTY_NAMES = [
12
+
13
+ # Indicates that instance of the the type may be persisted by the server.
14
+ # This hint can be used to reduce payload sizes by transmitting only mutated
15
+ # properties.
16
+ :persistent,
17
+ :doc_string,
18
+ :supertype,
19
+ :properties,
20
+ :type_name
21
+ ]
22
+ attr_accessor *PROPERTY_NAMES
23
+
24
+ require 'perka/model/entity_description'
25
+ TYPE_MAP = {
26
+ :supertype => Perka::Model::EntityDescription
27
+ }
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,15 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/coupon_target'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ # The simplest of all targets that includes all customers.
9
+ class EverybodyTarget < CouponTarget
10
+
11
+
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,28 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/base_entity_global'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ # Feedback left by a Customer after a Visit has been completed.
9
+ class FeedbackItem < BaseEntityGlobal
10
+
11
+ PROPERTY_NAMES = [
12
+ :visit,
13
+ :rating,
14
+ :customer_name,
15
+ :feedback,
16
+ :signed,
17
+ :visit_uuid
18
+ ]
19
+ attr_accessor *PROPERTY_NAMES
20
+
21
+ require 'perka/model/visit'
22
+ TYPE_MAP = {
23
+ :visit => Perka::Model::Visit
24
+ }
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,16 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/coupon_target'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ # A Customer is a member of the class if they have no confirmed visits to any
9
+ # of the Merchant's locations.
10
+ class FirstVisitTarget < CouponTarget
11
+
12
+
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,20 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/list_target'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ # The customers whose last confirmed visit was more than some number of days
9
+ # ago.
10
+ class IdleCustomerTarget < ListTarget
11
+
12
+ PROPERTY_NAMES = [
13
+ :idle_days
14
+ ]
15
+ attr_accessor *PROPERTY_NAMES
16
+
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,16 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/abstract_user'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ # An identity that represents an external API consumer. The IntegratorUser is
9
+ # mainly used to obtain access tokens to act as other users.
10
+ class IntegratorUser < AbstractUser
11
+
12
+
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/abstract_user'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ # Represents a Perka customer service representative.
9
+ class InternalUser < AbstractUser
10
+
11
+
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/everybody_target'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ class LikeToUnlockTarget < EverybodyTarget
9
+
10
+
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/coupon_target'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ # A base type for customer classes that restrict a CouponVisibility to a list
9
+ # of Customers. This base type is appropriate for memberships that do not change
10
+ # on a frequent basis or ones that are computationally-intensive to compute.
11
+ class ListTarget < CouponTarget
12
+
13
+
14
+
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,42 @@
1
+ # Generated File - DO NOT EDIT
2
+
3
+ require 'perka/model/base_entity_global'
4
+
5
+ module Perka
6
+ module Model
7
+
8
+ # Merchants operate the retail locations that offer a Perka loyalty program.
9
+ class Merchant < BaseEntityGlobal
10
+
11
+ PROPERTY_NAMES = [
12
+ :last_action_at,
13
+ :program_tiers,
14
+ :visit_expiration_minutes,
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
+ :headline,
22
+ :merchant_capabilities,
23
+ :merchant_users,
24
+ :notes,
25
+
26
+ # Points-based merchants will define one or more catalog items for which
27
+ # points can be redeemed.
28
+ :points_catalog_items,
29
+
30
+ # Points-based merchants may offer a signup bonus to new customers for signing
31
+ # up.
32
+ :points_signup_bonus,
33
+ :terms,
34
+ :sales_demo,
35
+ :name
36
+ ]
37
+ attr_accessor *PROPERTY_NAMES
38
+
39
+
40
+ end
41
+ end
42
+ end