Commit 18549df8840c8be785e26d2d8f2939047398fdc6
1 parent
30acff8d
Exists in
master
and in
23 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> | ... | ... |