Commit a2369d8964da1c06beaab3c9c344cc41b4ab8707
1 parent
c73a84e2
Exists in
master
and in
28 other branches
Adding delivery options for shopping cart
Showing
11 changed files
with
162 additions
and
54 deletions
Show diff stats
plugins/shopping_cart/controllers/shopping_cart_plugin_myprofile_controller.rb
| ... | ... | @@ -7,8 +7,8 @@ class ShoppingCartPluginMyprofileController < MyProfileController |
| 7 | 7 | if params[:settings] |
| 8 | 8 | params[:settings][:enabled] = params[:settings][:enabled] == '1' |
| 9 | 9 | params[:settings][:delivery] = params[:settings][:delivery] == '1' |
| 10 | - params[:settings][:delivery_price] = params[:settings][:delivery_price].to_d | |
| 11 | 10 | params[:settings][:free_delivery_price] = params[:settings][:free_delivery_price].to_d |
| 11 | + params[:settings][:delivery_options] = treat_delivery_options(params[:settings][:delivery_options]) | |
| 12 | 12 | end |
| 13 | 13 | |
| 14 | 14 | @settings = Noosfero::Plugin::Settings.new(profile, ShoppingCartPlugin, params[:settings]) |
| ... | ... | @@ -54,4 +54,16 @@ class ShoppingCartPluginMyprofileController < MyProfileController |
| 54 | 54 | order.save! |
| 55 | 55 | redirect_to :action => 'reports', :from => params[:context_from], :to => params[:context_to], :filter_status => params[:context_status] |
| 56 | 56 | end |
| 57 | + | |
| 58 | + private | |
| 59 | + | |
| 60 | + def treat_delivery_options(params) | |
| 61 | + result = {} | |
| 62 | + params[:options].size.times do |counter| | |
| 63 | + if params[:options][counter].present? && params[:prices][counter].present? | |
| 64 | + result[params[:options][counter]] = params[:prices][counter] | |
| 65 | + end | |
| 66 | + end | |
| 67 | + result | |
| 68 | + end | |
| 57 | 69 | end | ... | ... |
plugins/shopping_cart/controllers/shopping_cart_plugin_profile_controller.rb
| ... | ... | @@ -92,8 +92,8 @@ class ShoppingCartPluginProfileController < ProfileController |
| 92 | 92 | def send_request |
| 93 | 93 | register_order(params[:customer], session[:cart][:items]) |
| 94 | 94 | begin |
| 95 | - ShoppingCartPlugin::Mailer.deliver_customer_notification(params[:customer], profile, session[:cart][:items]) | |
| 96 | - ShoppingCartPlugin::Mailer.deliver_supplier_notification(params[:customer], profile, session[:cart][:items]) | |
| 95 | + ShoppingCartPlugin::Mailer.deliver_customer_notification(params[:customer], profile, session[:cart][:items], params[:delivery_option]) | |
| 96 | + ShoppingCartPlugin::Mailer.deliver_supplier_notification(params[:customer], profile, session[:cart][:items], params[:delivery_option]) | |
| 97 | 97 | render :text => { |
| 98 | 98 | :ok => true, |
| 99 | 99 | :message => _('Request sent successfully. Check your email.'), |
| ... | ... | @@ -152,6 +152,24 @@ class ShoppingCartPluginProfileController < ProfileController |
| 152 | 152 | end |
| 153 | 153 | end |
| 154 | 154 | |
| 155 | + def update_delivery_option | |
| 156 | + settings = Noosfero::Plugin::Settings.new(profile, ShoppingCartPlugin) | |
| 157 | + delivery_price = settings.delivery_options[params[:delivery_option]] | |
| 158 | + delivery = Product.new(:name => params[:delivery_option], :price => delivery_price) | |
| 159 | + delivery.save(false) | |
| 160 | + items = session[:cart][:items].clone | |
| 161 | + items[delivery.id] = 1 | |
| 162 | + total_price = get_total_on_currency(items, environment) | |
| 163 | + delivery.destroy | |
| 164 | + render :text => { | |
| 165 | + :ok => true, | |
| 166 | + :delivery_price => float_to_currency_cart(delivery_price, environment), | |
| 167 | + :total_price => total_price, | |
| 168 | + :message => _('Delivery option updated.'), | |
| 169 | + :error => {:code => 0} | |
| 170 | + }.to_json | |
| 171 | + end | |
| 172 | + | |
| 155 | 173 | private |
| 156 | 174 | |
| 157 | 175 | def validate_same_enterprise | ... | ... |
plugins/shopping_cart/lib/shopping_cart_plugin.rb
| ... | ... | @@ -3,24 +3,30 @@ require_dependency 'shopping_cart_plugin/ext/person' |
| 3 | 3 | |
| 4 | 4 | class ShoppingCartPlugin < Noosfero::Plugin |
| 5 | 5 | |
| 6 | - def self.plugin_name | |
| 6 | + class << self | |
| 7 | + def plugin_name | |
| 7 | 8 | "Shopping Basket" |
| 8 | - end | |
| 9 | + end | |
| 9 | 10 | |
| 10 | - def self.plugin_description | |
| 11 | - _("A shopping basket feature for enterprises") | |
| 12 | - end | |
| 11 | + def plugin_description | |
| 12 | + _("A shopping basket feature for enterprises") | |
| 13 | + end | |
| 13 | 14 | |
| 14 | - def self.enabled_default_setting | |
| 15 | - true | |
| 16 | - end | |
| 15 | + def enabled_default_setting | |
| 16 | + true | |
| 17 | + end | |
| 17 | 18 | |
| 18 | - def self.delivery_default_setting | |
| 19 | - false | |
| 20 | - end | |
| 19 | + def delivery_default_setting | |
| 20 | + false | |
| 21 | + end | |
| 21 | 22 | |
| 22 | - def self.delivery_price_default_setting | |
| 23 | - 0 | |
| 23 | + def delivery_price_default_setting | |
| 24 | + 0 | |
| 25 | + end | |
| 26 | + | |
| 27 | + def delivery_options_default_setting | |
| 28 | + {} | |
| 29 | + end | |
| 24 | 30 | end |
| 25 | 31 | |
| 26 | 32 | def add_to_cart_button(item, enterprise = context.profile) | ... | ... |
plugins/shopping_cart/lib/shopping_cart_plugin/cart_helper.rb
| ... | ... | @@ -24,7 +24,7 @@ module ShoppingCartPlugin::CartHelper |
| 24 | 24 | float_to_currency_cart(get_total(items), environment) |
| 25 | 25 | end |
| 26 | 26 | |
| 27 | - def items_table(items, profile, by_mail = false) | |
| 27 | + def items_table(items, profile, delivery_option = nil, by_mail = false) | |
| 28 | 28 | environment = profile.environment |
| 29 | 29 | settings = Noosfero::Plugin::Settings.new(profile, ShoppingCartPlugin) |
| 30 | 30 | items = items.to_a |
| ... | ... | @@ -39,7 +39,7 @@ module ShoppingCartPlugin::CartHelper |
| 39 | 39 | if settings.free_delivery_price && get_total(items) >= settings.free_delivery_price |
| 40 | 40 | delivery = Product.new(:name => _('Free delivery'), :price => 0) |
| 41 | 41 | else |
| 42 | - delivery = Product.new(:name => _('Delivery'), :price => settings.delivery_price) | |
| 42 | + delivery = Product.new(:name => delivery_option, :price => settings.delivery_options[delivery_option]) | |
| 43 | 43 | end |
| 44 | 44 | delivery.save(false) |
| 45 | 45 | items << [delivery.id, ''] |
| ... | ... | @@ -49,17 +49,23 @@ module ShoppingCartPlugin::CartHelper |
| 49 | 49 | border="'+(by_mail ? '1' : '0')+'" |
| 50 | 50 | style="'+(by_mail ? 'border-collapse:collapse' : '')+'">' + |
| 51 | 51 | content_tag('tr', |
| 52 | - content_tag('th', _('Item name')) + | |
| 53 | - content_tag('th', by_mail ? ' # ' : '#') + | |
| 54 | - content_tag('th', _('Price')) | |
| 52 | + content_tag('th', _('Item name')) + | |
| 53 | + content_tag('th', by_mail ? ' # ' : '#') + | |
| 54 | + content_tag('th', _('Price')) | |
| 55 | 55 | ) + |
| 56 | 56 | items.map do |id, quantity| |
| 57 | 57 | product = Product.find(id) |
| 58 | + name_opts = {} | |
| 59 | + is_delivery = quantity.kind_of?(String) | |
| 60 | + if is_delivery | |
| 61 | + price_opts.merge!({:id => 'delivery-price'}) | |
| 62 | + name_opts.merge!({:id => 'delivery-name'}) | |
| 63 | + end | |
| 58 | 64 | content_tag('tr', |
| 59 | - content_tag('td', product.name) + | |
| 60 | - content_tag('td', quantity, quantity_opts ) + | |
| 61 | - content_tag('td', get_price(product, environment, quantity), price_opts ) | |
| 62 | - ) | |
| 65 | + content_tag('td', product.name, name_opts) + | |
| 66 | + content_tag('td', quantity, quantity_opts ) + | |
| 67 | + content_tag('td', get_price(product, environment, quantity), price_opts) | |
| 68 | + ) | |
| 63 | 69 | end.join("\n") |
| 64 | 70 | |
| 65 | 71 | total = get_total_on_currency(items, environment) |
| ... | ... | @@ -72,6 +78,12 @@ module ShoppingCartPlugin::CartHelper |
| 72 | 78 | end |
| 73 | 79 | |
| 74 | 80 | def float_to_currency_cart(value, environment) |
| 75 | - number_to_currency(value, :unit => environment.currency_unit, :separator => environment.currency_separator, :delimiter => environment.currency_delimiter, :precision => 2, :format => "%u %n") | |
| 81 | + number_to_currency(value, :unit => environment.currency_unit, :separator => environment.currency_separator, :delimiter => environment.currency_delimiter, :precision => 2, :format => "%u%n") | |
| 82 | + end | |
| 83 | + | |
| 84 | + def select_delivery_options(options, environment) | |
| 85 | + options.map do |option, price| | |
| 86 | + ["#{option} (#{float_to_currency_cart(price, environment)})", option] | |
| 87 | + end | |
| 76 | 88 | end |
| 77 | 89 | end | ... | ... |
plugins/shopping_cart/lib/shopping_cart_plugin/mailer.rb
| 1 | 1 | class ShoppingCartPlugin::Mailer < Noosfero::Plugin::MailerBase |
| 2 | 2 | |
| 3 | - def customer_notification(customer, supplier, items) | |
| 3 | + def customer_notification(customer, supplier, items, delivery_option) | |
| 4 | 4 | domain = supplier.hostname || supplier.environment.default_hostname |
| 5 | 5 | recipients customer[:email] |
| 6 | 6 | from 'no-reply@' + domain |
| ... | ... | @@ -10,10 +10,11 @@ class ShoppingCartPlugin::Mailer < Noosfero::Plugin::MailerBase |
| 10 | 10 | body :customer => customer, |
| 11 | 11 | :supplier => supplier, |
| 12 | 12 | :items => items, |
| 13 | - :environment => supplier.environment | |
| 13 | + :environment => supplier.environment, | |
| 14 | + :delivery_option => delivery_option | |
| 14 | 15 | end |
| 15 | 16 | |
| 16 | - def supplier_notification(customer, supplier, items) | |
| 17 | + def supplier_notification(customer, supplier, items, delivery_option) | |
| 17 | 18 | domain = supplier.environment.default_hostname |
| 18 | 19 | recipients supplier.contact_email |
| 19 | 20 | from 'no-reply@' + domain |
| ... | ... | @@ -23,6 +24,7 @@ class ShoppingCartPlugin::Mailer < Noosfero::Plugin::MailerBase |
| 23 | 24 | body :customer => customer, |
| 24 | 25 | :supplier => supplier, |
| 25 | 26 | :items => items, |
| 26 | - :environment => supplier.environment | |
| 27 | + :environment => supplier.environment, | |
| 28 | + :delivery_option => delivery_option | |
| 27 | 29 | end |
| 28 | 30 | end | ... | ... |
| ... | ... | @@ -0,0 +1,30 @@ |
| 1 | +jQuery(document).ready(function(){ | |
| 2 | + jQuery("#cart-request-form").validate({ | |
| 3 | + submitHandler: function(form) { | |
| 4 | + jQuery(form).find('input.submit').attr('disabled', true); | |
| 5 | + jQuery('#cboxLoadingOverlay').show().addClass('loading'); | |
| 6 | + jQuery('#cboxLoadingGraphic').show().addClass('loading'); | |
| 7 | + } | |
| 8 | + }); | |
| 9 | +}); | |
| 10 | + | |
| 11 | +jQuery('#delivery_option').change(function(){ | |
| 12 | + jQuery('#cboxLoadingGraphic').show(); | |
| 13 | + me = this; | |
| 14 | + enterprise = jQuery(me).attr('data-profile-identifier'); | |
| 15 | + option = jQuery(me).val(); | |
| 16 | + jQuery.ajax({ | |
| 17 | + url: '/profile/'+ enterprise +'/plugin/shopping_cart/update_delivery_option', | |
| 18 | + dataType: "json", | |
| 19 | + data: 'delivery_option='+option, | |
| 20 | + success: function(data, st, ajax) { | |
| 21 | + jQuery('#delivery-price').text(data.delivery_price); | |
| 22 | + jQuery('.cart-table-total-value').text(data.total_price); | |
| 23 | + jQuery('#delivery-name').text(option); | |
| 24 | + jQuery('#cboxLoadingGraphic').hide(); | |
| 25 | + }, | |
| 26 | + error: function(ajax, st, errorThrown) { | |
| 27 | + alert('Update delivery option - HTTP '+st+': '+errorThrown); | |
| 28 | + }, | |
| 29 | + }); | |
| 30 | +}); | ... | ... |
| ... | ... | @@ -0,0 +1,16 @@ |
| 1 | +jQuery('#settings_delivery').click(function(){ | |
| 2 | + jQuery('#delivery_settings').toggle('fast'); | |
| 3 | +}); | |
| 4 | + | |
| 5 | +jQuery('#add-new-option').click(function(){ | |
| 6 | + new_option = jQuery('#empty-option').clone(); | |
| 7 | + new_option.removeAttr('id'); | |
| 8 | + jQuery('#add-new-option-row').before(new_option); | |
| 9 | + new_option.show(); | |
| 10 | + return false; | |
| 11 | +}); | |
| 12 | + | |
| 13 | +jQuery('.remove-option').live('click', function(){ | |
| 14 | + jQuery(this).closest('tr').remove(); | |
| 15 | + return false; | |
| 16 | +}); | ... | ... |
plugins/shopping_cart/views/shopping_cart_plugin/mailer/customer_notification.html.erb
plugins/shopping_cart/views/shopping_cart_plugin/mailer/supplier_notification.html.erb
plugins/shopping_cart/views/shopping_cart_plugin_myprofile/edit.html.erb
| ... | ... | @@ -3,9 +3,36 @@ |
| 3 | 3 | <% form_for(:settings, @settings, :url => {:action => 'edit'}, :html => {:method => 'post'}) do |f| %> |
| 4 | 4 | <%= labelled_form_field(_('Enabled?'), f.check_box(:enabled)) %> |
| 5 | 5 | <%= labelled_form_field(_('Delivery?'), f.check_box(:delivery)) %> |
| 6 | - <% display_delivery_options = @settings.delivery ? 'auto' : 'none' %> | |
| 7 | - <fieldset id='delivery_options' style="display: <%= display_delivery_options %>"><legend><%=_('Delivery Options')%></legend> | |
| 8 | - <%= labelled_form_field(_('Price:'), f.text_field(:delivery_price)) %> | |
| 6 | + <% display_delivery_settings = @settings.delivery ? 'auto' : 'none' %> | |
| 7 | + <fieldset id='delivery_settings' style="display: <%= display_delivery_settings %>"><legend><%=_('Delivery')%></legend> | |
| 8 | + <table> | |
| 9 | + <tr> | |
| 10 | + <th><%= _('Option') %></th> | |
| 11 | + <th><%= _('Price') %></th> | |
| 12 | + <th> </th> | |
| 13 | + </tr> | |
| 14 | + <% @settings.delivery_options.each do |option, price| %> | |
| 15 | + <tr> | |
| 16 | + <td><%= text_field_tag('settings[delivery_options][options][]', option, :style => 'width: 100%') %></td> | |
| 17 | + <td><%= text_field_tag('settings[delivery_options][prices][]', price, :style => 'width: 100%') %></td> | |
| 18 | + <td><%= button_without_text(:close, _('Remove option'), '', :class => 'remove-option') %></td> | |
| 19 | + </tr> | |
| 20 | + <% end %> | |
| 21 | + <tr> | |
| 22 | + <td><%= text_field_tag('settings[delivery_options][options][]', nil, :style => 'width: 100%') %></td> | |
| 23 | + <td><%= text_field_tag('settings[delivery_options][prices][]', nil, :style => 'width: 100%') %></td> | |
| 24 | + <td><%= button_without_text(:close, _('Remove option'), '', :class => 'remove-option') %></td> | |
| 25 | + </tr> | |
| 26 | + <tr id='add-new-option-row'> | |
| 27 | + <td colspan='3' style='background-color: #EEE; text-align: center'><%= link_to(_('ADD NEW OPTION'), '', :id => 'add-new-option') %></td> | |
| 28 | + </tr> | |
| 29 | + <tr id="empty-option" style='display: none'> | |
| 30 | + <td><%= text_field_tag('settings[delivery_options][options][]', nil, :style => 'width: 100%') %></td> | |
| 31 | + <td><%= text_field_tag('settings[delivery_options][prices][]', nil, :style => 'width: 100%') %></td> | |
| 32 | + <td><%= button_without_text(:close, _('Remove option'), '', :class => 'remove-option') %></td> | |
| 33 | + </tr> | |
| 34 | + </table> | |
| 35 | + | |
| 9 | 36 | <%= labelled_form_field(_('Free delivery price:'), f.text_field(:free_delivery_price)) %> |
| 10 | 37 | <%= content_tag('small', _('Empty stands for no free delivery price.')) %> |
| 11 | 38 | </fieldset> |
| ... | ... | @@ -17,8 +44,4 @@ |
| 17 | 44 | </div> |
| 18 | 45 | <% end%> |
| 19 | 46 | |
| 20 | -<script> | |
| 21 | - jQuery('#settings_delivery').click(function(){ | |
| 22 | - jQuery('#delivery_options').toggle('fast'); | |
| 23 | - }); | |
| 24 | -</script> | |
| 47 | +<%= javascript_include_tag '../plugins/shopping_cart/edit' %> | ... | ... |
plugins/shopping_cart/views/shopping_cart_plugin_profile/buy.html.erb
| ... | ... | @@ -6,6 +6,7 @@ |
| 6 | 6 | <%= labelled_form_field('* ' + _("Name"), f.text_field(:name, :class => 'required') ) %> |
| 7 | 7 | <%= labelled_form_field('* ' + _("Email"), f.text_field(:email, :class => 'required email') ) %> |
| 8 | 8 | <%= labelled_form_field('* ' + _("Contact phone"), f.text_field(:contact_phone, :class => 'required') ) %> |
| 9 | + <%= labelled_form_field(_('Delivery option'), select_tag(:delivery_option, options_for_select(select_delivery_options(@settings.delivery_options, environment)), 'data-profile-identifier' => profile.identifier)) if @settings.delivery && @settings.free_delivery_price && get_total(session[:cart][:items]) < @settings.free_delivery_price %> | |
| 9 | 10 | </div> |
| 10 | 11 | <% if @settings.delivery %> |
| 11 | 12 | <fieldset><legend><%=_('Delivery Address')%></legend> |
| ... | ... | @@ -18,20 +19,8 @@ |
| 18 | 19 | <%= submit_button(:send, _('Send buy request')) %> |
| 19 | 20 | </div> |
| 20 | 21 | <% end %> |
| 21 | - <%= items_table(session[:cart][:items], profile) %> | |
| 22 | + <%= items_table(session[:cart][:items], profile, @settings.delivery_options.first.first) %> | |
| 22 | 23 | <%= link_to '', '#', :onclick => "Cart.colorbox_close(this);", :class => 'cart-box-close icon-cancel' %> |
| 23 | 24 | </div> |
| 24 | 25 | |
| 25 | -<script type="text/javascript"> | |
| 26 | -//<![CDATA[ | |
| 27 | - jQuery(document).ready(function(){ | |
| 28 | - jQuery("#cart-request-form").validate({ | |
| 29 | - submitHandler: function(form) { | |
| 30 | - jQuery(form).find('input.submit').attr('disabled', true); | |
| 31 | - jQuery('#cboxLoadingOverlay').show().addClass('loading'); | |
| 32 | - jQuery('#cboxLoadingGraphic').show().addClass('loading'); | |
| 33 | - } | |
| 34 | - }); | |
| 35 | - }); | |
| 36 | -//]]> | |
| 37 | -</script> | |
| 26 | +<%= javascript_include_tag '../plugins/shopping_cart/buy' %> | ... | ... |