spree_bronto 3.pre.0.pre.stable

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +8 -0
  5. data/LICENSE +26 -0
  6. data/README.md +73 -0
  7. data/Rakefile +21 -0
  8. data/app/assets/javascripts/spree/backend/spree_bronto.js +4 -0
  9. data/app/assets/javascripts/spree/frontend/bronto_list.js.coffee +8 -0
  10. data/app/assets/javascripts/spree/frontend/spree_bronto.js +2 -0
  11. data/app/assets/stylesheets/spree/backend/spree_bronto.css +4 -0
  12. data/app/assets/stylesheets/spree/frontend/spree_bronto.css +4 -0
  13. data/app/controllers/spree/admin/bronto_lists_controller.rb +24 -0
  14. data/app/controllers/spree/checkout_controller_decorator.rb +23 -0
  15. data/app/controllers/spree/home_controller_decorator.rb +120 -0
  16. data/app/controllers/spree/lists.rb +152 -0
  17. data/app/controllers/spree/orders_controller_decorator.rb +56 -0
  18. data/app/controllers/spree/users_controller_decorator.rb +27 -0
  19. data/app/mailers/spree/order_mailer/_order_cancel_html.html.erb +4 -0
  20. data/app/mailers/spree/order_mailer/_order_cancel_plain.erb +7 -0
  21. data/app/mailers/spree/order_mailer/_order_confirm_html.html.erb +5 -0
  22. data/app/mailers/spree/order_mailer/_order_confirm_plain.erb +7 -0
  23. data/app/mailers/spree/order_mailer/_order_details_html.html.erb +52 -0
  24. data/app/mailers/spree/order_mailer/_order_details_plain.erb +22 -0
  25. data/app/mailers/spree/order_mailer/_order_shipped_html.html.erb +20 -0
  26. data/app/mailers/spree/order_mailer/_order_shipped_plain.erb +21 -0
  27. data/app/mailers/spree/user_mailer/_password_reset_instructions.html.erb +9 -0
  28. data/app/mailers/spree/user_mailer_decorator.rb +13 -0
  29. data/app/models/spree/bronto_configuration.rb +12 -0
  30. data/app/models/spree/bronto_list.rb +20 -0
  31. data/app/models/spree/order_decorator.rb +30 -0
  32. data/app/models/spree/shipment_decorator.rb +18 -0
  33. data/app/models/spree/shipment_handler_decorator.rb +17 -0
  34. data/app/models/spree/store_decorator.rb +7 -0
  35. data/app/models/spree/user_decorator.rb +51 -0
  36. data/app/overrides/decorate_account_my_orders.rb +6 -0
  37. data/app/overrides/decorate_admin_configurations_index.rb +5 -0
  38. data/app/overrides/decorate_bronto_cart_recorvery.rb +6 -0
  39. data/app/overrides/decorate_bronto_list_subscribe.rb +6 -0
  40. data/app/views/spree/admin/bronto_lists/_autocomplete_form.js.erb +23 -0
  41. data/app/views/spree/admin/bronto_lists/_form.html.erb +49 -0
  42. data/app/views/spree/admin/bronto_lists/_get_lists.html.erb +1 -0
  43. data/app/views/spree/admin/bronto_lists/_get_lists.js.erb +1 -0
  44. data/app/views/spree/admin/bronto_lists/_retrieve_lists.js.erb +13 -0
  45. data/app/views/spree/admin/bronto_lists/edit.html.erb +11 -0
  46. data/app/views/spree/admin/bronto_lists/index.html.erb +38 -0
  47. data/app/views/spree/admin/bronto_lists/new.html.erb +11 -0
  48. data/app/views/spree/bronto_lists/_edit.html.erb +21 -0
  49. data/app/views/spree/bronto_lists/_form.html.erb +17 -0
  50. data/app/views/spree/bronto_lists/_signup.html.erb +13 -0
  51. data/app/views/spree/shared/_bronto_tags.html.erb +69 -0
  52. data/bin/rails +7 -0
  53. data/config/bronto.yml +39 -0
  54. data/config/locales/en.yml +27 -0
  55. data/config/routes.rb +19 -0
  56. data/db/migrate/20150427135748_spree_bronto_lists_users.rb +12 -0
  57. data/db/migrate/20150427135923_create_spree_bronto_lists.rb +16 -0
  58. data/lib/bronto_integration/bronto.rb +255 -0
  59. data/lib/bronto_integration/bronto_integration/communication.rb +83 -0
  60. data/lib/bronto_integration/bronto_integration/contact.rb +53 -0
  61. data/lib/bronto_integration/bronto_integration/order.rb +44 -0
  62. data/lib/bronto_integration/bronto_integration.rb +6 -0
  63. data/lib/delayed_send.rb +40 -0
  64. data/lib/delayed_simple_send.rb +17 -0
  65. data/lib/delayed_subscriber_add.rb +38 -0
  66. data/lib/delayed_subscriber_delete.rb +35 -0
  67. data/lib/delayed_subscriber_update.rb +38 -0
  68. data/lib/delayed_trigger.rb +17 -0
  69. data/lib/generators/spree_bronto/install/install_generator.rb +31 -0
  70. data/lib/spree_bronto/engine.rb +30 -0
  71. data/lib/spree_bronto/factories.rb +6 -0
  72. data/lib/spree_bronto.rb +2 -0
  73. data/spec/spec_helper.rb +87 -0
  74. data/spree_bronto.gemspec +32 -0
  75. metadata +258 -0
data/config/bronto.yml ADDED
@@ -0,0 +1,39 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # three bronto accounts are configured here with identity of the store code.
4
+
5
+ disable_cart_recovery: false
6
+ # if this option is false, the tagkey must be present in your yaml file
7
+
8
+ handle_asynchronously: true
9
+ # if this option is true, delayed_job must be configured.
10
+
11
+ default:
12
+ token: YOUR_BRONTO_TOKEN_TO_ACCESS_API
13
+ from_name: EMAIL_FROM NAME
14
+ tagkey: YOUR_BRONTO_CART_RECOVERY_KEY_IF_CART_RECOVERY_IS_ENABLED
15
+ order_shipped: EMAIL_API_ID_FOR_ORDER_SHIPPED_NOTIFICATION
16
+ order_received: EMAIL_API_ID_FOR_ORDER_CONFIRMATION
17
+ new_account: EMAIL_API_ID_FOR_ACCOUNT_CREATED
18
+ password_reset: EMAIL_API_ID_FOR_PASSWORD_RESET
19
+ order_canceled: EMAIL_API_ID_FOR_ORDER_CANCELED
20
+
21
+ store_a_code:
22
+ token: YOUR_BRONTO_TOKEN_TO_ACCESS_API
23
+ from_name: EMAIL_FROM NAME
24
+ tagkey: YOUR_BRONTO_CART_RECOVERY_KEY_IF_CART_RECOVERY_IS_ENABLED
25
+ order_shipped: EMAIL_API_ID_FOR_ORDER_SHIPPED_NOTIFICATION
26
+ order_received: EMAIL_API_ID_FOR_ORDER_CONFIRMATION
27
+ new_account: EMAIL_API_ID_FOR_ACCOUNT_CREATED
28
+ password_reset: EMAIL_API_ID_FOR_PASSWORD_RESET
29
+ order_canceled: EMAIL_API_ID_FOR_ORDER_CANCELED
30
+
31
+ store_b_code:
32
+ token: YOUR_BRONTO_TOKEN_TO_ACCESS_API
33
+ from_name: EMAIL_FROM NAME
34
+ tagkey: YOUR_BRONTO_CART_RECOVERY_KEY_IF_CART_RECOVERY_IS_ENABLED
35
+ order_shipped: EMAIL_API_ID_FOR_ORDER_SHIPPED_NOTIFICATION
36
+ order_received: EMAIL_API_ID_FOR_ORDER_CONFIRMATION
37
+ new_account: EMAIL_API_ID_FOR_ACCOUNT_CREATED
38
+ password_reset: EMAIL_API_ID_FOR_PASSWORD_RESET
39
+ order_canceled: EMAIL_API_ID_FOR_ORDER_CANCELED
@@ -0,0 +1,27 @@
1
+ # Sample localization file for English. Add more files in this directory for other locales.
2
+ # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ en:
5
+ spree:
6
+ subscription_sent: Signed up
7
+ subscription_notsent: Singup failed
8
+ bronto:
9
+ lists_admin: Bronto Lists
10
+ manage_settings: Manage Bronto mailing lists made available to Spree users
11
+ new_list: New List
12
+ lists: Bronto Lists
13
+ list_id: Bronto List ID
14
+ subscribe_all_new_users: Subscribe all new users
15
+ title: Display Name
16
+ editing: Editing Bronto List
17
+ retrieve_from_bronto: Retrieve from Bronto
18
+ slow_warning: This can be slow depending on the number of items defined.
19
+ only_list_can_subscribe_all: Only one list can be set to subscribe all new users at a time.
20
+ validate_unique: is already registered to another list
21
+ visible: Visible
22
+ my_newsletters: My Newsletters
23
+ update_subscriptions: Update Subscriptions
24
+ subscribed: Subscribed?
25
+ subscribe_question: Would you like to subscribe to any of our newsletters?
26
+ store_id: Web Store
27
+ no_such_list: This newsletter does not exist
data/config/routes.rb ADDED
@@ -0,0 +1,19 @@
1
+ Spree::Core::Engine.routes.append do
2
+ namespace :admin do
3
+ resources :bronto_lists do
4
+ collection do
5
+ get 'get_lists'
6
+ end
7
+ end
8
+ end
9
+
10
+ resources :orders, :except => [:index, :new, :create, :destroy] do
11
+ patch :subscribe, :on => :member
12
+ end
13
+
14
+ post "/subscribenewsletter", :to => 'home#subscribenewsletter'
15
+ post "/subscribecampaign", :to => 'home#subscribecampaign'
16
+ post "/subscribecampaign_with_ops", :to => 'home#subscribecampaign_with_ops'
17
+
18
+ end
19
+
@@ -0,0 +1,12 @@
1
+ class SpreeBrontoListsUsers < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :spree_bronto_lists_users, :id => false do |t|
4
+ t.references :user
5
+ t.references :bronto_list
6
+ t.timestamps
7
+ end
8
+ end
9
+
10
+ def self.down
11
+ end
12
+ end
@@ -0,0 +1,16 @@
1
+ class CreateSpreeBrontoLists < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :spree_bronto_lists do |t|
4
+ t.string :list_id
5
+ t.string :title
6
+ t.boolean :subscribe_all_new_users, :default => false
7
+ t.boolean :visible, :default => true
8
+ t.integer :store_id
9
+ t.timestamps
10
+ end
11
+ end
12
+
13
+ def self.down
14
+ drop_table :spree_bronto_lists
15
+ end
16
+ end
@@ -0,0 +1,255 @@
1
+ require 'savon'
2
+
3
+ class Bronto
4
+ attr_reader :client, :token
5
+
6
+ class ValidationError < StandardError; end
7
+
8
+ # NOTE Try building a response object?
9
+
10
+ def initialize(token)
11
+ @token = token
12
+ @client = Savon.client(
13
+ ssl_verify_mode: :none,
14
+ wsdl: 'https://api.bronto.com/v4?wsdl',
15
+ log_level: :debug,
16
+ log: true,
17
+ namespace_identifier: :v4,
18
+ env_namespace: :soapenv
19
+ )
20
+ end
21
+
22
+ # Ref: http://dev.bronto.com/api/v4/functions/add/addorupdateorders
23
+ def add_or_update_orders(data)
24
+ response = client.call(
25
+ :add_or_update_orders,
26
+ soap_header: soup_header,
27
+ message: { :orders => data }
28
+ )
29
+
30
+ result = get_results response.body[:add_or_update_orders_response]
31
+
32
+ if result[:is_error]
33
+ raise ValidationError, "(Error Code: #{result[:error_code]}) #{result[:error_string]}"
34
+ else
35
+ result
36
+ end
37
+ end
38
+
39
+ # Ref: http://dev.bronto.com/api/v4/functions/add/addorupdatecontacts
40
+ #
41
+ # Successful example:
42
+ #
43
+ # {:id=>"ac41a110-bd21-4bf6-b061-625dfa428a27", :is_new=>true, :is_error=>false, :error_code=>"0"}
44
+ #
45
+ # Error example:
46
+ #
47
+ # {:is_error=>true, :error_code=>"319", :error_string=>"Invalid mobile number: 86 9999-6666"}
48
+ #
49
+ def add_or_update_contacts(data)
50
+ response = client.call(
51
+ :add_or_update_contacts,
52
+ soap_header: soup_header,
53
+ message: { :contacts => data }
54
+ )
55
+
56
+ result = get_results response.body[:add_or_update_contacts_response]
57
+
58
+ if result[:is_error]
59
+ raise ValidationError, "(Error Code: #{result[:error_code]}) #{result[:error_string]}"
60
+ else
61
+ result
62
+ end
63
+ end
64
+
65
+ def read_contacts(email)
66
+ response = client.call(
67
+ :read_contacts,
68
+ soap_header: soup_header,
69
+ message: {
70
+ :filter => [:email => { :operator => 'EqualTo', :value => email }],
71
+ :includeLists => false,
72
+ :fields => 'id',
73
+ :pageNumber => 1,
74
+ :includeSMSKeywords => false,
75
+ :includeGeoIPData => false,
76
+ :includeTechnologyData => false,
77
+ :includeRFMData => false
78
+ }
79
+ )
80
+
81
+ response.body[:read_contacts_response][:return]
82
+ end
83
+
84
+ def update_contacts(data)
85
+ response = client.call(
86
+ :update_contacts,
87
+ soap_header: soup_header,
88
+ message: { :contacts => data }
89
+ )
90
+
91
+ result = get_results response.body[:update_contacts_response]
92
+
93
+ if result[:is_error]
94
+ raise ValidationError, "(Error Code: #{result[:error_code]}) #{result[:error_string]}"
95
+ else
96
+ result
97
+ end
98
+ end
99
+
100
+ def read_fields(name)
101
+ response = client.call(
102
+ :read_fields,
103
+ soap_header: soup_header,
104
+ message: {
105
+ filter: {
106
+ name: { operator: 'EqualTo', value: name }
107
+ }
108
+ }
109
+ )
110
+
111
+ response.body[:read_fields_response][:return]
112
+ end
113
+
114
+ # Ref: http://dev.bronto.com/api/v4/functions/read/readmessages
115
+ def read_messages(message_name)
116
+ if !! message_name
117
+ filter= {
118
+ :name => [{ operator: 'EqualTo', :value => message_name }]
119
+ }
120
+ else
121
+ filter= {}
122
+ end
123
+
124
+ response = client.call(
125
+ :read_messages,
126
+ soap_header: soup_header,
127
+ message: {
128
+ :filter => filter,
129
+ includeContent: false,
130
+ pageNumber: 1
131
+ })
132
+
133
+ result = response.body[:read_messages_response][:return]
134
+
135
+ if result.blank? || result[:id].blank?
136
+ raise Bronto::ValidationError, "Couldn't find the message template for \"#{message_name}\""
137
+ end
138
+
139
+ result
140
+ end
141
+
142
+ # Ref: http://dev.bronto.com/api/v4/functions/add/adddeliveries
143
+ def add_deliveries(data)
144
+ response = client.call(
145
+ :add_deliveries,
146
+ soap_header: soup_header,
147
+ message: { deliveries: data }
148
+ )
149
+
150
+ result = get_results response.body[:add_deliveries_response]
151
+
152
+ if result[:is_error]
153
+ raise ValidationError, "(Error Code: #{result[:error_code]}) #{result[:error_string]}"
154
+ else
155
+ result
156
+ end
157
+ end
158
+
159
+ # Ref: http://dev.bronto.com/api/v4/functions/add/addtolist
160
+ def add_to_list(list_name, contact_email)
161
+ response = client.call(
162
+ :add_to_list,
163
+ soap_header: soup_header,
164
+ message: {
165
+ list: {
166
+ name: list_name
167
+ },
168
+ contacts: {
169
+ email: contact_email
170
+ }
171
+ }
172
+ )
173
+
174
+ result = response.body[:add_to_list_response][:return][:results]
175
+
176
+ if result[:is_error]
177
+ raise ValidationError, "(Error Code: #{result[:error_code]}) #{result[:error_string]}"
178
+ else
179
+ result
180
+ end
181
+ end
182
+
183
+ # Ref: http://dev.bronto.com/api/v4/functions/miscellaneous/removefromlist
184
+ def remove_from_list(list_name, contact_email)
185
+ response = client.call(
186
+ :remove_from_list,
187
+ soap_header: soup_header,
188
+ message: {
189
+ list: { name: list_name },
190
+ contacts: {
191
+ email: contact_email
192
+ }
193
+ }
194
+ )
195
+
196
+ result = response.body[:remove_from_list_response][:return][:results]
197
+
198
+ if result[:is_error]
199
+ raise ValidationError, "(Error Code: #{result[:error_code]}) #{result[:error_string]}"
200
+ else
201
+ result
202
+ end
203
+ end
204
+
205
+ # Ref: http://dev.bronto.com/api/v4/functions/read/readlists
206
+ def read_lists
207
+ response = client.call(
208
+ :read_lists,
209
+ soap_header: soup_header,
210
+ message: { :filter => {} }
211
+ )
212
+
213
+ lists = response.body[:read_lists_response][:return]
214
+
215
+ if lists.is_a? Hash
216
+ [lists]
217
+ else
218
+ lists
219
+ end
220
+ end
221
+
222
+ def read_list_by_name(list_name)
223
+
224
+ filter={name: [{ operator: 'EqualTo', :value =>list_name }] }
225
+ response = client.call(
226
+ :read_lists,
227
+ soap_header: soup_header,
228
+ message: { :filter => filter, :pageNumber=>1 }
229
+ )
230
+
231
+ lists = response.body[:read_lists_response][:return]
232
+
233
+ if lists.is_a? Hash
234
+ [lists]
235
+ else
236
+ lists
237
+ end
238
+ end
239
+
240
+ private
241
+ def session_id
242
+ return @session_id if @session_id
243
+
244
+ login_response = @client.call(:login, message: { :api_token => token })
245
+ @session_id = login_response.body[:login_response][:return]
246
+ end
247
+
248
+ def soup_header
249
+ { 'v4:sessionHeader' => { :session_id => session_id } }
250
+ end
251
+
252
+ def get_results(body)
253
+ body[:return][:results]
254
+ end
255
+ end
@@ -0,0 +1,83 @@
1
+ module BrontoIntegration
2
+ class Communication
3
+ attr_reader :token, :bronto_client
4
+
5
+ def initialize(token, client = nil)
6
+ @token = token
7
+ @bronto_client = client || Bronto.new(token)
8
+ end
9
+
10
+ def add_to_list(list_name,email)
11
+ Contact.new(token, bronto_client).find_or_create email
12
+
13
+ if list_name.is_a? Array
14
+ list_name.each do |list|
15
+ bronto_client.add_to_list list, email
16
+ end
17
+ else
18
+ bronto_client.add_to_list list_name, email
19
+ end
20
+ end
21
+
22
+ def remove_from_list(list_name,email)
23
+ if list_name.is_a? Array
24
+ list_name.each do |list|
25
+ bronto_client.remove_from_list list, email
26
+ end
27
+ else
28
+ bronto_client.remove_from_list list_name, email
29
+ end
30
+ end
31
+
32
+ def remove_from_all_lists(lists, email)
33
+ lists = bronto_client.read_lists
34
+ lists.map { |l| bronto_client.remove_from_list l[:name], email }
35
+ end
36
+
37
+ def trigger_delivery(message_name,recipient_email,delivery_type,mail_type,variables_payload, mail_options)
38
+ bronto_client.add_deliveries(mail_options.merge build(message_name,recipient_email,delivery_type,mail_type,variables_payload))
39
+ end
40
+
41
+ def trigger_delivery_by_id(message_id,recipient_email,delivery_type,mail_type,variables_payload, mail_options)
42
+ bronto_client.add_deliveries(mail_options.merge build_with_id(message_id,recipient_email,delivery_type,mail_type,variables_payload))
43
+ end
44
+
45
+ def message_id(message_name)
46
+ message = bronto_client.read_messages message_name
47
+ message[:id]
48
+ end
49
+
50
+ def contact_id(recipient_email)
51
+ contact = Contact.new(token, bronto_client)
52
+ contact.get_id_by_email recipient_email
53
+ end
54
+
55
+ def build(message_name,recipient_email,delivery_type,mail_type,variables_payload={}) # default to triggered
56
+ {
57
+ start: Time.new().iso8601(),
58
+ messageId: message_id(message_name),
59
+ type: delivery_type || 'triggered',
60
+ recipients: [
61
+ { id: contact_id(recipient_email), type: 'contact' }
62
+ ],
63
+ fields: variables_payload.map do |key, value|
64
+ { name: key.to_s, type: mail_type || 'html', content: value.to_s }
65
+ end
66
+ }
67
+ end
68
+
69
+ def build_with_id(message_api_id,recipient_email,delivery_type,mail_type,variables_payload={}) # default to triggered
70
+ {
71
+ start: Time.new().iso8601(),
72
+ messageId: message_api_id,
73
+ type: delivery_type || 'triggered',
74
+ recipients: [
75
+ { id: contact_id(recipient_email), type: 'contact' }
76
+ ],
77
+ fields: variables_payload.map do |key, value|
78
+ { name: key.to_s, type: mail_type || 'html', content: value.to_s }
79
+ end
80
+ }
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,53 @@
1
+ module BrontoIntegration
2
+ class Contact
3
+
4
+ attr_reader :token, :bronto_client
5
+
6
+ def initialize(token, client = nil)
7
+ @token=token
8
+ @bronto_client = client || Bronto.new(token)
9
+ end
10
+
11
+ def get_id_by_email(email)
12
+ unless contact = bronto_client.read_contacts(email)
13
+ contact = bronto_client.add_or_update_contacts({ email: email })
14
+ end
15
+
16
+ contact[:id]
17
+ end
18
+
19
+ alias :find_or_create :get_id_by_email
20
+
21
+ def set_up(email,fields)
22
+ bronto_client.add_or_update_contacts build(email,fields)
23
+ end
24
+
25
+ def update_status(email,status)
26
+ bronto_client.update_contacts({:email => email, :status => status})
27
+ end
28
+
29
+ def build(email,fields)
30
+ {
31
+ :email => email,
32
+ :fields => fields(fields).reject{|f| f[:fieldId]==nil} #delete the non-exist fields
33
+ }
34
+ end
35
+
36
+ def fields(fields)
37
+ fields = (fields || []).map do |key, value|
38
+ {
39
+ :fieldId => get_field_id(key.to_s),
40
+ :content => value.to_s
41
+ }
42
+ end
43
+ end
44
+
45
+ def get_field_id(name)
46
+ # use cache to reduce the field id query
47
+ Rails.cache.fetch("bronto_field_#{@token}_#{name}", :expires_in => 15.hours) {
48
+ result = bronto_client.read_fields name
49
+ result[:id] if result.is_a? Hash
50
+ }
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,44 @@
1
+ module BrontoIntegration
2
+ class Order
3
+ attr_reader :token, :bronto_client
4
+ def initialize(token) # let's use order object from spree 0.11 at this moment
5
+ @bronto_client = Bronto.new(token)
6
+ @token=token
7
+ end
8
+
9
+ def build(order)
10
+ {
11
+ :id => order.number,
12
+ :email => order.checkout.email,
13
+ :contactId => contact_id(order.checkout.email),
14
+ :products => line_items(order.line_items),
15
+ :orderDate => order.completed_at.iso8601()
16
+ }
17
+ end
18
+
19
+ def create_or_update(order)
20
+ bronto_client.add_or_update_orders build(order)
21
+ end
22
+
23
+ def line_items(line_items)
24
+ line_items.inject([]) do |items, item|
25
+ items << {
26
+ :id => item.variant_id,
27
+ :sku => item.variant.sku,
28
+ :name => ERB::Util.html_escape(item.product.name.gsub!(/[^0-9A-Za-z]/, ' ')), # some product may have special characot in name
29
+ :quantity => item.quantity,
30
+ :price => item.price#,
31
+ #:url => 'http://www.' + item.product.store.name + '/products/' + item.product.permalink,
32
+ #:image => 'http://dt1l4oh2o5aei.cloudfront.net/attachments/' + item.product.images.first.id.to_s + '/product.jpg'
33
+ }
34
+
35
+ items
36
+ end
37
+ end
38
+
39
+ def contact_id(recipient_email)
40
+ contact = Contact.new(token, bronto_client)
41
+ contact.get_id_by_email recipient_email
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,6 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ require 'bronto'
4
+ require 'bronto_integration/order'
5
+ require 'bronto_integration/contact'
6
+ require 'bronto_integration/communication'
@@ -0,0 +1,40 @@
1
+ DelayedSend = Struct.new(:store_code, :email, :message_name, :order_id, :plain_view, :html_view) do
2
+ def perform
3
+ return if email.blank?
4
+ #store_code ||= 'default'
5
+ order = Spree::Order.find(order_id)
6
+ token= Spree::BrontoConfiguration.account[store_code]['token']
7
+ from_email= order.store.mail_from_address
8
+ from_name= Spree::BrontoConfiguration.account[store_code]['from_name']
9
+ reply_email= order.store.mail_from_address
10
+ email_options={:fromEmail =>from_email,:fromName => from_name, :replyEmail => reply_email}
11
+
12
+
13
+ view = ActionView::Base.new(Rails::Application::Configuration.new(Rails.root).paths["app/mailers/spree"])
14
+ view.view_paths<<File.join(File.dirname(__FILE__), '../app/mailers/spree')
15
+
16
+ attributes = {:First_Name => order.bill_address.firstname,
17
+ :Last_name => order.bill_address.lastname}
18
+
19
+ attributes[:SENDTIME__CONTENT1] = view.render(plain_view, :order => order) unless plain_view.nil?
20
+ attributes[:SENDTIME__CONTENT2] = (view.render(html_view, :order => order)).gsub(/\n/,'').html_safe unless html_view.nil?
21
+
22
+ begin
23
+ communication = BrontoIntegration::Communication.new(token)
24
+ communication.trigger_delivery_by_id(message_name,email,'transactional','html',attributes,email_options)
25
+
26
+ rescue => exception
27
+ begin #handle the transactional contact in case the message is not approved for transactional.
28
+ contact = BrontoIntegration::Contact.new(token)
29
+ contact.update_status(email,'active')
30
+ communication.trigger_delivery_by_id(message_name,email,'triggered','html',attributes,email_options)
31
+ rescue => exception
32
+ raise exception
33
+ end
34
+ end
35
+ end
36
+
37
+ if Spree::BrontoConfiguration.account['handle_asynchronously']
38
+ handle_asynchronously :perform, :priority => 20
39
+ end
40
+ end
@@ -0,0 +1,17 @@
1
+ DelayedSimpleSend = Struct.new(:store_code, :email, :message_name, :attributes, :mail_type) do
2
+ def perform
3
+ return if email.blank?
4
+ begin
5
+ token= Spree::BrontoConfiguration.account[store_code]['token']
6
+ from_email= order.store.mail_from_address
7
+ from_name= Spree::BrontoConfiguration.account[store_code]['from_name']
8
+ reply_email= order.store.mail_from_address
9
+
10
+ email_options={:fromEmail =>from_email,:fromName => from_name, :replyEmail => reply_email}
11
+ communication = BrontoIntegration::Communication.new(token)
12
+ communication.trigger_delivery_by_id(message_name,email,'triggered',mail_type||'html',attributes||{},email_options)
13
+ rescue => exception
14
+ #raise exception # as now only campaign use this and their templates may not be approved. let it go.
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,38 @@
1
+ DelayedSubscriberAdd = Struct.new(:store_code, :user, :list, :ops) do
2
+ def perform
3
+
4
+ if list.nil? || !user
5
+ subscriber_id = -1
6
+ else
7
+ begin
8
+ token= Spree::BrontoConfiguration.account[store_code]['token']
9
+ if user.is_a? String
10
+ email=user
11
+ else
12
+ email=user.email
13
+ end
14
+
15
+ contact = BrontoIntegration::Contact.new(token)
16
+ contacts=contact.set_up(email,ops||{})
17
+ subscriber_id= contacts[:id]
18
+
19
+ communication = BrontoIntegration::Communication.new(token)
20
+ communication.add_to_list(list.title,email)
21
+
22
+ rescue => exception
23
+ subscriber_id = -1
24
+ #raise exception
25
+ end
26
+ end
27
+
28
+ #unless user.is_a? String
29
+ # begin
30
+ # user.bronto_lists << list
31
+ # user.save!
32
+ # rescue
33
+ # end
34
+ #end
35
+
36
+
37
+ end
38
+ end
@@ -0,0 +1,35 @@
1
+ DelayedSubscriberDelete = Struct.new(:store_code, :user, :list) do
2
+ def perform
3
+ if list.nil? || !user
4
+ subscriber_id = -1
5
+ else
6
+ begin
7
+ token= Spree::BrontoConfiguration.account[store_code]['token']
8
+ if user.is_a? String
9
+ email=user
10
+ else
11
+ email=user.email
12
+ end
13
+ unless email.empty?
14
+ communication = BrontoIntegration::Communication.new(token)
15
+ communication.remove_from_list(list.title,email)
16
+ end
17
+ rescue => exception
18
+ #raise exception
19
+ end
20
+ end
21
+
22
+ #unless user.is_a? String # update exact_target_lists
23
+ # begin
24
+ # list_del=user.bronto_lists.select{|l| l.id== list.id}
25
+ # if list_del.length>0
26
+ # user.bronto_lists.delete(list_del)
27
+ # end
28
+ # user.save!
29
+ # rescue
30
+ # #raise exception
31
+ # end
32
+ #end
33
+
34
+ end
35
+ end