Commit 18549df8840c8be785e26d2d8f2939047398fdc6
1 parent
30acff8d
Exists in
master
and in
29 other branches
Email request
* Features: - Plugin helper. - Plugin mailer. - Template for supplier and customer email. - Upgrades to form. * Fixes: - Passing request form through ajax serialize instead of hardcoded.
Showing
7 changed files
with
153 additions
and
32 deletions
Show diff stats
plugins/shopping_cart/controllers/shopping_cart_plugin_profile_controller.rb
1 | -include ActionView::Helpers::NumberHelper | |
1 | +include ShoppingCartPlugin::CartHelper | |
2 | 2 | |
3 | 3 | class ShoppingCartPluginProfileController < ProfileController |
4 | 4 | append_view_path File.join(File.dirname(__FILE__) + '/../views') |
... | ... | @@ -88,19 +88,20 @@ class ShoppingCartPluginProfileController < ProfileController |
88 | 88 | |
89 | 89 | def send_request |
90 | 90 | begin |
91 | - #implement send email here | |
91 | + ShoppingCartPlugin::Mailer.deliver_customer_notification(params[:customer], profile, session[:cart][:items]) | |
92 | + ShoppingCartPlugin::Mailer.deliver_supplier_notification(params[:customer], profile, session[:cart][:items]) | |
92 | 93 | render :text => { |
93 | 94 | :ok => true, |
94 | 95 | :message => _('Request sent successfully. Check your email.'), |
95 | 96 | :error => {:code => 0} |
96 | 97 | }.to_json |
97 | - rescue | |
98 | + rescue Exception => exception | |
98 | 99 | render :text => { |
99 | 100 | :ok => false, |
100 | 101 | :message => _('Your request failed.'), |
101 | 102 | :error => { |
102 | 103 | :code => 6, |
103 | - :message => _('Send request failed.') | |
104 | + :message => exception | |
104 | 105 | } |
105 | 106 | }.to_json |
106 | 107 | end |
... | ... | @@ -180,10 +181,5 @@ class ShoppingCartPluginProfileController < ProfileController |
180 | 181 | true |
181 | 182 | end |
182 | 183 | |
183 | - def get_price(product) | |
184 | - float_to_currency( product.discount ? product.price_with_discount : product.price ) | |
185 | - end | |
186 | - | |
187 | - | |
188 | 184 | end |
189 | 185 | ... | ... |
plugins/shopping_cart/lib/shopping_cart_plugin/cart_helper.rb
0 → 100644
... | ... | @@ -0,0 +1,44 @@ |
1 | +module ShoppingCartPlugin::CartHelper | |
2 | + | |
3 | + include ActionView::Helpers::NumberHelper | |
4 | + | |
5 | + def sell_price(product) | |
6 | + return 0 if product.price.nil? | |
7 | + product.discount ? product.price_with_discount : product.price | |
8 | + end | |
9 | + | |
10 | + def get_price(product) | |
11 | + float_to_currency(sell_price(product)) | |
12 | + end | |
13 | + | |
14 | + def get_total(items) | |
15 | + float_to_currency(items.map { |id, quantity| sell_price(Product.find(id)) * quantity}.sum) | |
16 | + end | |
17 | + | |
18 | + def items_table(items, by_mail = false) | |
19 | + '<table id="cart-items-table" cellpadding="2" cellspacing="0" | |
20 | + border="'+(by_mail ? '1' : '0')+'" | |
21 | + style="'+(by_mail ? 'border-collapse:collapse' : '')+'">' + | |
22 | + content_tag('tr', | |
23 | + content_tag('th', _('Item name')) + | |
24 | + content_tag('th', by_mail ? ' # ' : '#') + | |
25 | + content_tag('th', _('Price')) | |
26 | + ) + | |
27 | + items.map do |id, quantity| | |
28 | + product = Product.find(id) | |
29 | + quantity_opts = { :class => 'cart-table-quantity' } | |
30 | + quantity_opts.merge!({:align => 'center'}) if by_mail | |
31 | + price_opts = {:class => 'cart-table-price'} | |
32 | + price_opts.merge!({:align => 'right'}) if by_mail | |
33 | + content_tag('tr', | |
34 | + content_tag('td', product.name) + | |
35 | + content_tag('td', quantity, quantity_opts ) + | |
36 | + content_tag('td', get_price(product), price_opts ) | |
37 | + ) | |
38 | + end.join("\n") + | |
39 | + content_tag('th', _('Total:'), :colspan => 2, :class => 'cart-table-total-label') + | |
40 | + content_tag('th', get_total(items), :class => 'cart-table-total-value') + | |
41 | + '</table>' | |
42 | + end | |
43 | + | |
44 | +end | ... | ... |
plugins/shopping_cart/lib/shopping_cart_plugin/mailer.rb
0 → 100644
... | ... | @@ -0,0 +1,28 @@ |
1 | +include ApplicationHelper | |
2 | + | |
3 | +class ShoppingCartPlugin::Mailer < ActionMailer::Base | |
4 | + | |
5 | + prepend_view_path(ShoppingCartPlugin.root_path+'/views') | |
6 | + | |
7 | + def customer_notification(customer, supplier, items) | |
8 | + recipients customer[:email] | |
9 | + from supplier.contact_email | |
10 | + subject _("[%s] Your buy request was performed successfully.") % supplier[:name] | |
11 | + content_type 'text/html' | |
12 | + body :customer => customer, | |
13 | + :supplier => supplier, | |
14 | + :items => items, | |
15 | + :environment => supplier.environment | |
16 | + end | |
17 | + | |
18 | + def supplier_notification(customer, supplier, items) | |
19 | + recipients supplier.contact_email | |
20 | + from customer[:email] | |
21 | + subject _("[%s] You have a new buy request from %s.") % [supplier.environment.name, customer[:name]] | |
22 | + content_type 'text/html' | |
23 | + body :customer => customer, | |
24 | + :supplier => supplier, | |
25 | + :items => items, | |
26 | + :environment => supplier.environment | |
27 | + end | |
28 | +end | ... | ... |
plugins/shopping_cart/public/cart.js
... | ... | @@ -241,25 +241,17 @@ function Cart(config) { |
241 | 241 | }); |
242 | 242 | } |
243 | 243 | |
244 | - Cart.send_request = function(button) { | |
245 | - var params = {}; | |
246 | - params['name'] = $('#name', button.parentNode).val(); | |
247 | - params['email'] = $('#email', button.parentNode).val(); | |
248 | - params['contact_phone'] = $('#contact_phone', button.parentNode).val(); | |
249 | - params['address'] = $('#address', button.parentNode).val(); | |
250 | - Cart.instance.send_request(params); | |
244 | + Cart.send_request = function(form) { | |
245 | + Cart.instance.send_request($(form).serialize()); | |
246 | + return false; | |
251 | 247 | } |
252 | 248 | |
253 | - Cart.prototype.send_request = function(p) { | |
254 | - params = "?"; | |
255 | - for( var attribute in p ) { | |
256 | - var value = p[attribute]; | |
257 | - params += attribute+'='+value+'&'; | |
258 | - } | |
259 | - params = params.substring(0, params.length-1); | |
249 | + Cart.prototype.send_request = function(params) { | |
260 | 250 | var me = this; |
261 | 251 | $.ajax({ |
262 | - url: '/profile/'+ me.enterprise +'/plugins/shopping_cart/send_request'+params, | |
252 | + type: 'POST', | |
253 | + url: '/profile/'+ me.enterprise +'/plugins/shopping_cart/send_request', | |
254 | + data: params, | |
263 | 255 | dataType: 'json', |
264 | 256 | success: function(data, status, ajax){ |
265 | 257 | if ( !data.ok ) display_notice(data.error.message); | ... | ... |
plugins/shopping_cart/views/shopping_cart_plugin/mailer/customer_notification.html.erb
0 → 100644
... | ... | @@ -0,0 +1,24 @@ |
1 | +<% environment = @environment %> | |
2 | +<h4><%= _('Hi %s!') % @customer[:name] %></h4> | |
3 | +<p> | |
4 | +<%= _('This is a notification e-mail about your buy request on %s.') % link_to(@supplier.name, @supplier.url) %> | |
5 | +<%= _('The supplier already received your buy request and may contact you for confirmation.') %> | |
6 | +<%= _('Please check if your information below is correct:') %> | |
7 | +</p> | |
8 | +<ul> | |
9 | + <li><b><%= _('Full name') %>: </b><%= @customer[:name] %></li> | |
10 | + <li><b><%= _('Phone number') %>: </b><%= @customer[:contact_phone] %></li> | |
11 | + <li><b><%= _('Address') %>: </b><%= @customer[:address] %> | |
12 | + <br \> | |
13 | + <%= @customer[:city]+'-'+@customer[:state]+'-'+@customer[:country] %> | |
14 | + <br \> | |
15 | + <%= @customer[:zip_code] %></li> | |
16 | +</ul> | |
17 | +<p><%=_('Here are the products you bought:')%></p> | |
18 | +<%= items_table(@items, true) %> | |
19 | +<p> | |
20 | +<%=_('Thanks for buying with us!')%> | |
21 | +<br/> | |
22 | +<%= link_to @supplier.name, @supplier.url %> | |
23 | +</p> | |
24 | +<small style="color: #888"><%= _('A service of %s.') % environment.name %></small> | ... | ... |
plugins/shopping_cart/views/shopping_cart_plugin/mailer/supplier_notification.html.erb
0 → 100644
... | ... | @@ -0,0 +1,22 @@ |
1 | +<% environment = @environment %> | |
2 | +<h4><%= _('Hi %s!') % @supplier.name %></h4> | |
3 | +<p> | |
4 | +<%= _('This is a buy request made by %s.') % @customer[:name] %> | |
5 | +<%= _('Below follows the customer informations:') %> | |
6 | +</p> | |
7 | +<ul> | |
8 | + <li><b><%= _('Full name') %>: </b><%= @customer[:name] %></li> | |
9 | + <li><b><%= _('Email') %>: </b><%= @customer[:email] %></li> | |
10 | + <li><b><%= _('Phone number') %>: </b><%= @customer[:contact_phone] %></li> | |
11 | + <li><b><%= _('Address') %>: </b><%= @customer[:address] %> | |
12 | + <br \> | |
13 | + <%= @customer[:city]+'-'+@customer[:state]+'-'+@customer[:country] %> | |
14 | + <br \> | |
15 | + <%= @customer[:zip_code] %></li> | |
16 | +</ul> | |
17 | +<p><%=_('And here are the items bought by this customer:')%></p> | |
18 | +<%= items_table(@items, true) %> | |
19 | +<p> | |
20 | +<%=_('If there are any problems with this email contact the admin of %s.') % environment.name %> | |
21 | +</p> | |
22 | +<small style="color: #888"><%= _('A service of %s.') % environment.name %></small> | ... | ... |
plugins/shopping_cart/views/shopping_cart_plugin_profile/buy.html.erb
1 | 1 | <% person = user.nil? ? Person.new : user %> |
2 | -<% form_tag :action => 'send_request' do %> | |
3 | - <%= labelled_form_field( _("Full name"), text_field_tag(:name, person.name) ) %> | |
4 | - <%= labelled_form_field( _("Email"), text_field_tag(:email, person.email) ) %> | |
5 | - <%= labelled_form_field( _("Phone number"), text_field_tag(:contact_phone, person.contact_phone) ) %> | |
6 | - <%= labelled_form_field( _("Delivery address"), text_field_tag(:address, person.address) ) %> | |
7 | - <br style='clear: both'/><br style='clear: both'/> | |
8 | - <input class="button with-text icon-send" value="<%=_('Send')%>" type="submit" onclick="Cart.send_request(this); return false"> | |
9 | -<% end %> | |
2 | +<div id='cart-request-box'> | |
3 | + <% form_for(:customer, person, :url => {:action => 'send_request'}, | |
4 | + :html => {:onsubmit => "return Cart.send_request(this)", :id => 'cart-request-form' }) do |f| %> | |
5 | + <div id="cart-form-main"> | |
6 | + <%= labelled_form_field( _("Full name"), f.text_field(:name) ) %> | |
7 | + <%= labelled_form_field( _("Email"), f.text_field(:email) ) %> | |
8 | + <%= labelled_form_field( _("Phone number"), f.text_field(:contact_phone) ) %> | |
9 | + </div> | |
10 | + <fieldset><legend><%=_('Delivery Address')%></legend> | |
11 | + <%= labelled_form_field(_('Address (street and number)'), f.text_field(:address)) %> | |
12 | + <%= labelled_form_field( _("City"), f.text_field(:city)) %> | |
13 | + <%= labelled_form_field( _("State"), f.text_field(:state)) %> | |
14 | + <%= select_country(_('Country'), :customer, :country, {:class => 'type-select'}, {:selected => person.country}) %> | |
15 | + <%= labelled_form_field(_('ZIP code'), f.text_field(:zip_code)) %> | |
16 | + </fieldset> | |
17 | + <div id="cart-form-actions"> | |
18 | + <%= tag 'input', :class => 'button with-text icon-send', | |
19 | + :value => _('Send buy request'), | |
20 | + :type => 'submit'%> | |
21 | + </div> | |
22 | + <% end %> | |
23 | + <%= items_table(session[:cart][:items]) %> | |
24 | +</div> | ... | ... |