camaleon_ecommerce 1.2.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/plugins/ecommerce/switch.png +0 -0
  3. data/app/assets/javascripts/plugins/ecommerce/admin_product.js.coffee +1 -1
  4. data/app/assets/javascripts/plugins/ecommerce/admin_settings.js +16 -0
  5. data/app/assets/javascripts/plugins/ecommerce/cart.js +1 -0
  6. data/app/assets/javascripts/plugins/ecommerce/jquery.multi-select.js +535 -0
  7. data/app/assets/stylesheets/plugins/ecommerce/multi-select.css.scss +94 -0
  8. data/app/controllers/plugins/ecommerce/admin/orders_controller.rb +37 -20
  9. data/app/controllers/plugins/ecommerce/admin/settings_controller.rb +2 -2
  10. data/app/controllers/plugins/ecommerce/front/checkout_controller.rb +16 -15
  11. data/app/decorators/plugins/ecommerce/cart_decorator.rb +19 -0
  12. data/app/decorators/plugins/ecommerce/order_decorator.rb +70 -0
  13. data/app/decorators/plugins/ecommerce/product_decorator.rb +16 -9
  14. data/app/decorators/plugins/ecommerce/product_item_decorator.rb +5 -1
  15. data/app/helpers/plugins/ecommerce/ecommerce_email_helper.rb +60 -59
  16. data/app/helpers/plugins/ecommerce/ecommerce_functions_helper.rb +5 -10
  17. data/app/helpers/plugins/ecommerce/ecommerce_helper.rb +12 -3
  18. data/app/models/plugins/ecommerce/cart.rb +3 -25
  19. data/app/models/plugins/ecommerce/order.rb +0 -21
  20. data/app/models/plugins/ecommerce/payment_method.rb +4 -0
  21. data/app/models/plugins/ecommerce/shipping_method.rb +4 -1
  22. data/app/services/plugins/ecommerce/cart_service.rb +0 -9
  23. data/app/views/plugins/ecommerce/admin/orders/index.html.erb +47 -51
  24. data/app/views/plugins/ecommerce/admin/orders/show.html.erb +1 -1
  25. data/app/views/plugins/ecommerce/admin/payment_methods/form.html.erb +2 -6
  26. data/app/views/plugins/ecommerce/admin/payment_methods/index.html.erb +4 -6
  27. data/app/views/plugins/ecommerce/admin/settings/index.html.erb +60 -20
  28. data/app/views/plugins/ecommerce/admin/shipping_methods/form.html.erb +1 -5
  29. data/app/views/plugins/ecommerce/admin/shipping_methods/index.html.erb +2 -4
  30. data/app/views/plugins/ecommerce/front/checkout/cart_index.html.erb +2 -2
  31. data/app/views/plugins/ecommerce/front/checkout/index.html.erb +1 -1
  32. data/app/views/plugins/ecommerce/front/login.html.erb +1 -1
  33. data/app/views/plugins/ecommerce/front/orders/index.html.erb +2 -2
  34. data/app/views/plugins/ecommerce/front/orders/show.html.erb +13 -14
  35. data/app/views/plugins/ecommerce/partials/checkout/_details.html.erb +1 -1
  36. data/app/views/plugins/ecommerce/partials/checkout/_payments.html.erb +116 -110
  37. data/app/views/plugins/ecommerce/partials/checkout/_products_detail.html.erb +5 -2
  38. data/app/views/plugins/ecommerce/partials/checkout/_user_info.html.erb +0 -1
  39. data/app/views/plugins/ecommerce/partials/email/_billing_address.html.erb +11 -0
  40. data/app/views/plugins/ecommerce/partials/email/_product_table.html.erb +46 -0
  41. data/app/views/plugins/ecommerce/partials/email/_shipping_address.html.erb +11 -0
  42. data/app/views/{plugins/ecommerce/partials → post_types/commerce}/_cart_widget.html.erb +0 -0
  43. data/app/views/post_types/commerce/_product_info.html.erb +30 -32
  44. data/app/views/post_types/commerce/single.html.erb +9 -13
  45. data/config/camaleon_plugin.json +2 -1
  46. data/config/custom_models.rb +43 -0
  47. data/config/locales/en.yml +0 -1
  48. data/config/locales/es.yml +69 -7
  49. data/config/routes.rb +1 -0
  50. data/db/migrate/20161213222142_add_invoice_number.rb +6 -0
  51. data/db/migrate/20161214224919_remove_ecommerce_stock_field.rb +7 -0
  52. data/lib/ecommerce/engine.rb +4 -2
  53. data/lib/ecommerce/version.rb +1 -1
  54. metadata +58 -15
  55. data/app/assets/javascripts/plugins/ecommerce/jquery.creditCardValidator.js +0 -208
  56. data/app/services/plugins/ecommerce/order_service.rb +0 -26
  57. data/app/views/camaleon_cms/html_mailer/order_canceled.html.erb +0 -2
  58. data/app/views/camaleon_cms/html_mailer/order_confirmed.html.erb +0 -2
  59. data/app/views/camaleon_cms/html_mailer/order_received.html.erb +0 -5
  60. data/app/views/camaleon_cms/html_mailer/order_received_admin.html.erb +0 -3
  61. data/app/views/camaleon_cms/html_mailer/order_shipped.html.erb +0 -2
  62. data/app/views/camaleon_cms/html_mailer/recovery_cart.html.erb +0 -4
@@ -4,6 +4,10 @@ class Plugins::Ecommerce::ProductItemDecorator < Draper::Decorator
4
4
  get_product.the_variation_title(object.variation_id)
5
5
  end
6
6
 
7
+ def the_url
8
+ get_product.the_url(variation_id: object.variation_id)
9
+ end
10
+
7
11
  def the_sub_total
8
12
  h.e_parse_price(object.sub_total)
9
13
  end
@@ -43,6 +47,6 @@ class Plugins::Ecommerce::ProductItemDecorator < Draper::Decorator
43
47
  # verify if the quantity of the cart item is avilable
44
48
  # return true if quantity is available
45
49
  def is_valid_qty?
46
- (get_product.the_qty_real(object.variation_id) - object.qty).to_i >= 0
50
+ (get_product.the_qty(object.variation_id) - object.qty).to_i >= 0
47
51
  end
48
52
  end
@@ -1,49 +1,17 @@
1
1
  module Plugins::Ecommerce::EcommerceEmailHelper
2
2
  include CamaleonCms::EmailHelper
3
3
 
4
- def mark_order_like_received(cart, status = 'paid')
5
- cart_service = Plugins::Ecommerce::CartService.new(current_site, cart)
6
- order = cart_service.convert_to_order(status)
7
-
8
- # send email to buyer
9
- commerce_send_order_received_email(order)
10
-
11
- # Send email to products owner
12
- commerce_send_order_received_admin_notice(order)
13
-
14
- flash[:notice] = t('plugins.ecommerce.messages.payment_completed', default: "Payment completed successfully")
15
- args = {order: order}; hooks_run("commerce_after_payment_completed", args)
16
-
4
+ # mark current cart into order with specific status
5
+ def commerce_mark_cart_received(cart, status = 'paid')
6
+ args = {cart: cart, status: status}; hooks_run('commerce_before_payment_completed', args)
7
+ order = cart.convert_to_order(status)
8
+ order.set_meta('locale', I18n.locale)
9
+ commerce_order_send_mail(order)
10
+ flash[:cama_ecommerce][:notice] = t('plugins.ecommerce.messages.payment_completed', default: "Payment completed successfully")
11
+ args = {order: order, status: status}; hooks_run("commerce_after_payment_completed", args)
17
12
  order
18
13
  end
19
14
 
20
- def commerce_send_order_received_email(order, is_after_bank_confirmation = false)
21
- data = _commerce_prepare_send_order_email_data(order)
22
- if is_after_bank_confirmation
23
- cama_send_email(order.user.email, t('plugins.ecommerce.mail.order_confirmed.subject'), {template_name: 'order_confirmed', extra_data: data[:extra_data], attachs: data[:files]})
24
- else
25
- data.delete(:files) unless order.paid?
26
- cama_send_email(order.user.email, t('plugins.ecommerce.email.order_received.subject'), {template_name: 'order_received', extra_data: data[:extra_data], attachs: data[:files]})
27
- end
28
- end
29
-
30
- def commerce_send_order_received_admin_notice(order)
31
- data = _commerce_prepare_send_order_email_data(order)
32
- data[:owners].each do |user|
33
- data[:extra_data][:admin] = user
34
- cama_send_email(user.email, t('plugins.ecommerce.email.order_received_admin.subject'), {template_name: 'order_received_admin', extra_data: data[:extra_data], attachs: data[:files]})
35
- end
36
- end
37
-
38
- def send_recovery_cart_email(order)
39
- extra_data = {
40
- :fullname => order.user.fullname,
41
- :order => order
42
- }
43
- send_email(order.user.email, t('plugins.ecommerce.email.recovery_cart.subject'), '', nil, [], 'recovery_cart', nil, extra_data)
44
- Rails.logger.info "Send recovery to #{order.user.email} with order #{order.slug}"
45
- end
46
-
47
15
  # return translated message
48
16
  def commerce_coupon_error_message(error_code, coupon = nil)
49
17
  case error_code
@@ -70,7 +38,7 @@ module Plugins::Ecommerce::EcommerceEmailHelper
70
38
  cart.product_items.decorate.each do |item|
71
39
  unless item.is_valid_qty?
72
40
  product = item.product.decorate
73
- errors << t('plugins.ecommerce.messages.not_enough_product_qty', product: product.the_title, qty: product.the_qty_real, default: 'There is not enough products "%{product}" (Available %{qty})')
41
+ errors << t('plugins.ecommerce.messages.not_enough_product_qty', product: product.the_variation_title(item.variation_id), qty: product.the_qty(item.variation_id), default: 'There is not enough products "%{product}" (Available %{qty})')
74
42
  end
75
43
  end
76
44
 
@@ -85,24 +53,57 @@ module Plugins::Ecommerce::EcommerceEmailHelper
85
53
  errors
86
54
  end
87
55
 
88
- private
89
- def _commerce_prepare_send_order_email_data(order)
90
- data = {}
91
- data[:extra_data] = {
92
- :fullname => order.user.fullname,
93
- :order_slug => order.slug,
94
- :order_url => plugins_ecommerce_order_show_url(order: order.slug),
95
- :billing_information => order.get_meta('billing_address'),
96
- :shipping_address => order.get_meta('shipping_address'),
97
- :subtotal => order.cache_the_sub_total,
98
- :total_cost => order.cache_the_total,
99
- :order => order,
100
- :order_details_html => render_to_string(file: 'plugins/ecommerce/front/orders/show', layout: false, locals: {as_partial: true, order: order.decorated? ? order : order.decorate})
56
+ # send the email to the user for specific events or status
57
+ # event: (String) email_order_received | email_order_shipped | email_order_cancelled | email_order_confirmed_bank | email_order_confirmed_on_delivery
58
+ def commerce_order_send_mail(order, event = 'email_order_received')
59
+ bk_l = I18n.locale
60
+ I18n.locale = order.get_meta('locale', 'en').to_s
61
+ subject, content_key = case event
62
+ when 'email_order_received'
63
+ [I18n.t('plugins.ecommerce.email.order_received_label', default: 'Order Received'), 'email_order_received']
64
+ when 'email_order_confirmed'
65
+ [I18n.t('plugins.ecommerce.email.order_confirmed_label', default: 'Order Confirmed'), 'email_order_confirmed']
66
+ when 'email_order_confirmed_bank'
67
+ [I18n.t('plugins.ecommerce.email.order_bank_confirmed_label', default: 'Order Bank Confirmed'), 'email_order_confirmed']
68
+ when 'email_order_confirmed_on_delivery'
69
+ [I18n.t('plugins.ecommerce.email.order_on_delivery_confirmed_label', default: 'Order on Delivery Confirmed'), 'email_order_confirmed']
70
+ when 'email_order_shipped'
71
+ [I18n.t('plugins.ecommerce.email.order_shipped_label', default: 'Order Shipped'), 'email_order_shipped']
72
+ when 'email_order_cancelled'
73
+ [I18n.t('plugins.ecommerce.email.order_cancelled_label', default: 'Order Cancelled'), 'email_order_cancelled']
74
+ end
75
+ data = {template_name: nil, content: current_site.e_email_for(content_key).to_s.translate, files: []}
76
+ replaces = {
77
+ order_table: render_to_string(partial: 'plugins/ecommerce/partials/email/product_table', locals: {order: order}),
78
+ shipping_info: render_to_string(partial: 'plugins/ecommerce/partials/email/shipping_address', locals: {order: order}),
79
+ billing_info: render_to_string(partial: 'plugins/ecommerce/partials/email/billing_address', locals: {order: order}),
80
+ cancelled_description: order.get_meta('description').to_s,
81
+ root_url: current_site.the_url,
82
+ date: order.the_created_at,
83
+ current_date: l(Date.today, format: :long),
84
+ number: order.slug,
85
+ name: order.user.first_name,
86
+ full_name: order.user.fullname,
87
+ tracking_url: order.the_url_tracking.to_s,
88
+ shipping_name: order.the_shipping_method.to_s,
89
+ invoice_number: order.invoice_number.to_s,
90
+ status: order.the_status,
91
+ url: order.the_url
101
92
  }
102
- order_service = Plugins::Ecommerce::OrderService.new(current_site, order)
103
- data[:owners] = order_service.product_owners
104
- data[:files] = order_service.product_files
105
- data
106
- end
93
+ args={order: order, replaces: replaces}; hooks_run('commerce_custom_email_replacements', args) # permit to add custom replacements
107
94
 
95
+ if order.status == 'paid'
96
+ order.products.each do |product|
97
+ data[:files] += product.get_fields('ecommerce_files').map{|f| CamaleonCmsLocalUploader::private_file_path(f, current_site) }
98
+ end
99
+ data[:files] = data[:files].uniq
100
+ pdf_path = order.the_invoice_path
101
+ data[:ecommerce_invoice] = {pdf_path: pdf_path, html: current_site.e_email_for('email_order_invoice').to_s.translate.to_s.cama_replace_codes(replaces, format_code = '{')}
102
+ data[:files] << pdf_path
103
+ order.update_column(:invoice_path, pdf_path.split('/').last)
104
+ end
105
+ data[:content] = data[:content].to_s.cama_replace_codes(replaces, format_code = '{')
106
+ cama_send_email(order.user.email, subject, data)
107
+ I18n.locale = bk_l
108
+ end
108
109
  end
@@ -1,10 +1,5 @@
1
1
  #encoding: utf-8
2
2
  module Plugins::Ecommerce::EcommerceFunctionsHelper
3
- # return the settings for ecommerce (Hash)
4
- def ecommerce_get_settings
5
- current_site.get_meta("_setting_ecommerce", {})
6
- end
7
-
8
3
  # return the visitor key which is used to relate the cart until login/register
9
4
  def ecommerce_get_visitor_key
10
5
  cookies[:e_cart_id] ||= cama_get_session_id unless cama_current_user.present?
@@ -17,12 +12,12 @@ module Plugins::Ecommerce::EcommerceFunctionsHelper
17
12
 
18
13
  # return all shipping country codes supported for shipping
19
14
  def e_shipping_countries
20
- ecommerce_get_settings[:shipping_countries] || ISO3166::Country.codes
15
+ current_site.e_settings[:shipping_countries] || ISO3166::Country.codes
21
16
  end
22
17
 
23
18
  # return (Array) all the currencies for visitors
24
19
  def e_visitor_unit_currencies
25
- ecommerce_get_settings[:visitor_unit_currencies] || ['USD']
20
+ current_site.e_settings[:visitor_unit_currencies] || ['USD']
26
21
  end
27
22
 
28
23
  # draw a select dropdown with all frontend currencies and actions to change current currency
@@ -61,13 +56,13 @@ module Plugins::Ecommerce::EcommerceFunctionsHelper
61
56
 
62
57
  # return the currency defined for admin panel
63
58
  def e_system_currency
64
- ecommerce_get_settings[:current_unit] || 'USD'
59
+ current_site.e_settings[:current_unit] || 'USD'
65
60
  end
66
61
 
67
62
  # render price formatted of a product with current currency
68
63
  def e_parse_price(price)
69
64
  currency = cama_is_admin_request? ? e_system_currency : e_current_visitor_currency
70
- args = {currency: currency, price: price, data: "#{currency} #{sprintf('%.2f', e_parse_to_current_currency(price))}"}; hooks_run('ecommerce_parse_price', args) # permit to customize price format
65
+ args = {currency: currency, price: price, data: number_to_currency(e_parse_to_current_currency(price), unit: currency)}; hooks_run('ecommerce_parse_price', args) # permit to customize price format
71
66
  args[:data]
72
67
  end
73
68
 
@@ -275,7 +270,7 @@ module Plugins::Ecommerce::EcommerceFunctionsHelper
275
270
 
276
271
  def ecommerce_draw_breadcrumb
277
272
  res = '<ol class="breadcrumb" style="margin: 0;">'
278
- @ecommerce_breadcrumb.each_with_index do |m, index|
273
+ (@ecommerce_breadcrumb || []).each_with_index do |m, index|
279
274
  if m[1].present?
280
275
  res << "<li class='#{"active" if @ecommerce_breadcrumb.size == index+1}'><a href='#{m[1]}'>#{m[0]}</a></li>"
281
276
  else
@@ -36,8 +36,9 @@ module Plugins::Ecommerce::EcommerceHelper
36
36
  items_i << {icon: "taxi", title: t('plugins.ecommerce.shipping_methods', default: 'Shipping Methods'), url: admin_plugins_ecommerce_shipping_methods_path}
37
37
  items_i << {icon: "credit-card", title: t('plugins.ecommerce.payment_methods', default: 'Payment Methods'), url: admin_plugins_ecommerce_payment_methods_path}
38
38
  items_i << {icon: "tag", title: t('plugins.ecommerce.coupons', default: 'Coupons'), url: admin_plugins_ecommerce_coupons_path}
39
- items_i << {icon: "cogs", title: t('camaleon_cms.admin.button.settings', default: 'Settings'), url: admin_plugins_ecommerce_settings_path}
40
39
  items_i << {icon: "cubes", title: t('plugins.ecommerce.product_attributes', default: 'Product Attributes'), url: admin_plugins_ecommerce_product_attributes_path}
40
+ items_i << {icon: "cogs", title: t('camaleon_cms.admin.button.settings', default: 'Settings'), url: admin_plugins_ecommerce_settings_path}
41
+ hooks_run('plugin_ecommerce_after_menus', items_i) # permit to add menus for ecommerce plugin
41
42
  end
42
43
 
43
44
  admin_menu_insert_menu_after("content", "e-commerce", {icon: "shopping-cart", title: t('plugins.ecommerce.e_commerce', default: 'E-commerce'), url: "", items: items_i}) if items_i.present?
@@ -47,6 +48,13 @@ module Plugins::Ecommerce::EcommerceHelper
47
48
  def ecommerce_app_before_load
48
49
  end
49
50
 
51
+ # permit to generate invoice PDF by background just before delivery email
52
+ def ecommerce_admin_before_email_send(args)
53
+ if args[:ecommerce_invoice].present?
54
+ File.open(args[:ecommerce_invoice][:pdf_path], 'wb'){|file| file << WickedPdf.new.pdf_from_string(args[:ecommerce_invoice][:html], encoding: 'utf8') }
55
+ end
56
+ end
57
+
50
58
  # here all actions on plugin destroying
51
59
  # plugin: plugin model
52
60
  def ecommerce_on_destroy(plugin)
@@ -74,7 +82,7 @@ module Plugins::Ecommerce::EcommerceHelper
74
82
  # verify no deletable variances
75
83
  no_deletable_variances = false
76
84
  args[:post].product_variations.where.not(id: params[:product_variation].keys).each{|prod| no_deletable_variances = true unless prod.destroy }
77
- flash[:warning] += cama_t('plugins.ecommerce.variations.not_deletable_product_variations') if no_deletable_variances
85
+ flash[:warning] += t('plugins.ecommerce.variations.not_deletable_product_variations', default: 'Some Product variations can not be deleted.') if no_deletable_variances
78
86
 
79
87
  params[:product_variation].each do |p_key, p_var|
80
88
  data = {amount: p_var[:price], photo: p_var[:photo], sku: p_var[:sku], weight: p_var[:weight], qty: p_var[:qty], attribute_ids: (p_var[:attributes] || []).map{|at| at[:value] }.join(',')}
@@ -124,7 +132,8 @@ module Plugins::Ecommerce::EcommerceHelper
124
132
  group.add_manual_field({"name" => "t('plugins.ecommerce.product.price', default: 'Price')", "slug" => "ecommerce_price", "description" => "t('plugins.ecommerce.product.current_unit', default: 'Current unit: %{unit}', unit: current_site.current_unit.to_s)"}, {field_key: "numeric", required: true, label_eval: true})
125
133
  group.add_manual_field({"name" => "t('plugins.ecommerce.product.tax', default: 'Tax')", "slug" => "ecommerce_tax"}, {field_key: "select_eval", required: false, command: "options_from_collection_for_select(current_site.tax_rates.all, \"id\", \"the_name\")", label_eval: true})
126
134
  group.add_manual_field({"name" => "t('plugins.ecommerce.product.weight', default: 'Weight')", "slug" => "ecommerce_weight", "description" => "t('plugins.ecommerce.product.current_weight', default: 'Current weight: %{weight}', weight: current_site.current_weight.to_s)"}, {field_key: "text_box", required: true, label_eval: true})
127
- group.add_manual_field({"name" => "t('plugins.ecommerce.product.stock', default: 'Stock')", "slug" => "ecommerce_stock"}, {field_key: "checkbox", default: true, label_eval: true})
135
+ # changed to validate using the quantity of the inventory
136
+ # group.add_manual_field({"name" => "t('plugins.ecommerce.product.stock', default: 'Stock')", "slug" => "ecommerce_stock"}, {field_key: "checkbox", default: true, label_eval: true})
128
137
  group.add_manual_field({"name" => "t('plugins.ecommerce.product.qty', default: 'Quantity')", "slug" => "ecommerce_qty"}, {field_key: "numeric", required: true, label_eval: true})
129
138
  group.add_manual_field({"name" => "t('plugins.ecommerce.product.files', default: 'Product files')", "slug" => "ecommerce_files"}, {field_key: "private_file", multiple: true, required: false, label_eval: true})
130
139
  end
@@ -8,6 +8,7 @@ class Plugins::Ecommerce::Cart < ActiveRecord::Base
8
8
 
9
9
  belongs_to :site, :class_name => "CamaleonCms::Site", foreign_key: :site_id
10
10
  belongs_to :user, :class_name => "CamaleonCms::User", foreign_key: :user_id
11
+ belongs_to :shipping_method, class_name: 'Plugins::Ecommerce::ShippingMethod'
11
12
  scope :active_cart, ->{ where("#{Plugins::Ecommerce::Cart.table_name}.updated_at >= ?", 24.hours.ago) }
12
13
 
13
14
  after_create :generate_slug
@@ -16,7 +17,6 @@ class Plugins::Ecommerce::Cart < ActiveRecord::Base
16
17
  # paid => paid by some method
17
18
  # canceled => canceled order
18
19
  # shipped => shipped status
19
- # accepted => received status
20
20
 
21
21
  def payment_method
22
22
  @_cama_cache_payment_method ||= Plugins::Ecommerce::PaymentMethod.find_by_id(get_meta('payment_method_id', self.payment_method_id))
@@ -32,11 +32,6 @@ class Plugins::Ecommerce::Cart < ActiveRecord::Base
32
32
  pi
33
33
  end
34
34
 
35
- # return the product titles in array format
36
- def products_title
37
- product_items.map{|i| p=i.product.decorate; p.the_variation_title(i.variation_id) }.join(', ')
38
- end
39
-
40
35
  def items_total
41
36
  product_items.map{|item| item.qty }.inject{|sum,x| sum + x } || 0
42
37
  end
@@ -79,8 +74,8 @@ class Plugins::Ecommerce::Cart < ActiveRecord::Base
79
74
  res[:discount] = opts[:amount].to_f
80
75
  end
81
76
  end
82
- else
83
- res[:error] = 'coupon_not_found'
77
+ # else
78
+ # res[:error] = 'coupon_not_found'
84
79
  end
85
80
  res
86
81
  end
@@ -94,16 +89,6 @@ class Plugins::Ecommerce::Cart < ActiveRecord::Base
94
89
  end
95
90
  end
96
91
 
97
- # convert into order current cart
98
- def convert_to_order
99
- self.update_columns(kind: 'order', created_at: Time.current)
100
- site.orders.find(self.id)
101
- end
102
-
103
- def shipping_method
104
- Plugins::Ecommerce::ShippingMethod.find_by_id(self.shipping_method_id)
105
- end
106
-
107
92
  # return the total price without coupon price
108
93
  def total_to_pay_without_discounts
109
94
  sub_total + tax_total + total_shipping
@@ -180,13 +165,6 @@ class Plugins::Ecommerce::Cart < ActiveRecord::Base
180
165
  )
181
166
  end
182
167
 
183
- def mark_paid(status = 'paid')
184
- self.update_columns(
185
- status: status,
186
- paid_at: Time.current,
187
- )
188
- end
189
-
190
168
  # return the gateway for paypal transactions
191
169
  def paypal_gateway
192
170
  ActiveMerchant::Billing::Base.mode = payment_method.options[:paypal_sandbox].to_s.to_bool ? :test : :production
@@ -18,27 +18,14 @@ class Plugins::Ecommerce::Order < Plugins::Ecommerce::Cart
18
18
  status == 'accepted'
19
19
  end
20
20
 
21
- def accepted!
22
- update_columns({status: 'accepted', accepted_at: Time.current})
23
- end
24
-
25
21
  def shipped?
26
22
  status == 'shipped'
27
23
  end
28
24
 
29
- def shipped!(code)
30
- update_columns({status: 'shipped', shipped_at: Time.current})
31
- set_meta('consignment_number', code)
32
- end
33
-
34
25
  def canceled?
35
26
  status == 'canceled'
36
27
  end
37
28
 
38
- def canceled!
39
- update_columns({status: 'canceled', shipped_at: Time.current})
40
- end
41
-
42
29
  def received?
43
30
  status == 'received'
44
31
  end
@@ -51,14 +38,6 @@ class Plugins::Ecommerce::Order < Plugins::Ecommerce::Cart
51
38
  status == 'on_delivery'
52
39
  end
53
40
 
54
- def bank_confirmed!
55
- update_columns({status: 'paid', updated_at: Time.current})
56
- end
57
-
58
- def on_delivery_confirmed!
59
- update_columns({status: 'paid', updated_at: Time.current})
60
- end
61
-
62
41
  def payment_data
63
42
  get_meta('payment_data', {})
64
43
  end
@@ -4,6 +4,10 @@ class Plugins::Ecommerce::PaymentMethod < CamaleonCms::TermTaxonomy
4
4
 
5
5
  scope :actives, -> {where(status: '1')}
6
6
 
7
+ def skip_slug_validation?
8
+ true
9
+ end
10
+
7
11
  def method_text
8
12
  if options[:type] == 'paypal'
9
13
  I18n.t 'plugins.ecommerce.by_paypal', default: 'Paypal'
@@ -1,9 +1,12 @@
1
1
  class Plugins::Ecommerce::ShippingMethod < CamaleonCms::TermTaxonomy
2
2
  default_scope { where(taxonomy: :ecommerce_shipping_method) }
3
3
  belongs_to :site, :class_name => "CamaleonCms::Site", foreign_key: :parent_id
4
-
5
4
  scope :actives, -> {where(status: '1')}
6
5
 
6
+ def skip_slug_validation?
7
+ true
8
+ end
9
+
7
10
  def get_price_from_weight(weight = 0)
8
11
  price_total = 0
9
12
  prices = get_meta("prices")
@@ -124,13 +124,4 @@ class Plugins::Ecommerce::CartService
124
124
  {error: e.message}
125
125
  end
126
126
  end
127
-
128
- def convert_to_order(status = 'paid')
129
- Plugins::Ecommerce::Cart.transaction do
130
- cart.prepare_to_pay
131
- cart.update_amounts
132
- cart.mark_paid(status)
133
- cart.convert_to_order
134
- end
135
- end
136
127
  end
@@ -4,36 +4,39 @@
4
4
  </div>
5
5
 
6
6
  <div class="panel-body">
7
- <%= form_tag(url_for(action: :index), class: 'pull-right', method: 'get') do %>
8
- <div class="input-group" id="adv-search">
9
- <input type="text" class="form-control" placeholder="<%= t('plugins.ecommerce.search_order_number') %>" name="q" value="<%= params[:q] %>"/>
10
- <div class="input-group-btn">
11
- <button type="button" title="<%= t('plugins.ecommerce.advanced_search', default: 'Advanced Search') %>" class="btn btn-default" id="ecommerce_adv_search_btn"><span class="caret"></span></button>
12
- <button type="submit" class="btn btn-primary"><span class="fa fa-search"></span></button>
13
- </div>
7
+ <%= search_form_for @q, url: url_for(action: :index), class: 'row' do |f| %>
8
+ <div class="col-md-3">
9
+ <%= f.label :user_email_or_slug_or_coupon_cont, t('.search_field', default: 'Email or Number or Coupon') %>
10
+ <%= f.search_field :user_email_or_slug_or_coupon_cont, class: 'form-control' %>
14
11
  </div>
15
- <% end %>
16
- <div class="hidden" id="commerce_adv_search_modal">
17
- <%= form_tag(url_for(action: :index), method: :get) do %>
18
- <div class="form-group">
19
- <label for="contain"><%= t('plugins.ecommerce.table.customer') %> </label>
20
- <input class="form-control" type="text" name="c" value="<%= params[:c] %>"/>
21
- </div>
22
- <div class="form-group">
23
- <label for="contain"><%= t('plugins.ecommerce.e_mail_address') %></label>
24
- <input class="form-control" type="email" name="e" value="<%= params[:e] %>"/>
12
+ <div class="col-md-2">
13
+ <%= f.label :created_at_gteq, t('.created_after', default: 'Created After') %>
14
+ <div class='input-group date date_field_w'>
15
+ <%= f.text_field :created_at_gteq, class: 'form-control ' %>
16
+ <span class='add-on input-group-addon'><span class='glyphicon glyphicon-calendar'></span></span>
25
17
  </div>
26
- <!--<div class="form-group">-->
27
- <!--<label for="contain"><%= t('plugins.ecommerce.phone_number') %></label>-->
28
- <!--<input class="form-control" type="text" name="p" value="<%= params[:p] %>"/>-->
29
- <!--</div>-->
30
- <div class="form-group">
31
- <label for="contain"><%= t('plugins.ecommerce.table.status') %></label>
32
- <%= select_tag "s", options_for_select([[""], [t('plugins.ecommerce.select.accepted'), "accepted"], [cama_t('plugins.ecommerce.select.shipped'), "shipped"], [cama_t('plugins.ecommerce.select.canceled'), "canceled"], [cama_t('plugins.ecommerce.select.paid'), "paid"], [cama_t('plugins.ecommerce.select.pending'), "on_delivery|bank_pending"]], params[:s]), class: 'form-control' %>
18
+ </div>
19
+ <div class="col-md-2">
20
+ <%= f.label :created_at_lteq, t('.created_before', default: 'Created Before') %>
21
+ <div class='input-group date date_field_w'>
22
+ <%= f.text_field :created_at_lteq, class: 'form-control ' %>
23
+ <span class='add-on input-group-addon'><span class='glyphicon glyphicon-calendar'></span></span>
33
24
  </div>
34
- <button type="submit" class="btn btn-primary"><span class="fa fa-search" aria-hidden="true"></span> <%= t("camaleon_cms.admin.button.search") %></button>
35
- <% end %>
36
- </div>
25
+ </div>
26
+ <div class="col-md-2">
27
+ <%= f.label :status_eq, t('.search_status', default: 'Status') %>
28
+ <%= f.select :status_eq, [[t('plugins.ecommerce.select.shipped', default: 'Shipped'), "shipped"], [t('plugins.ecommerce.select.canceled', default: 'Cancelled'), "canceled"], [t('plugins.ecommerce.select.paid', default: 'Paid'), "paid"], [t('plugins.ecommerce.messages.order_status.bank_pending', default: 'Bank Pending'), "bank_pending"], [t('plugins.ecommerce.by_on_delivery', default: 'Payment no Delivery'), "on_delivery"]], {include_blank: true}, class: 'form-control' %>
29
+ </div>
30
+ <div class="col-md-2">
31
+ <%= f.label :user_id_eq, t('.search_user', default: 'User') %>
32
+ <%= f.collection_select :user_id_eq, current_site.users.where(id: current_site.orders.pluck(:user_id)).decorate, :id, :the_name, {include_blank: true}, class: 'form-control' %>
33
+ </div>
34
+ <div class="col-md-1 text-left">
35
+ <label>&nbsp;</label><br>
36
+ <button type="submit" class="btn btn-primary"><span class="fa fa-search"></span></button>
37
+ </div>
38
+ <% end %>
39
+ <hr>
37
40
  <div class="hidden" id="commerce_cancel_modal">
38
41
  <%= form_tag '#' do %>
39
42
  <div class="form-group">
@@ -61,22 +64,19 @@
61
64
  <table class="table">
62
65
  <thead>
63
66
  <tr>
64
- <th><%= cama_t('plugins.ecommerce.table.id') %></th>
65
- <th><%= cama_t('plugins.ecommerce.table.customer') %></th>
66
- <th><%= cama_t('plugins.ecommerce.table.status') %></th>
67
- <th><%= cama_t('plugins.ecommerce.table.paid') %></th>
68
- <th><%= cama_t('plugins.ecommerce.table.products') %></th>
69
- <th><%= cama_t('plugins.ecommerce.table.amount') %></th>
70
- <th><%= cama_t('plugins.ecommerce.table.created_at') %></th>
71
- <th><%= cama_t('plugins.ecommerce.table.payment_method') %></th>
72
- <th><%= cama_t('camaleon_cms.admin.table.actions') %></th>
67
+ <th><%= t('plugins.ecommerce.table.id', default: 'Id') %></th>
68
+ <th><%= t('plugins.ecommerce.table.customer', default: 'Customer') %></th>
69
+ <th><%= t('plugins.ecommerce.table.status', default: 'Status') %></th>
70
+ <th><%= t('plugins.ecommerce.table.paid', default: 'Paid?') %></th>
71
+ <th><%= t('plugins.ecommerce.table.products', default: 'Products') %></th>
72
+ <th><%= t('plugins.ecommerce.table.amount', default: 'Amount') %></th>
73
+ <th><%= t('plugins.ecommerce.table.created_at', default: 'Created at') %></th>
74
+ <th><%= t('plugins.ecommerce.table.payment_method', default: 'Payment Method') %></th>
75
+ <th><%= t('camaleon_cms.admin.table.actions', default: 'Actions') %></th>
73
76
  </tr>
74
77
  </thead>
75
78
  <tbody>
76
- <%
77
- @orders.each do |order|
78
- order = order.decorate
79
- %>
79
+ <% amount = 0; @orders.each do |order| order = order.decorate; amount += order.amount %>
80
80
  <tr>
81
81
  <td><%= order.slug %></td>
82
82
  <td>
@@ -94,7 +94,7 @@
94
94
  <% end %>
95
95
  </td>
96
96
  <td><%= order.cache_the_total %></td>
97
- <td><%= order.created_at %></td>
97
+ <td><%= order.the_created_at %></td>
98
98
  <td><%= order.payment_method.name rescue "" %></td>
99
99
  <td>
100
100
  <%= link_to raw('<i class="fa fa-eye"></i>'), {action: :show, id: order.slug}, class: "btn btn-info btn-xs", title: "#{t('camaleon_cms.admin.button.preview')}" %>
@@ -103,7 +103,8 @@
103
103
  <div class="btn-group">
104
104
  <button class="btn btn-info btn-xs dropdown-toggle" data-toggle="dropdown" aria-expanded="false" title="<%= t('camaleon_cms.admin.button.settings') %>"><i class="fa fa-cog"></i></button>
105
105
  <ul class="dropdown-menu pull-right" style="min-width: 50px;">
106
- <%= content_tag :li, link_to(t('plugins.ecommerce.table.make_accepted', default: 'Mark as Accepted'), url_for(action: :mark_accepted, order_id: order.slug), class: 'btn btn-xs') if order.paid? %>
106
+ <%#= content_tag :li, link_to(t('plugins.ecommerce.table.make_accepted', default: 'Mark as Accepted'), url_for(action: :mark_accepted, order_id: order.slug), class: 'btn btn-xs') if order.paid? %>
107
+ <%= content_tag :li, link_to(t('.resend_email', default: 'Resend Email'), url_for(action: :resend_email, order_id: order.slug), class: 'btn btn-xs') %>
107
108
  <%= content_tag :li, link_to(t('plugins.ecommerce.table.make_shipped', default: 'Mark as Shipped'), url_for(action: :mark_shipped, order_id: order.slug), class: 'btn btn-xs mark_shipped_btn') if order.accepted? || order.paid? %>
108
109
  <%= content_tag :li, link_to(t('plugins.ecommerce.table.make_canceled', default: 'Mark as Canceled'), url_for(action: :mark_canceled, order_id: order.slug), class: 'btn btn-xs mark_canceled_btn', 'data-confirm_msg'=> t('plugins.ecommerce.table.confirm_mark_as_cancel', default: 'Are you sure to mark as Canceled?')) if order.bank_pending? || order.on_delivery_pending? || order.paid? %>
109
110
  <%= content_tag :li, link_to(t('plugins.ecommerce.table.make_bank_confirmed', default: 'Mark as Paid'), url_for(action: :mark_bank_confirmed, order_id: order.slug), class: 'btn btn-xs', 'data-confirm'=> t('plugins.ecommerce.table.confirm_mark_as_paid', default: 'Are you sure to mark as Paid?')) if order.bank_pending? || order.on_delivery_pending? %>
@@ -115,26 +116,21 @@
115
116
  </tbody>
116
117
  </table>
117
118
  <%= content_tag("div", raw(t('camaleon_cms.admin.message.data_found_list')), class: "alert alert-warning") if @orders.empty? %>
118
- <%= will_paginate @orders %>
119
+ <%= content_tag("div", "<strong>#{t('plugins.ecommerce.front.orders.index.total_amount', default: 'Total Amount')}: #{e_parse_price(amount)}</strong>".html_safe, class: "") %>
120
+ <%= raw cama_do_pagination @orders %>
119
121
  </div>
120
122
  </div>
121
123
  <script>
122
124
  jQuery(function () {
123
125
  var panel = $('#commerce-orders-list');
126
+ panel.find('.date_field_w').datepicker();
127
+
124
128
  panel.find('.mark_shipped_btn').click(function(e){
125
129
  var link = $(this);
126
130
  e.preventDefault();
127
131
  open_modal({title: link.text(), content: panel.find('#commerce_shipped_modal').html(), callback: function(modal){ modal.find('form').attr('action', link.attr('href')).validate(); }});
128
132
  });
129
133
 
130
- panel.find('#ecommerce_adv_search_btn').click(function(e){
131
- var link = $(this);
132
- e.preventDefault();
133
- open_modal({title: link.attr('title'), content: panel.find('#commerce_adv_search_modal').html(), callback: function(modal){
134
- modal.find('form').validate();
135
- }});
136
- });
137
-
138
134
  panel.find('.mark_canceled_btn').click(function(e){
139
135
  var link = $(this);
140
136
  e.preventDefault();