workarea-listrak 5.0.1

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 (163) hide show
  1. checksums.yaml +7 -0
  2. data/.eslintrc.json +36 -0
  3. data/.esvmrc +5 -0
  4. data/.gitignore +32 -0
  5. data/CHANGELOG.md +322 -0
  6. data/Gemfile +14 -0
  7. data/README.md +130 -0
  8. data/Rakefile +53 -0
  9. data/app/assets/javascripts/workarea/admin/modules/listrak/list_events_select.js +83 -0
  10. data/app/assets/javascripts/workarea/storefront/listrak/adapters/listrak_adapter.js +110 -0
  11. data/app/assets/javascripts/workarea/storefront/listrak/listrak_config.js.erb +13 -0
  12. data/app/assets/javascripts/workarea/storefront/listrak/modules/listrak.js +64 -0
  13. data/app/controllers/workarea/admin/listrak/configurations_controller.rb +30 -0
  14. data/app/controllers/workarea/admin/listrak/events_controller.rb +17 -0
  15. data/app/helpers/workarea/listrak/analytics/helper.rb +44 -0
  16. data/app/models/workarea/listrak/configuration.rb +19 -0
  17. data/app/queries/workarea/categorization.decorator +7 -0
  18. data/app/services/workarea/listrak/data_api/customers.rb +26 -0
  19. data/app/services/workarea/listrak/data_api/orders.rb +26 -0
  20. data/app/services/workarea/listrak/data_api/products.rb +26 -0
  21. data/app/services/workarea/listrak/data_api.rb +63 -0
  22. data/app/services/workarea/listrak/email_api/contacts.rb +73 -0
  23. data/app/services/workarea/listrak/email_api/events.rb +44 -0
  24. data/app/services/workarea/listrak/email_api/lists.rb +21 -0
  25. data/app/services/workarea/listrak/email_api/messages.rb +50 -0
  26. data/app/services/workarea/listrak/email_api/transactional_messages.rb +32 -0
  27. data/app/services/workarea/listrak/email_api.rb +71 -0
  28. data/app/services/workarea/listrak/models/address.rb +83 -0
  29. data/app/services/workarea/listrak/models/contact.rb +67 -0
  30. data/app/services/workarea/listrak/models/contact_form.rb +24 -0
  31. data/app/services/workarea/listrak/models/customer_form.rb +209 -0
  32. data/app/services/workarea/listrak/models/event.rb +45 -0
  33. data/app/services/workarea/listrak/models/event_form.rb +25 -0
  34. data/app/services/workarea/listrak/models/list.rb +204 -0
  35. data/app/services/workarea/listrak/models/message_form.rb +147 -0
  36. data/app/services/workarea/listrak/models/order_form.rb +352 -0
  37. data/app/services/workarea/listrak/models/order_item.rb +197 -0
  38. data/app/services/workarea/listrak/models/product_form.rb +369 -0
  39. data/app/services/workarea/listrak/models/transactional_message_form.rb +21 -0
  40. data/app/services/workarea/listrak/oauth.rb +45 -0
  41. data/app/services/workarea/listrak/transactional_message.rb +83 -0
  42. data/app/view_models/workarea/admin/listrak_configuration_view_model.rb +17 -0
  43. data/app/views/workarea/admin/listrak/configurations/edit.html.haml +28 -0
  44. data/app/views/workarea/admin/listrak/events/index.json.jbuilder +4 -0
  45. data/app/views/workarea/admin/shared/_listrak_configuration_link.html.haml +1 -0
  46. data/app/views/workarea/storefront/checkouts/_listrak.html.haml +2 -0
  47. data/app/workers/workarea/listrak/customer_exporter.rb +22 -0
  48. data/app/workers/workarea/listrak/order_exporter.rb +22 -0
  49. data/app/workers/workarea/listrak/product_exporter.rb +50 -0
  50. data/app/workers/workarea/listrak/subscribe_email_signup.rb +34 -0
  51. data/app/workers/workarea/listrak/unsubscribe_email_signup.rb +27 -0
  52. data/bin/rails +18 -0
  53. data/bin/rake +16 -0
  54. data/bin/rspec +16 -0
  55. data/bin/rubocop +16 -0
  56. data/config/initializers/append_points.rb +28 -0
  57. data/config/initializers/configuration.rb +8 -0
  58. data/config/locales/en.yml +17 -0
  59. data/config/routes.rb +10 -0
  60. data/docs/Listrak Technical Integration Guide.docx +0 -0
  61. data/lib/generators/workarea/listrak/message/USAGE +9 -0
  62. data/lib/generators/workarea/listrak/message/message_generator.rb +15 -0
  63. data/lib/generators/workarea/listrak/message/templates/message.rb.erb +24 -0
  64. data/lib/workarea/listrak/analytics.rb +17 -0
  65. data/lib/workarea/listrak/bogus_data_api/customers.rb +9 -0
  66. data/lib/workarea/listrak/bogus_data_api/orders.rb +9 -0
  67. data/lib/workarea/listrak/bogus_data_api/products.rb +9 -0
  68. data/lib/workarea/listrak/bogus_data_api/proxy_client.rb +29 -0
  69. data/lib/workarea/listrak/bogus_data_api.rb +46 -0
  70. data/lib/workarea/listrak/bogus_email_api/contacts.rb +8 -0
  71. data/lib/workarea/listrak/bogus_email_api/events.rb +23 -0
  72. data/lib/workarea/listrak/bogus_email_api/lists.rb +63 -0
  73. data/lib/workarea/listrak/bogus_email_api/proxy_client.rb +29 -0
  74. data/lib/workarea/listrak/bogus_email_api/transactional_messages.rb +9 -0
  75. data/lib/workarea/listrak/bogus_email_api.rb +51 -0
  76. data/lib/workarea/listrak/engine.rb +12 -0
  77. data/lib/workarea/listrak/error.rb +39 -0
  78. data/lib/workarea/listrak/version.rb +5 -0
  79. data/lib/workarea/listrak.rb +57 -0
  80. data/readme/listrak-admin.png +0 -0
  81. data/script/admin_ci +9 -0
  82. data/script/ci +11 -0
  83. data/script/core_ci +9 -0
  84. data/script/plugins_ci +9 -0
  85. data/script/storefront_ci +9 -0
  86. data/test/dummy/Rakefile +6 -0
  87. data/test/dummy/bin/bundle +3 -0
  88. data/test/dummy/bin/rails +4 -0
  89. data/test/dummy/bin/rake +4 -0
  90. data/test/dummy/bin/setup +34 -0
  91. data/test/dummy/bin/update +29 -0
  92. data/test/dummy/config/application.rb +18 -0
  93. data/test/dummy/config/boot.rb +5 -0
  94. data/test/dummy/config/cable.yml +9 -0
  95. data/test/dummy/config/environment.rb +5 -0
  96. data/test/dummy/config/environments/development.rb +54 -0
  97. data/test/dummy/config/environments/production.rb +86 -0
  98. data/test/dummy/config/environments/test.rb +43 -0
  99. data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
  100. data/test/dummy/config/initializers/assets.rb +11 -0
  101. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  102. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  103. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  104. data/test/dummy/config/initializers/inflections.rb +16 -0
  105. data/test/dummy/config/initializers/mime_types.rb +4 -0
  106. data/test/dummy/config/initializers/new_framework_defaults.rb +21 -0
  107. data/test/dummy/config/initializers/session_store.rb +3 -0
  108. data/test/dummy/config/initializers/workarea.rb +5 -0
  109. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  110. data/test/dummy/config/locales/en.yml +23 -0
  111. data/test/dummy/config/puma.rb +47 -0
  112. data/test/dummy/config/routes.rb +5 -0
  113. data/test/dummy/config/secrets.yml +38 -0
  114. data/test/dummy/config/spring.rb +6 -0
  115. data/test/dummy/config.ru +5 -0
  116. data/test/dummy/db/seeds.rb +2 -0
  117. data/test/dummy/public/404.html +67 -0
  118. data/test/dummy/public/422.html +67 -0
  119. data/test/dummy/public/500.html +66 -0
  120. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  121. data/test/dummy/public/apple-touch-icon.png +0 -0
  122. data/test/dummy/public/favicon.ico +0 -0
  123. data/test/factories/workarea/factories/listrak.rb +15 -0
  124. data/test/helpers/workarea/listrak/analytics/helper_test.rb +38 -0
  125. data/test/integration/workarea/admin/listrak/configuration_integration_test.rb +26 -0
  126. data/test/integration/workarea/admin/listrak/events_integration_test.rb +21 -0
  127. data/test/lib/generators/workarea/listrak/message_generator_test.rb +26 -0
  128. data/test/queries/workarea/categorization_test.decorator +15 -0
  129. data/test/services/workarea/listrak/data_api/customers_test.rb +35 -0
  130. data/test/services/workarea/listrak/data_api/orders_test.rb +24 -0
  131. data/test/services/workarea/listrak/data_api/products_test.rb +27 -0
  132. data/test/services/workarea/listrak/email_api/contacts_test.rb +55 -0
  133. data/test/services/workarea/listrak/email_api/events_test.rb +51 -0
  134. data/test/services/workarea/listrak/email_api/lists_test.rb +45 -0
  135. data/test/services/workarea/listrak/email_api/messages_test.rb +28 -0
  136. data/test/services/workarea/listrak/email_api/transactional_messages_test.rb +50 -0
  137. data/test/services/workarea/listrak/oauth_test.rb +27 -0
  138. data/test/services/workarea/listrak/transactional_message_test.rb +48 -0
  139. data/test/support/workarea/listrak/test_order_confirmation_email.rb +116 -0
  140. data/test/support/workarea/listrak/vcr_config.rb +31 -0
  141. data/test/system/workarea/listrak_system_test.rb +75 -0
  142. data/test/test_helper.rb +16 -0
  143. data/test/vcr_cassettes/listrak/data_api/customers_import-successful.yml +88 -0
  144. data/test/vcr_cassettes/listrak/data_api/orders_import-successful.yml +90 -0
  145. data/test/vcr_cassettes/listrak/data_api/products_import-successful.yml +88 -0
  146. data/test/vcr_cassettes/listrak/email_api/contacts_get-successful.yml +87 -0
  147. data/test/vcr_cassettes/listrak/email_api/contacts_upsert-already_unsubscribed.yml +90 -0
  148. data/test/vcr_cassettes/listrak/email_api/contacts_upsert-successful.yml +87 -0
  149. data/test/vcr_cassettes/listrak/email_api/events_create-invalid_parameter.yml +90 -0
  150. data/test/vcr_cassettes/listrak/email_api/events_create-successful.yml +87 -0
  151. data/test/vcr_cassettes/listrak/email_api/events_get-successful.yml +88 -0
  152. data/test/vcr_cassettes/listrak/email_api/lists_all-successful.yml +88 -0
  153. data/test/vcr_cassettes/listrak/email_api/messages_create-successful.yml +88 -0
  154. data/test/vcr_cassettes/listrak/email_api/transactional_messages_create-successful.yml +89 -0
  155. data/test/vcr_cassettes/listrak/oauth-successful.yml +44 -0
  156. data/test/vcr_cassettes/listrak/oauth-unsuccessful.yml +46 -0
  157. data/test/vcr_cassettes/listrak/system_tests/footer_email_signup-successful.yml +171 -0
  158. data/test/vcr_cassettes/listrak/system_tests/footer_email_signup_overrides_unsubscribe.yml +255 -0
  159. data/test/vcr_cassettes/listrak/system_tests/unsubscribing.yml +593 -0
  160. data/test/workers/workarea/listrak/order_exporter_test.rb +31 -0
  161. data/test/workers/workarea/listrak/product_exporter_test.rb +62 -0
  162. data/workarea-listrak.gemspec +16 -0
  163. metadata +223 -0
@@ -0,0 +1,204 @@
1
+ module Workarea
2
+ module Listrak
3
+ module Models
4
+ class List
5
+ attr_reader :hash
6
+
7
+ def initialize(hash)
8
+ @hash = hash
9
+ end
10
+
11
+ # Identifier used to locate the list.
12
+ #
13
+ # @return [Integer]
14
+ #
15
+ def id
16
+ hash["listId"]
17
+ end
18
+
19
+ # Name of the list.
20
+ #
21
+ # @return [String]
22
+ #
23
+ def name
24
+ hash["listName"]
25
+ end
26
+
27
+ # Identifier of the folder associated with the list.
28
+ #
29
+ # @return [Integer]
30
+ #
31
+ def folder_id
32
+ hash["folderId"]
33
+ end
34
+
35
+ # Identifier of the IP pool associated with the list.
36
+ #
37
+ # @return [Integer]
38
+ #
39
+ def ip_pool_id
40
+ hash["ipPoolId"]
41
+ end
42
+
43
+ # Alias domain for email bounces.
44
+ #
45
+ # @return [String]
46
+ #
47
+ def bounce_domain_alias
48
+ hash["bounceDomainAlias"]
49
+ end
50
+
51
+ # Bounce handling method for the list. Allowed values are None, Standard, and Aggressive.
52
+ #
53
+ # @return [String]
54
+ #
55
+ def bounce_handling
56
+ hash["bounceHandling"]
57
+ end
58
+
59
+ # The number of bounces that are allowed before being automatically unsubscribed.
60
+ #
61
+ # @return [Integer]
62
+ #
63
+ def bounce_unsubscribe_count
64
+ hash["bounceUnsubscribeCount"]
65
+ end
66
+
67
+ # The creation date of the list.
68
+ #
69
+ # @return [DateTime]
70
+ #
71
+ def create_date
72
+ DateTime.strptime(hash["createDate"], '%FT%T')
73
+ end
74
+
75
+ # Whether browser link is enabled.
76
+ #
77
+ # @return [Boolean]
78
+ #
79
+ def enable_browser_link
80
+ hash["enableBrowserLink"]
81
+ end
82
+
83
+ # Whether double opt-in is enabled.
84
+ #
85
+ # @return [Boolean]
86
+ #
87
+ def enable_double_opt_in
88
+ hash["enableDoubleOptIn"]
89
+ end
90
+
91
+ # Whether dynamic content is enabled.
92
+ #
93
+ # @return [Boolean]
94
+ #
95
+ def enable_dynamic_content
96
+ hash["enableDynamicContent"]
97
+ end
98
+
99
+ # Whether Google Analytics is enabled.
100
+ #
101
+ # @return [Boolean]
102
+ #
103
+ def enable_google_analytics
104
+ hash["enableGoogleAnalytics"]
105
+ end
106
+
107
+ # Whether internationalization is enabled.
108
+ #
109
+ # @return [Boolean]
110
+ #
111
+ def enable_internationalization
112
+ hash["enableInternationalization"]
113
+ end
114
+
115
+ # Whether list hygiene is enabled.
116
+ #
117
+ # @return [Boolean]
118
+ #
119
+ def enable_list_hygiene
120
+ hash["enableListHygiene"]
121
+ end
122
+
123
+ # Whether unsubscribe information is automatically included in message headers.
124
+ #
125
+ # return [Boolean]
126
+ #
127
+ def enable_list_removal_header
128
+ hash["enableListRemovalHeader"]
129
+ end
130
+
131
+ # Whether the list removal link is automatically included.
132
+ #
133
+ # @return [Boolean]
134
+ #
135
+ def enable_list_removal_link
136
+ hash["enableListRemovalLink"]
137
+ end
138
+
139
+ # Whether Listrak Analytics is enabled.
140
+ #
141
+ # @return [Boolean]
142
+ def enable_listrak_analytics
143
+ hash["enableListrakAnalytics"]
144
+ end
145
+
146
+ # Whether personalization is available in Spam Score.
147
+ #
148
+ # @return [Boolean]
149
+ #
150
+ def enable_spam_score_personalization
151
+ hash["enableSpamScorePersonalization"]
152
+ end
153
+
154
+ # Whether personalization is enabled for a recipient's To name.
155
+ #
156
+ # @return [Boolean]
157
+ #
158
+ def enable_to_name_personalization
159
+ hash["enableToNamePersonalization"]
160
+ end
161
+
162
+ # The From email address used by default when sending messages.
163
+ #
164
+ # @return [String]
165
+ #
166
+ def from_email
167
+ hash["fromEmail"]
168
+ end
169
+
170
+ # The From name used by default when sending messages.
171
+ #
172
+ # @return [String]
173
+ #
174
+ def from_name
175
+ hash["fromName"]
176
+ end
177
+
178
+ # Google tracking domains of the list.
179
+ #
180
+ # @return [Array<String>]
181
+ #
182
+ def google_tracking_domains
183
+ hash["googleTrackingDomains"]
184
+ end
185
+
186
+ # Alias domain for links in the list's messages.
187
+ #
188
+ # return [String]
189
+ #
190
+ def link_domain_alias
191
+ hash["linkDomainAlias"]
192
+ end
193
+
194
+ # Alias domain for media in the list's messages.
195
+ #
196
+ # @return [String]
197
+ #
198
+ def media_domain_alias
199
+ hash["mediaDomainAlias"]
200
+ end
201
+ end
202
+ end
203
+ end
204
+ end
@@ -0,0 +1,147 @@
1
+ module Workarea
2
+ module Listrak
3
+ module Models
4
+ class MessageForm
5
+ attr_reader :options
6
+
7
+ def initialize(from_email:, from_name:, subject:, **options)
8
+ @from_email = from_email
9
+ @from_name = from_name
10
+ @subject = subject
11
+ @options = options.symbolize_keys
12
+ end
13
+
14
+ def to_json
15
+ {
16
+ campaignId: campaign_id,
17
+ bodyHtml: body_html,
18
+ bodyText: body_text,
19
+ codePage: code_page,
20
+ enablePassalong: enable_passalong,
21
+ enableTracking: enable_tracking,
22
+ fromEmail: from_email,
23
+ fromName: from_name,
24
+ googleAnalyticsCampaignName: google_analytics_campaign_name,
25
+ googleAnalyticsCampaignContent: google_analytics_campaign_content,
26
+ replyEmail: reply_email,
27
+ savedAudienceId: save_audience_id,
28
+ subject: subject,
29
+ toName: to_name
30
+ }.compact.to_json
31
+ end
32
+
33
+ # Identifier of the campaign associated with the message.
34
+ #
35
+ # @return [Integer]
36
+ #
37
+ def campaign_id
38
+ options[:campaign_id]
39
+ end
40
+
41
+ # HTML body that will be sent in the message.
42
+ #
43
+ # @return [String]
44
+ #
45
+ def body_html
46
+ options[:body_html]
47
+ end
48
+
49
+ # Text body that will be sent in the message.
50
+ #
51
+ # @return [String]
52
+ #
53
+ def body_text
54
+ options[:body_text]
55
+ end
56
+
57
+ # Type of CodePage used in the message.
58
+ #
59
+ # @return [Integer]
60
+ #
61
+ def code_page
62
+ options[:code_page]
63
+ end
64
+
65
+ # Whether passalong is enabled.
66
+ #
67
+ # @return [Boolean]
68
+ #
69
+ def enable_passalong
70
+ options[:enable_passalong]
71
+ end
72
+
73
+ # Whether tracking is enabled.
74
+ #
75
+ # @return [Boolean]
76
+ #
77
+ def enable_tracking
78
+ options[:enable_tracking]
79
+ end
80
+
81
+ # The from email address that will be used for the message.
82
+ #
83
+ # @return [String]
84
+ #
85
+ def from_email
86
+ @from_email
87
+ end
88
+
89
+ # The from name that will be used for the message.
90
+ #
91
+ # @return [String]
92
+ #
93
+ def from_name
94
+ @from_name
95
+ end
96
+
97
+ # The Google Analytics campaign name to be used for message tracking.
98
+ #
99
+ # @return [String]
100
+ #
101
+ def google_analytics_campaign_name
102
+ options[:google_analytics_campaign_name]
103
+ end
104
+
105
+ # The Google Analytics campaign content to be used for message tracking.
106
+ #
107
+ # @return [String]
108
+ #
109
+ def google_analytics_campaign_content
110
+ options[:google_analytics_campaign_content]
111
+ end
112
+
113
+ # The reply email address that will be used for the message.
114
+ #
115
+ # @return [String]
116
+ #
117
+ def reply_email
118
+ options[:reply_email]
119
+ end
120
+
121
+ # Identifier of the SavedAudience to use for recipient filtering.
122
+ #
123
+ # @return [Integer]
124
+ #
125
+ def save_audience_id
126
+ options[:save_audience_id]
127
+ end
128
+
129
+ # Subject of the message.
130
+ #
131
+ # @return [String]
132
+ #
133
+ def subject
134
+ @subject
135
+ end
136
+
137
+ # The to name that will be used for the message.
138
+ #
139
+ # @return [String]
140
+ #
141
+ def to_name
142
+ options[:to_name]
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,352 @@
1
+ module Workarea
2
+ module Listrak
3
+ module Models
4
+ class OrderForm
5
+ attr_reader :order
6
+
7
+ def initialize(order)
8
+ @order = order
9
+ end
10
+
11
+ def as_json(_options)
12
+ {
13
+ associateID: associate_id,
14
+ billingAddress: billing_address,
15
+ couponCode: coupon_code,
16
+ customerNumber: customer_number,
17
+ dateEntered: date_entered,
18
+ discountTotal: discount_total,
19
+ email: email,
20
+ handlingTotal: handling_total,
21
+ items: items,
22
+ itemTotal: item_total,
23
+ merchandiseDiscount: merchandise_discount,
24
+ merchandiseDiscountDescription: merchandise_discount_description,
25
+ merchandiseDiscountType: merchandise_discount_type,
26
+ meta1: meta1,
27
+ meta2: meta2,
28
+ meta3: meta3,
29
+ meta4: meta4,
30
+ meta5: meta5,
31
+ nonMerchandiseDiscount: non_merchandise_discount,
32
+ nonMerchandiseDiscountDescription: non_merchandise_discount_description,
33
+ nonMerchandiseDiscountType: non_merchandise_discount_type,
34
+ orderNumber: order_number,
35
+ orderTotal: order_total,
36
+ shipDate: ship_date,
37
+ shippingAddress: shipping_address,
38
+ shippingMethod: shipping_method,
39
+ shippingTotal: shipping_total,
40
+ source: source,
41
+ status: status,
42
+ storeNumber: store_number,
43
+ taxTotal: tax_total,
44
+ trackingNumber: tracking_number
45
+ }
46
+ end
47
+
48
+ # Associate ID of order
49
+ #
50
+ # @return [String]
51
+ def associate_id
52
+ end
53
+
54
+ # Billing address of order
55
+ #
56
+ # @return [Workarea::Listrak::Models::Address]
57
+ #
58
+ def billing_address
59
+ Workarea::Listrak::Models::Address.new payment.address
60
+ end
61
+
62
+ # Coupon code used with order
63
+ #
64
+ # limited to 32 characters
65
+ #
66
+ # @return [String]
67
+ #
68
+ def coupon_code
69
+ order.promo_codes.first
70
+ end
71
+
72
+ # Internal customer number
73
+ #
74
+ # limited to 20 characters
75
+ #
76
+ # @return [String]
77
+ #
78
+ def customer_number
79
+ order.user_id.to_s
80
+ end
81
+
82
+ # Timestamp of order date (ET)
83
+ #
84
+ # @return [String] DateTime in %FT%TZ
85
+ #
86
+ def date_entered
87
+ order.placed_at.strftime '%FT%TZ'
88
+ end
89
+
90
+ # Total value of order discount
91
+ #
92
+ # @return [Float]
93
+ #
94
+ def discount_total
95
+ order.price_adjustments
96
+ .select { |pa| pa.data['discount_value'].present? && pa.price != 'item' }
97
+ .sum { |d| d.data['discount_value'] }
98
+ .abs
99
+ .try(:to_f)
100
+ end
101
+
102
+ # Email address of customer. This property is required for
103
+ # accounts that are not CRM enabled.
104
+ #
105
+ # limited to 100 characters
106
+ #
107
+ # @return [String]
108
+ #
109
+ def email
110
+ order.email
111
+ end
112
+
113
+ # Total handling costs
114
+ #
115
+ # @return [Float]
116
+ #
117
+ def handling_total
118
+ shipping.shipping_total.to_f
119
+ end
120
+
121
+ # Order items
122
+ #
123
+ # @return [Array<Workarea::Listrak::Models::OrderItem>]
124
+ #
125
+ def items
126
+ @order_items ||= order.items.map do |order_item|
127
+ Workarea::Listrak::Models::OrderItem.new order, order_item
128
+ end
129
+ end
130
+
131
+ # Total cost of items ordered (subtotal)
132
+ #
133
+ # @return [Float]
134
+ #
135
+ def item_total
136
+ order.subtotal_price.to_f
137
+ end
138
+
139
+ # Discount applied to the merchandise of the order
140
+ #
141
+ # @return [Float]
142
+ #
143
+ def merchandise_discount
144
+ order.price_adjustments
145
+ .select { |pa| pa.data['discount_value'].present? && pa.price == 'item' }
146
+ .sum { |d| d.data['discount_value'] }
147
+ .abs
148
+ .try(:to_f)
149
+ end
150
+
151
+ # Description of the discount applied to the merchandise of the order
152
+ #
153
+ # @return [String]
154
+ #
155
+ def merchandise_discount_description
156
+ end
157
+
158
+ # Type of discount applied to the merchandise of the order
159
+ #
160
+ # "NotSet" "PriceOverride" "PriceRule" "Promotion" "SeniorCitizen" "Markdown" "Coupon" "QuantityDiscount" "Rebate" "CashDiscount" "TradeDiscount" "TradeInKind" "PromptPaymentDiscount" "GeneralDiscount" "GiftVoucher" "FlexibleDiscount" "RewardProgram" "ManufacturerReward" "CreditCardReward"
161
+ #
162
+ # @return [String]
163
+ #
164
+ def merchandise_discount_type
165
+ end
166
+
167
+ # Additional meta information
168
+ #
169
+ # limited to 500 characters
170
+ #
171
+ # @return [String]
172
+ #
173
+ def meta1
174
+ end
175
+
176
+ # Additional meta information
177
+ #
178
+ # limted to 500 characters
179
+ #
180
+ # @return [String]
181
+ #
182
+ def meta2
183
+ end
184
+
185
+ # Additional meta information
186
+ #
187
+ # limted to 500 characters
188
+ #
189
+ # @return [String]
190
+ #
191
+ def meta3
192
+ end
193
+
194
+ # Additional meta information
195
+ #
196
+ # limted to 500 characters
197
+ #
198
+ # @return [String]
199
+ #
200
+ def meta4
201
+ end
202
+
203
+ # Additional meta information
204
+ #
205
+ # limted to 500 characters
206
+ #
207
+ # @return [String]
208
+ #
209
+ def meta5
210
+ end
211
+
212
+ # Discounts applied to the order that is not related to the merchandise
213
+ #
214
+ # @return [Float]
215
+ #
216
+ def non_merchandise_discount
217
+ end
218
+
219
+ # Description of the discount applied to the order not related to the merchandise
220
+ #
221
+ # @return [String]
222
+ #
223
+ def non_merchandise_discount_description
224
+ end
225
+
226
+ # Type of discount applied to the order not related to the merchandise
227
+ #
228
+ # "NotSet" "PriceOverride" "PriceRule" "Promotion" "SeniorCitizen" "Markdown" "Coupon" "QuantityDiscount" "Rebate" "CashDiscount" "TradeDiscount" "TradeInKind" "PromptPaymentDiscount" "GeneralDiscount" "GiftVoucher" "FlexibleDiscount" "RewardProgram" "ManufacturerReward" "CreditCardReward"
229
+ #
230
+ # @return [String]
231
+ #
232
+ def non_merchandise_discount_type
233
+ end
234
+
235
+ # Unique order number
236
+ #
237
+ # limited to 50 characters
238
+ #
239
+ # @return [String]
240
+ #
241
+ def order_number
242
+ order.id.to_s
243
+ end
244
+
245
+ # Total value of order
246
+ #
247
+ # return [Float]
248
+ #
249
+ def order_total
250
+ order.total_value.to_f
251
+ end
252
+
253
+ # Timestamp when entire order shipped (ET)
254
+ #
255
+ # @return [String]
256
+ #
257
+ def ship_date
258
+ end
259
+
260
+ # Shipping address of order
261
+ #
262
+ # @return [Workarea::Listrak::Models::Address]
263
+ #
264
+ def shipping_address
265
+ Workarea::Listrak::Models::Address.new shipping.address
266
+ end
267
+
268
+ # Shipping method (e.g. UPS Ground)
269
+ #
270
+ # limted to 32 characters
271
+ #
272
+ # @return [String]
273
+ #
274
+ def shipping_method
275
+ shipping.shipping_service&.name
276
+ end
277
+
278
+ # Total shipping costs
279
+ #
280
+ # @return [Float]
281
+ #
282
+ def shipping_total
283
+ order.shipping_total.to_f
284
+ end
285
+
286
+ # Describes the source at which the order was placed (online, POS, etc.)
287
+ #
288
+ # limted to 25 characters
289
+ #
290
+ # @return [String]
291
+ #
292
+ def source
293
+ 'web'
294
+ end
295
+
296
+ # Status indicator
297
+ #
298
+ # "NotSet" "Misc" "PreOrder" "BackOrder" "Pending" "Hold" "Processing" "Shipped" "Completed" "Returned" "Canceled" "Unknown" "Closed"
299
+ #
300
+ # @return [String]
301
+ #
302
+ def status
303
+ order.status
304
+ end
305
+
306
+ # Brick and mortar store location
307
+ #
308
+ # limited to 100 characters
309
+ #
310
+ # @return [String]
311
+ #
312
+ def store_number
313
+ end
314
+
315
+ # Total sales tax charged
316
+ #
317
+ # @return [Float]
318
+ #
319
+ def tax_total
320
+ order.tax_total.to_f
321
+ end
322
+
323
+ # Shipment tracking number
324
+ #
325
+ # limited to 32 characters
326
+ #
327
+ # @return [String]
328
+ #
329
+ def tracking_number
330
+ end
331
+
332
+ private
333
+
334
+ def payment
335
+ @payment ||= Workarea::Payment.find order.id
336
+ end
337
+
338
+ def fulfillment
339
+ @fulfillment ||= Workarea::Fulfillment.find order.id
340
+ end
341
+
342
+ def shippings
343
+ @shippings ||= Workarea::Shipping.by_order(order.id).to_a
344
+ end
345
+
346
+ def shipping
347
+ shippings.first
348
+ end
349
+ end
350
+ end
351
+ end
352
+ end