mno-enterprise-core 3.0.7 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/images/mno_enterprise/login-background.jpg +0 -0
- data/app/assets/stylesheets/mno_enterprise/mail.css +27 -0
- data/app/helpers/mno_enterprise/application_helper.rb +14 -0
- data/app/helpers/mno_enterprise/impersonate_helper.rb +1 -1
- data/app/models/mno_enterprise/app.rb +2 -1
- data/app/models/mno_enterprise/base_resource.rb +1 -2
- data/app/models/mno_enterprise/impac/dashboard.rb +3 -1
- data/app/models/mno_enterprise/impac/kpi.rb +1 -1
- data/app/models/mno_enterprise/impac/widget.rb +1 -1
- data/app/models/mno_enterprise/org_invite.rb +2 -1
- data/app/models/mno_enterprise/tenant.rb +2 -4
- data/app/models/mno_enterprise/user.rb +6 -0
- data/app/pdf/mno_enterprise/invoice_pdf.rb +29 -12
- data/app/views/system_notifications/confirmation-instructions.html.erb +26 -0
- data/app/views/system_notifications/confirmation-instructions.text.erb +10 -0
- data/app/views/system_notifications/delete-request-instructions.html.erb +31 -0
- data/app/views/system_notifications/delete-request-instructions.text.erb +15 -0
- data/app/views/system_notifications/organization-invite-existing-user.html.erb +30 -0
- data/app/views/system_notifications/organization-invite-existing-user.text.erb +13 -0
- data/app/views/system_notifications/organization-invite-new-user.html.erb +30 -0
- data/app/views/system_notifications/organization-invite-new-user.text.erb +14 -0
- data/app/views/system_notifications/reconfirmation-instructions.html.erb +27 -0
- data/app/views/system_notifications/reconfirmation-instructions.text.erb +10 -0
- data/app/views/system_notifications/registration-instructions.html.erb +27 -0
- data/app/views/system_notifications/registration-instructions.text.erb +9 -0
- data/app/views/system_notifications/reset-password-instructions.html.erb +27 -0
- data/app/views/system_notifications/reset-password-instructions.text.erb +11 -0
- data/app/views/system_notifications/unlock-instructions.html.erb +27 -0
- data/app/views/system_notifications/unlock-instructions.text.erb +10 -0
- data/config/initializers/audit_log.rb +2 -0
- data/config/locales/templates/dashboard/organization/en.yml +2 -0
- data/config/locales/views/auth/registrations/en.yml +1 -1
- data/lib/devise/hooks/impersonatable.rb +14 -0
- data/lib/devise_extension.rb +9 -2
- data/lib/generators/mno_enterprise/install/templates/config/application.yml +6 -2
- data/lib/generators/mno_enterprise/install/templates/config/initializers/mno_enterprise.rb +6 -1
- data/lib/generators/mno_enterprise/install/templates/config/settings.yml +2 -0
- data/lib/generators/mno_enterprise/install/templates/config/settings/uat.yml +2 -2
- data/lib/generators/mno_enterprise/install/templates/stylesheets/main.less +4 -0
- data/lib/her_extension/model/relation.rb +0 -13
- data/lib/mandrill_client.rb +13 -41
- data/lib/mno_enterprise/concerns/models/ability.rb +12 -0
- data/lib/mno_enterprise/concerns/models/organization.rb +5 -2
- data/lib/mno_enterprise/core.rb +21 -8
- data/lib/mno_enterprise/mail_adapters/adapter.rb +51 -0
- data/lib/mno_enterprise/mail_adapters/mandrill_adapter.rb +39 -0
- data/lib/mno_enterprise/mail_adapters/smtp_adapter.rb +21 -0
- data/lib/mno_enterprise/mail_adapters/sparkpost_adapter.rb +56 -0
- data/lib/mno_enterprise/mail_adapters/test_adapter.rb +21 -0
- data/lib/mno_enterprise/mail_client.rb +28 -0
- data/lib/mno_enterprise/smtp_client.rb +32 -0
- data/lib/mno_enterprise/testing_support/factories/apps.rb +1 -2
- data/lib/mno_enterprise/testing_support/factories/impac/kpis.rb +1 -0
- data/lib/mno_enterprise/testing_support/factories/tenant.rb +1 -7
- data/lib/mno_enterprise/testing_support/mno_enterprise_api_test_helper.rb +1 -2
- data/lib/mno_enterprise/version.rb +1 -1
- data/spec/lib/her_extension/model/relation_spec.rb +0 -71
- data/spec/lib/mandrill_client_spec.rb +27 -42
- data/spec/lib/mno_enterprise/mail_adapters/adapter_spec.rb +29 -0
- data/spec/lib/mno_enterprise/mail_adapters/mandrill_adapter_spec.rb +53 -0
- data/spec/lib/mno_enterprise/mail_adapters/smtp_adapter_spec.rb +29 -0
- data/spec/lib/mno_enterprise/mail_adapters/sparkpost_adapter_spec.rb +60 -0
- data/spec/lib/mno_enterprise/mail_client_spec.rb +9 -0
- data/spec/lib/mno_enterprise/smtp_client_spec.rb +39 -0
- data/spec/models/mno_enterprise/ability_spec.rb +21 -0
- data/spec/models/mno_enterprise/base_resource_spec.rb +0 -22
- metadata +76 -24
- data/lib/her_extension/middleware/mnoe_raise_error.rb +0 -21
- data/lib/her_extension/model/associations/belongs_to_association.rb +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f6186245d5ffafcbdde4aebcb976b5ec4e841b2
|
4
|
+
data.tar.gz: d5ecb24f9f5be4a58bbd39b1ee0f1210c971d544
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f0ed824978bc6d391744c66a0045e634bd4364c289796e4138bf2818955eac35f2957c27d9183c3e17d5e138b5c29fc7ddb91d765053606e4adda06d53b15a99
|
7
|
+
data.tar.gz: 665975695947ba02bae356968e139128006e258730e949bcd5e14709a39bf264e01f265e4a22d024c9f5ff5bb696606c238bfc22a0a39425da29d1f90e0f1c74
|
Binary file
|
@@ -0,0 +1,27 @@
|
|
1
|
+
.header {
|
2
|
+
display: block;
|
3
|
+
width: 100%;
|
4
|
+
|
5
|
+
margin-bottom: 40px;
|
6
|
+
padding: 20px 0;
|
7
|
+
border-bottom: 1px solid #ccc;
|
8
|
+
}
|
9
|
+
.header img{
|
10
|
+
display: block;
|
11
|
+
width: 40%;
|
12
|
+
min-width: 200px;
|
13
|
+
max-width: 400px;
|
14
|
+
|
15
|
+
margin: 0 auto;
|
16
|
+
}
|
17
|
+
|
18
|
+
.footer {
|
19
|
+
margin-top: 40px;
|
20
|
+
padding: 10px 0 0;
|
21
|
+
|
22
|
+
text-align: right;
|
23
|
+
font-size: 15px;
|
24
|
+
|
25
|
+
color: #666;
|
26
|
+
border-top: 1px solid #ccc;
|
27
|
+
}
|
@@ -63,5 +63,19 @@ module MnoEnterprise
|
|
63
63
|
return text unless text.present?
|
64
64
|
HtmlProcessor.new(text, format: :markdown).html.html_safe
|
65
65
|
end
|
66
|
+
|
67
|
+
# Return the user avatar url. The displayed picture use the gravatar of the user email
|
68
|
+
# TODO: add and use avatar_email from the OAUTH user
|
69
|
+
def avatar_url(user)
|
70
|
+
gravatar_url(user.email)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Return the gravatar url for the given email
|
74
|
+
def gravatar_url(email)
|
75
|
+
if email
|
76
|
+
gravatar_id = Digest::MD5.hexdigest(email.downcase)
|
77
|
+
"https://gravatar.com/avatar/#{gravatar_id}.png?s=50&d=mm"
|
78
|
+
end
|
79
|
+
end
|
66
80
|
end
|
67
81
|
end
|
@@ -22,6 +22,7 @@
|
|
22
22
|
# stack :string(255)
|
23
23
|
# terms_url :string(255)
|
24
24
|
# tags :text
|
25
|
+
# rank :integer
|
25
26
|
#
|
26
27
|
|
27
28
|
module MnoEnterprise
|
@@ -31,7 +32,7 @@ module MnoEnterprise
|
|
31
32
|
|
32
33
|
attributes :id, :uid, :nid, :name, :description, :tiny_description, :created_at, :updated_at, :logo, :website, :slug,
|
33
34
|
:categories, :key_benefits, :key_features, :testimonials, :worldwide_usage, :tiny_description,
|
34
|
-
:popup_description, :stack, :terms_url, :pictures, :tags, :api_key, :metadata_url, :metadata, :details
|
35
|
+
:popup_description, :stack, :terms_url, :pictures, :tags, :api_key, :metadata_url, :metadata, :details, :rank
|
35
36
|
|
36
37
|
# Return the list of available categories
|
37
38
|
def self.categories(list = nil)
|
@@ -19,7 +19,9 @@ module MnoEnterprise
|
|
19
19
|
# Return all the organizations linked to this dashboard and to which
|
20
20
|
# the user has access
|
21
21
|
def organizations
|
22
|
-
|
22
|
+
self.organization_ids.map do |uid|
|
23
|
+
MnoEnterprise::Organization.find_by(uid: uid)
|
24
|
+
end
|
23
25
|
end
|
24
26
|
|
25
27
|
def sorted_widgets
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module MnoEnterprise
|
2
2
|
class Impac::Kpi < BaseResource
|
3
3
|
|
4
|
-
attributes :settings, :targets, :extra_params, :endpoint, :source, :element_watched
|
4
|
+
attributes :name, :settings, :targets, :extra_params, :endpoint, :source, :element_watched
|
5
5
|
|
6
6
|
belongs_to :dashboard, class_name: 'MnoEnterprise::Impac::Dashboard'
|
7
7
|
|
@@ -20,6 +20,7 @@
|
|
20
20
|
module MnoEnterprise
|
21
21
|
class OrgInvite < BaseResource
|
22
22
|
scope :active, -> { where(status: 'pending') }
|
23
|
+
scope :active_or_staged, -> { where('status.in' => %w(staged pending)) }
|
23
24
|
|
24
25
|
#==============================================================
|
25
26
|
# Associations
|
@@ -47,4 +48,4 @@ module MnoEnterprise
|
|
47
48
|
self.status != 'pending' || self.created_at < 3.days.ago
|
48
49
|
end
|
49
50
|
end
|
50
|
-
end
|
51
|
+
end
|
@@ -56,6 +56,7 @@ module MnoEnterprise
|
|
56
56
|
#================================
|
57
57
|
# Validation
|
58
58
|
#================================
|
59
|
+
validates_uniqueness_of :email, allow_blank: true, if: :email_changed?
|
59
60
|
|
60
61
|
if Devise.password_regex
|
61
62
|
validates :password, format: { with: Devise.password_regex, message: Devise.password_regex_message }, if: :password_required?
|
@@ -133,6 +134,11 @@ module MnoEnterprise
|
|
133
134
|
@errors ||= ActiveModel::Errors.new(self)
|
134
135
|
end
|
135
136
|
|
137
|
+
# Don't require a password for unconfirmed users (user save password at confirmation step)
|
138
|
+
def password_required?
|
139
|
+
super if confirmed?
|
140
|
+
end
|
141
|
+
|
136
142
|
#================================
|
137
143
|
# Instance Methods
|
138
144
|
#================================
|
@@ -55,11 +55,11 @@ module MnoEnterprise
|
|
55
55
|
# Billing details
|
56
56
|
@data[:billing_report] = @invoice.billing_summary.map do |item|
|
57
57
|
item_label = item[:label]
|
58
|
-
price_label = item
|
58
|
+
price_label = format_price item
|
59
59
|
|
60
60
|
(item[:lines] || []).each do |item_line|
|
61
61
|
item_label += "<font size='4'>\n\n</font><font size='8'><color rgb='999999'><i>#{Prawn::Text::NBSP * 3}#{item_line[:label]}</i></color></font>"
|
62
|
-
price_label += "<font size='4'>\n\n</font><font size='8'><color rgb='999999'>#{item_line
|
62
|
+
price_label += "<font size='4'>\n\n</font><font size='8'><color rgb='999999'>#{format_price(item_line)}</color></font>"
|
63
63
|
end
|
64
64
|
|
65
65
|
[item_label, item[:name], item[:usage], price_label]
|
@@ -80,6 +80,17 @@ module MnoEnterprise
|
|
80
80
|
@pdf.render
|
81
81
|
end
|
82
82
|
|
83
|
+
def format_price(item)
|
84
|
+
# price_tag is deprecated
|
85
|
+
price = item[:price]
|
86
|
+
if price
|
87
|
+
# Money hash are automatically parsed to Money in core/lib/her_extension/middleware/mnoe_api_v1_parse_json.rb
|
88
|
+
money(price)
|
89
|
+
else
|
90
|
+
item[:price_tag]
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
83
94
|
# Generate the document content
|
84
95
|
# by adding body, header, footer and
|
85
96
|
# page numbering
|
@@ -116,6 +127,12 @@ module MnoEnterprise
|
|
116
127
|
File.exists?(app_path) ? app_path : engine_path
|
117
128
|
end
|
118
129
|
|
130
|
+
# Format a money object
|
131
|
+
def money(m)
|
132
|
+
"#{m.format(symbol: false)} #{m.currency_as_string}"
|
133
|
+
end
|
134
|
+
|
135
|
+
|
119
136
|
# Add a repeated header to the document
|
120
137
|
def add_page_header
|
121
138
|
@pdf.repeat :all do
|
@@ -206,7 +223,7 @@ module MnoEnterprise
|
|
206
223
|
|
207
224
|
summary_data = []
|
208
225
|
summary_data << ['Period', 'Total Payable' + (@data[:invoice_tax_pips] > 0 ? "\n<font size='8'><i>(incl. GST)</i></font>" : '')]
|
209
|
-
summary_data << ["#{@data[:period_started_at].strftime("%B, %e %Y")} to #{@data[:period_ended_at].strftime("%B, %e %Y")}"
|
226
|
+
summary_data << ["#{@data[:period_started_at].strftime("%B, %e %Y")} to #{@data[:period_ended_at].strftime("%B, %e %Y")}",money(@data[:invoice_total_payable_with_tax])]
|
210
227
|
|
211
228
|
# Draw Table background
|
212
229
|
bg_height = @data[:invoice_tax_pips] > 0 ? 58 : 50
|
@@ -269,13 +286,13 @@ module MnoEnterprise
|
|
269
286
|
@pdf.text_box "Credit Remaining", at: [445,@pdf.cursor], width: 95, height: 23, align: :center, valign: :center,
|
270
287
|
style: :bold, size: 10
|
271
288
|
|
272
|
-
@pdf.text_box @data[:customer_current_credit]
|
289
|
+
@pdf.text_box money(@data[:customer_current_credit]), at: [445,@pdf.cursor], width: 95, height: 37, align: :center, valign: :bottom
|
273
290
|
end
|
274
291
|
|
275
292
|
@pdf.move_down 40
|
276
293
|
end
|
277
294
|
|
278
|
-
|
295
|
+
#========================()=======
|
279
296
|
# Account Situation
|
280
297
|
#===============================
|
281
298
|
@pdf.move_down 30
|
@@ -304,15 +321,15 @@ module MnoEnterprise
|
|
304
321
|
situation_data << [
|
305
322
|
'',
|
306
323
|
'',
|
307
|
-
@data[:invoice_previous_total_due]
|
324
|
+
money(@data[:invoice_previous_total_due]),
|
308
325
|
'-',
|
309
|
-
@data[:invoice_previous_total_paid]
|
326
|
+
money(@data[:invoice_previous_total_paid]),
|
310
327
|
'+',
|
311
|
-
@data[:invoice_price]
|
328
|
+
money(@data[:invoice_price]),
|
312
329
|
'-',
|
313
|
-
@data[:invoice_credit_paid]
|
330
|
+
money(@data[:invoice_credit_paid]),
|
314
331
|
'=',
|
315
|
-
@data[:invoice_total_payable]
|
332
|
+
money(@data[:invoice_total_payable])
|
316
333
|
]
|
317
334
|
|
318
335
|
# Draw background
|
@@ -385,7 +402,7 @@ module MnoEnterprise
|
|
385
402
|
'',
|
386
403
|
'GST',
|
387
404
|
'+',
|
388
|
-
@data[:invoice_tax_payable]
|
405
|
+
money(@data[:invoice_tax_payable]),
|
389
406
|
]
|
390
407
|
|
391
408
|
# Draw table background
|
@@ -442,7 +459,7 @@ module MnoEnterprise
|
|
442
459
|
'',
|
443
460
|
'Total (incl. GST)',
|
444
461
|
'=',
|
445
|
-
@data[:invoice_total_payable_with_tax]
|
462
|
+
money(@data[:invoice_total_payable_with_tax]),
|
446
463
|
]
|
447
464
|
|
448
465
|
# Draw table background
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
|
5
|
+
<%= stylesheet_link_tag('mno_enterprise/mail.css') %>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<p class="header">
|
9
|
+
<%= image_tag('mno_enterprise/main-logo.png') %>
|
10
|
+
</p>
|
11
|
+
|
12
|
+
<p>Hi <%= @info[:first_name] %></p>
|
13
|
+
|
14
|
+
<p>You can confirm your email by clicking on the following link</p>
|
15
|
+
|
16
|
+
<a href="<%= @info[:confirmation_link] %>">Confirm my account</a>
|
17
|
+
|
18
|
+
<p>
|
19
|
+
Regards,<br/>
|
20
|
+
The Marketplace team
|
21
|
+
</p>
|
22
|
+
<p class="footer">
|
23
|
+
<%= @info[:company] %>
|
24
|
+
</p>
|
25
|
+
</body>
|
26
|
+
</html>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
Hi <%= @info[:first_name] %>
|
2
|
+
==================================================================
|
3
|
+
|
4
|
+
You can confirm your email by clicking on the following link
|
5
|
+
|
6
|
+
To confirm your email, please follow this link : <%= @info[:confirmation_link] %>
|
7
|
+
|
8
|
+
|
9
|
+
Regards,
|
10
|
+
The Marketplace team
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
|
5
|
+
<%= stylesheet_link_tag('mno_enterprise/mail.css') %>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<p class="header">
|
9
|
+
<%= image_tag('mno_enterprise/main-logo.png') %>
|
10
|
+
</p>
|
11
|
+
|
12
|
+
<p>Hi <%= @info[:first_name] %></p>
|
13
|
+
|
14
|
+
<p>We have received a request from you to terminate your account.</p>
|
15
|
+
|
16
|
+
<p>If this is a mistake, you can simply disregard this email - however, we strongly recommend you change your password too.</p>
|
17
|
+
|
18
|
+
<p>If you would like to proceed with the termination of your account you can do so by clicking the link below and following the prompts.</p>
|
19
|
+
<a href="<%= @info[:terminate_account_link] %>">Terminate Your Account</a>
|
20
|
+
|
21
|
+
<p>Please be advised, this is an irreversible action.</p>
|
22
|
+
|
23
|
+
<p>
|
24
|
+
Regards,<br/>
|
25
|
+
The Marketplace team
|
26
|
+
</p>
|
27
|
+
<p class="footer">
|
28
|
+
<%= @info[:company] %>
|
29
|
+
</p>
|
30
|
+
</body>
|
31
|
+
</html>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Hi <%= @info[:first_name] %>
|
2
|
+
=================================================================
|
3
|
+
|
4
|
+
We have received a request from you to terminate your account.
|
5
|
+
|
6
|
+
If this is a mistake, you can simply disregard this email - however, we strongly recommend you change your password too.
|
7
|
+
|
8
|
+
If you would like to proceed with the termination of your account you can do so by clicking the link below and following the prompts.
|
9
|
+
<%= @info[:terminate_account_link] %>
|
10
|
+
|
11
|
+
Please be advised, this is an irreversible action.
|
12
|
+
|
13
|
+
|
14
|
+
Regards,
|
15
|
+
The Marketplace team
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
|
5
|
+
<%= stylesheet_link_tag('mno_enterprise/mail.css') %>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<p class="header">
|
9
|
+
<%= image_tag('mno_enterprise/main-logo.png') %>
|
10
|
+
</p>
|
11
|
+
|
12
|
+
<p>Hi there,</p>
|
13
|
+
|
14
|
+
<p>You have been invited by <%= @info[:ref_full_name] %> to join <%= @info[:organization] %> on our platform!. You can automatically create your account on our platform and join <%= @info[:organization] %> by clicking on the link below:</p>
|
15
|
+
<a href="<%= @info[:confirmation_link] %>">Create my account and join <%= @info[:organization] %></a>
|
16
|
+
|
17
|
+
<% if @info[:team]? %>
|
18
|
+
<p>By accepting this invite you will automatically join the <%= @info[:team] %> team.</p>
|
19
|
+
<% end %>
|
20
|
+
|
21
|
+
<p>
|
22
|
+
Regards,<br/>
|
23
|
+
The Marketplace team
|
24
|
+
</p>
|
25
|
+
|
26
|
+
<p class="footer">
|
27
|
+
<%= @info[:company] %>
|
28
|
+
</p>
|
29
|
+
</body>
|
30
|
+
</html>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Hi there
|
2
|
+
=================================================================
|
3
|
+
|
4
|
+
You have been invited by <%= @info[:ref_full_name] %> to join <%= @info[:organization] %> on our platform!. You can automatically create your account on our platform and join <%= @info[:organization] %> by clicking on the link below:
|
5
|
+
<%= @info[:confirmation_link] %>
|
6
|
+
|
7
|
+
<% if @info[:team]? %>
|
8
|
+
By accepting this invite you will automatically join the <%= @info[:team] %> team.
|
9
|
+
<% end %>
|
10
|
+
|
11
|
+
|
12
|
+
Regards,
|
13
|
+
The Marketplace team
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
|
5
|
+
<%= stylesheet_link_tag('mno_enterprise/mail.css') %>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<p class="header">
|
9
|
+
<%= image_tag('mno_enterprise/main-logo.png') %>
|
10
|
+
</p>
|
11
|
+
|
12
|
+
<p>Hi there,</p>
|
13
|
+
|
14
|
+
<p>You have been invited by <%= @info[:ref_full_name] %> to join <%= @info[:organization] %> on our platform!. You can automatically create your account on our platform and join <%= @info[:organization] %> by clicking on the link below:</p>
|
15
|
+
<a href="<%= @info[:confirmation_link] %>">Create my account and join <%= @info[:organization] %></a>
|
16
|
+
|
17
|
+
<% if @info[:team]? %>
|
18
|
+
<p>By accepting this invite you will automatically join the <%= @info[:team] %> team.</p>
|
19
|
+
<% end %>
|
20
|
+
|
21
|
+
<p>
|
22
|
+
Regards,<br/>
|
23
|
+
The Marketplace team
|
24
|
+
</p>
|
25
|
+
|
26
|
+
<p class="footer">
|
27
|
+
<%= @info[:company] %>
|
28
|
+
</p>
|
29
|
+
</body>
|
30
|
+
</html>
|