camaleon_ecommerce 1.1 → 1.2

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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/plugins/ecommerce/admin_product.js.coffee +83 -0
  3. data/app/assets/javascripts/plugins/ecommerce/cart.js +3 -0
  4. data/app/controllers/plugins/ecommerce/admin/coupons_controller.rb +6 -12
  5. data/app/controllers/plugins/ecommerce/admin/orders_controller.rb +2 -8
  6. data/app/controllers/plugins/ecommerce/admin/payment_methods_controller.rb +7 -12
  7. data/app/controllers/plugins/ecommerce/admin/prices_controller.rb +0 -8
  8. data/app/controllers/plugins/ecommerce/admin/settings_controller.rb +0 -8
  9. data/app/controllers/plugins/ecommerce/admin/shipping_methods_controller.rb +6 -14
  10. data/app/controllers/plugins/ecommerce/admin/tax_rates_controller.rb +6 -12
  11. data/app/controllers/plugins/ecommerce/admin_controller.rb +27 -8
  12. data/app/controllers/plugins/ecommerce/front/checkout_controller.rb +42 -75
  13. data/app/controllers/plugins/ecommerce/front/orders_controller.rb +2 -10
  14. data/app/controllers/plugins/ecommerce/front_controller.rb +0 -8
  15. data/app/decorators/plugins/ecommerce/coupon_decorator.rb +0 -8
  16. data/app/decorators/plugins/ecommerce/product_decorator.rb +86 -35
  17. data/app/decorators/plugins/ecommerce/product_item_decorator.rb +27 -3
  18. data/app/decorators/plugins/ecommerce/product_variation_decorator.rb +18 -0
  19. data/app/helpers/plugins/ecommerce/ecommerce_email_helper.rb +11 -13
  20. data/app/helpers/plugins/ecommerce/ecommerce_functions_helper.rb +25 -11
  21. data/app/helpers/plugins/ecommerce/ecommerce_helper.rb +22 -27
  22. data/app/helpers/plugins/ecommerce/ecommerce_payment_helper.rb +1 -56
  23. data/app/models/plugins/ecommerce/attribute.rb +9 -0
  24. data/app/models/plugins/ecommerce/cart.rb +46 -28
  25. data/app/models/plugins/ecommerce/coupon.rb +0 -8
  26. data/app/models/plugins/ecommerce/legacy_cart.rb +50 -0
  27. data/app/models/plugins/ecommerce/legacy_order.rb +48 -0
  28. data/app/models/plugins/ecommerce/order.rb +0 -8
  29. data/app/models/plugins/ecommerce/order_detail.rb +0 -9
  30. data/app/models/plugins/ecommerce/payment_method.rb +0 -8
  31. data/app/models/plugins/ecommerce/product_item.rb +3 -10
  32. data/app/models/plugins/ecommerce/product_variation.rb +9 -0
  33. data/app/models/plugins/ecommerce/shipping_method.rb +0 -8
  34. data/app/models/plugins/ecommerce/tax_rate.rb +0 -8
  35. data/app/services/plugins/ecommerce/cart_service.rb +149 -0
  36. data/app/services/plugins/ecommerce/order_service.rb +26 -0
  37. data/app/services/plugins/ecommerce/product_item_service.rb +29 -0
  38. data/app/services/plugins/ecommerce/product_service.rb +17 -0
  39. data/app/services/plugins/ecommerce/site_service.rb +21 -0
  40. data/app/services/plugins/ecommerce/user_cart_service.rb +12 -0
  41. data/app/services/plugins/ecommerce/user_product_service.rb +29 -0
  42. data/app/services/plugins/ecommerce/util_service.rb +5 -0
  43. data/app/views/plugins/ecommerce/admin/orders/form.html.erb +28 -16
  44. data/app/views/plugins/ecommerce/admin/orders/index.html.erb +7 -1
  45. data/app/views/plugins/ecommerce/admin/payment_methods/form.html.erb +11 -1
  46. data/app/views/plugins/ecommerce/admin/product_attributes.html.erb +95 -0
  47. data/app/views/plugins/ecommerce/admin/products/_variations.html.erb +72 -0
  48. data/app/views/plugins/ecommerce/front/checkout/cart_index.html.erb +5 -5
  49. data/app/views/plugins/ecommerce/front/orders/show.html.erb +96 -89
  50. data/app/views/plugins/ecommerce/partials/_cart_widget.html.erb +3 -3
  51. data/app/views/plugins/ecommerce/partials/checkout/_details.html.erb +1 -1
  52. data/app/views/plugins/ecommerce/partials/checkout/_payments.html.erb +6 -1
  53. data/app/views/plugins/ecommerce/partials/checkout/_products_detail.html.erb +1 -1
  54. data/app/views/plugins/ecommerce/partials/checkout/_user_info.html.erb +26 -22
  55. data/app/views/post_types/commerce/single.html.erb +28 -12
  56. data/config/camaleon_plugin.json +4 -12
  57. data/config/custom_models.rb +10 -0
  58. data/config/locales/en.yml +3 -0
  59. data/config/locales/es.yml +112 -54
  60. data/config/routes.rb +2 -0
  61. data/db/migrate/20160527184747_add_new_cart_structure.rb +7 -4
  62. data/db/migrate/20160620200501_add_product_attributes_structure.rb +21 -0
  63. data/db/migrate/20160825174848_set_cama_post_decorator_class.rb +13 -0
  64. data/db/migrate/20160825232739_migrate_order_data.rb +87 -0
  65. data/lib/ecommerce/version.rb +1 -1
  66. metadata +22 -7
  67. data/app/assets/javascripts/plugins/ecommerce/admin.js +0 -0
  68. data/app/assets/javascripts/plugins/ecommerce/fix_form.js +0 -7
  69. data/config/currency_en.json +0 -154
  70. data/config/currency_es.json +0 -154
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d5cc87402a61c087120824e13a203ac5316c3263
4
- data.tar.gz: 628b52f2b7913355b97bf5434a60e8f773a1c900
3
+ metadata.gz: 0d5a7d45b38213978fbc5fc1e46a33b28f513808
4
+ data.tar.gz: 9681269b718331bbf6ea48b03b05fb7c8bd7a51f
5
5
  SHA512:
6
- metadata.gz: a1dd90758e4e8acd43257a017c39bf0a8fa9c11e2584b71c416985ba047eae410a8fb917f541c8c1ac282364ae6f7a7f8a5b57f476d3f27c76efcead07d64aa2
7
- data.tar.gz: 7be6a2554e77b857cbd75f037eeac76569244442f6961b6abaf316b49dc4c40c3b3e3fc025be556df412d1195008b9c5af3d6267660f3e8eae5a485ea78531ed
6
+ metadata.gz: dc9c967dce8e3cf4ba124087a9357e248fd0bed5fde41fa6eb3b6d71f503d5d5547f75f0ddd5ccf573bd291db489022c8f0ddd6221dfe2dbc29ecaab2b395a96
7
+ data.tar.gz: 84b1cb427d77a4db5c49a5665174ae3900e67e3bc380e98a6bdc61e223723230547e27cf90878a00ea2b303290efbc760aa3524f629bc0f0b4a0a8bb1ad2b0ba
@@ -0,0 +1,83 @@
1
+ $ ->
2
+ form = $('#form-post')
3
+ variation_id = 1
4
+ product_variations = form.find('#product_variations')
5
+ form.find('.content-frame-body > .c-field-group:last').after(product_variations.removeClass('hidden'))
6
+
7
+ # photo uploader
8
+ product_variations.on('click', '.product_variation_photo_link', ->
9
+ $input = $(this).prev()
10
+ $.fn.upload_filemanager({
11
+ formats: "image",
12
+ dimension: $input.attr("data-dimension") || '',
13
+ versions: $input.attr("data-versions") || '',
14
+ thumb_size: $input.attr("data-thumb_size") || '',
15
+ selected: (file, response) ->
16
+ $input.val(file.url);
17
+ })
18
+ return false
19
+ )
20
+
21
+ cache_variation = product_variations.find('.blank_product_variation').remove().clone().removeClass('hidden')
22
+ cache_values = cache_variation.find('.sortable_values > li:first').remove().clone()
23
+
24
+ # add new variation
25
+ product_variations.find('.add_new_variation').click ->
26
+ clone = cache_variation.clone().attr('data-id', 'new_'+variation_id+=1)
27
+ product_variations.children('.variations_sortable').append(clone)
28
+ clone.trigger('fill_variation_id')
29
+ return false
30
+
31
+ # add new variation value
32
+ product_variations.on('click', '.add_new_value', ->
33
+ clone = cache_values.clone()
34
+ key = $(this).closest('.product_variation').attr('data-id')
35
+ clone.find('input, select').each(->
36
+ $(this).attr('name', $(this).attr('name').replace('[]', '['+key+']')).removeAttr('id')
37
+ )
38
+ $(this).closest('.variation_attributes').find('.sortable_values').append(clone)
39
+ clone.find('.product_attribute_select').trigger('change')
40
+ return false
41
+ )
42
+
43
+ # change attribute
44
+ product_variations.on('change', '.product_attribute_select', ->
45
+ v = $(this).val()
46
+ sel = $(this).closest('.row').find('.product_attribute_vals_select').html('')
47
+ for attr in PRODUCT_ATTRIBUTES
48
+ if `attr.id == v`
49
+ for value in attr.values
50
+ sel.append('<option value="'+value.id+'">'+value.label.replace(/</g, '&lt;')+'</option>')
51
+ )
52
+
53
+ product_variations.on('fill_variation_id', '.product_variation', ->
54
+ key = $(this).attr('data-id')
55
+ $(this).find('input, select').each(->
56
+ $(this).attr('name', $(this).attr('name').replace('[]', '['+key+']')).removeAttr('id')
57
+ )
58
+ $(this).find('.sortable_values').sortable({handle: '.val_sorter'})
59
+ )
60
+
61
+ # sortables
62
+ product_variations.find('.sortable_values').sortable({handle: '.val_sorter'})
63
+ product_variations.find('.variations_sortable').sortable({handle: '.variation_sorter', update: ()->
64
+ $(this).children().each((index)->
65
+ $(this).find('.product_variation_position').val(index);
66
+ )
67
+ })
68
+
69
+ # delete actions
70
+ product_variations.on('click', '.val_del', ->
71
+ $(this).closest('li').fadeOut('slow', ->
72
+ $(this).remove()
73
+ )
74
+ return false
75
+ )
76
+ product_variations.on('click', '.var_del', ->
77
+ unless confirm(product_variations.attr('data-confirm-msg'))
78
+ return false
79
+ $(this).closest('.product_variation').fadeOut('slow', ->
80
+ $(this).remove()
81
+ )
82
+ return false
83
+ )
@@ -35,6 +35,9 @@ function cama_checkout_actions(){
35
35
  });
36
36
  return false;
37
37
  }});
38
+ panel.find('#checkout_address_form #billing_address input').blur(function(){
39
+ panel.find('#checkout_address_form #'+$(this).attr('id').replace('billing_address', 'shipping_address')).val($(this).val())
40
+ });
38
41
 
39
42
  // shipping form
40
43
  panel.find('#checkout_shipping_form').validate({submitHandler: function(form){
@@ -1,11 +1,3 @@
1
- =begin
2
- Camaleon CMS is a content management system
3
- Copyright (C) 2015 by Owen Peredo Diaz
4
- Email: owenperedo@gmail.com
5
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
6
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
7
- See the GNU Affero General Public License (GPLv3) for more details.
8
- =end
9
1
  class Plugins::Ecommerce::Admin::CouponsController < Plugins::Ecommerce::AdminController
10
2
  before_action :set_order, only: ['show','edit','update','destroy']
11
3
 
@@ -28,8 +20,7 @@ class Plugins::Ecommerce::Admin::CouponsController < Plugins::Ecommerce::AdminCo
28
20
  end
29
21
 
30
22
  def create
31
- data = params[:plugins_ecommerce_coupon]
32
- @coupon = current_site.coupons.new(data)
23
+ @coupon = current_site.coupons.new(coupons_permit_data)
33
24
  if @coupon.save
34
25
  @coupon.set_meta('_default', params[:options])
35
26
  flash[:notice] = t('camaleon_cms.admin.post_type.message.created')
@@ -40,8 +31,7 @@ class Plugins::Ecommerce::Admin::CouponsController < Plugins::Ecommerce::AdminCo
40
31
  end
41
32
 
42
33
  def update
43
- data = params[:plugins_ecommerce_coupon]
44
- if @coupon.update(data)
34
+ if @coupon.update(coupons_permit_data)
45
35
  @coupon.set_meta('_default', params[:options])
46
36
  flash[:notice] = t('camaleon_cms.admin.post_type.message.updated')
47
37
  redirect_to action: :index
@@ -54,6 +44,10 @@ class Plugins::Ecommerce::Admin::CouponsController < Plugins::Ecommerce::AdminCo
54
44
 
55
45
 
56
46
  private
47
+
48
+ def coupons_permit_data
49
+ params.require(:plugins_ecommerce_coupon).permit!
50
+ end
57
51
  def set_order
58
52
  @coupon = current_site.coupons.find(params[:id])
59
53
  end
@@ -1,11 +1,3 @@
1
- =begin
2
- Camaleon CMS is a content management system
3
- Copyright (C) 2015 by Owen Peredo Diaz
4
- Email: owenperedo@gmail.com
5
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
6
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
7
- See the GNU Affero General Public License (GPLv3) for more details.
8
- =end
9
1
  class Plugins::Ecommerce::Admin::OrdersController < Plugins::Ecommerce::AdminController
10
2
  before_action :set_order, except: [:index, :new] #, only: ['show', 'edit', 'update', 'destroy']
11
3
  before_action :set_order_bread
@@ -27,6 +19,7 @@ class Plugins::Ecommerce::Admin::OrdersController < Plugins::Ecommerce::AdminCon
27
19
  if params[:s].present?
28
20
  orders = orders.where(status: params[:s])
29
21
  end
22
+ orders = orders.order('received_at desc')
30
23
  @orders = orders.paginate(:page => params[:page], :per_page => current_site.admin_per_page)
31
24
  end
32
25
 
@@ -49,6 +42,7 @@ class Plugins::Ecommerce::Admin::OrdersController < Plugins::Ecommerce::AdminCon
49
42
  @order.set_meta("billing_address", params[:order][:billing_address])
50
43
  @order.set_meta("shipping_address", params[:order][:shipping_address])
51
44
  @order.set_metas(params[:metas])
45
+ @order.update(params.require(:plugins_ecommerce_order).permit(:shipped_at))
52
46
  flash[:notice] = "#{t('plugin.ecommerce.message.order_updated', default: 'Order Updated')}"
53
47
  redirect_to action: :show, id: params[:id]
54
48
  end
@@ -1,11 +1,3 @@
1
- =begin
2
- Camaleon CMS is a content management system
3
- Copyright (C) 2015 by Owen Peredo Diaz
4
- Email: owenperedo@gmail.com
5
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
6
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
7
- See the GNU Affero General Public License (GPLv3) for more details.
8
- =end
9
1
  class Plugins::Ecommerce::Admin::PaymentMethodsController < Plugins::Ecommerce::AdminController
10
2
  before_action :set_order, only: ['show','edit','update','destroy']
11
3
 
@@ -31,8 +23,7 @@ class Plugins::Ecommerce::Admin::PaymentMethodsController < Plugins::Ecommerce::
31
23
  end
32
24
 
33
25
  def create
34
- data = params[:plugins_ecommerce_payment_method]
35
- @payment_method = current_site.payment_methods.new(data)
26
+ @payment_method = current_site.payment_methods.new(payment_permit_data)
36
27
  if @payment_method.save
37
28
  @payment_method.set_meta('_default',params[:options])
38
29
  flash[:notice] = t('camaleon_cms.admin.post_type.message.created')
@@ -43,7 +34,6 @@ class Plugins::Ecommerce::Admin::PaymentMethodsController < Plugins::Ecommerce::
43
34
  end
44
35
 
45
36
  def update
46
- data = params[:plugins_ecommerce_payment_method]
47
37
 
48
38
  if defined?(params[:options][:type]) && params[:options][:type] == 'paypal'
49
39
  unless valid_paypal_data(params[:options])
@@ -55,7 +45,7 @@ class Plugins::Ecommerce::Admin::PaymentMethodsController < Plugins::Ecommerce::
55
45
 
56
46
  #FIXME create valid_authorize_net_data function
57
47
 
58
- if @payment_method.update(data)
48
+ if @payment_method.update(payment_permit_data)
59
49
  @payment_method.set_meta('_default',params[:options])
60
50
  flash[:notice] = t('camaleon_cms.admin.post_type.message.updated')
61
51
  redirect_to action: :index
@@ -68,6 +58,11 @@ class Plugins::Ecommerce::Admin::PaymentMethodsController < Plugins::Ecommerce::
68
58
 
69
59
 
70
60
  private
61
+
62
+ def payment_permit_data
63
+ params.require(:plugins_ecommerce_payment_method).permit!
64
+ end
65
+
71
66
  def set_order
72
67
  @payment_method = current_site.payment_methods.find(params[:id])#.decorate
73
68
  end
@@ -1,11 +1,3 @@
1
- =begin
2
- Camaleon CMS is a content management system
3
- Copyright (C) 2015 by Owen Peredo Diaz
4
- Email: owenperedo@gmail.com
5
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
6
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
7
- See the GNU Affero General Public License (GPLv3) for more details.
8
- =end
9
1
  class Plugins::Ecommerce::Admin::PricesController < Plugins::Ecommerce::AdminController
10
2
  before_action :set_shipping_method
11
3
 
@@ -1,11 +1,3 @@
1
- =begin
2
- Camaleon CMS is a content management system
3
- Copyright (C) 2015 by Owen Peredo Diaz
4
- Email: owenperedo@gmail.com
5
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
6
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
7
- See the GNU Affero General Public License (GPLv3) for more details.
8
- =end
9
1
  class Plugins::Ecommerce::Admin::SettingsController < Plugins::Ecommerce::AdminController
10
2
  add_breadcrumb I18n.t("plugin.ecommerce.e_commerce")
11
3
  def index
@@ -1,11 +1,3 @@
1
- =begin
2
- Camaleon CMS is a content management system
3
- Copyright (C) 2015 by Owen Peredo Diaz
4
- Email: owenperedo@gmail.com
5
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
6
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
7
- See the GNU Affero General Public License (GPLv3) for more details.
8
- =end
9
1
  class Plugins::Ecommerce::Admin::ShippingMethodsController < Plugins::Ecommerce::AdminController
10
2
  before_action :set_order, only: ['show','edit','update','destroy']
11
3
 
@@ -29,8 +21,7 @@ class Plugins::Ecommerce::Admin::ShippingMethodsController < Plugins::Ecommerce:
29
21
  end
30
22
 
31
23
  def create
32
- data = params[:plugins_ecommerce_shipping_method]
33
- @shipping_method = current_site.shipping_methods.new(data)
24
+ @shipping_method = current_site.shipping_methods.new(shipping_permit_data)
34
25
  if @shipping_method.save
35
26
  @shipping_method.set_meta('_default',params[:options])
36
27
  flash[:notice] = t('camaleon_cms.admin.post_type.message.created')
@@ -41,8 +32,7 @@ class Plugins::Ecommerce::Admin::ShippingMethodsController < Plugins::Ecommerce:
41
32
  end
42
33
 
43
34
  def update
44
- data = params[:plugins_ecommerce_shipping_method]
45
- if @shipping_method.update(data)
35
+ if @shipping_method.update(shipping_permit_data)
46
36
  @shipping_method.set_meta('_default',params[:options])
47
37
  flash[:notice] = t('camaleon_cms.admin.post_type.message.updated')
48
38
  redirect_to action: :index
@@ -52,11 +42,13 @@ class Plugins::Ecommerce::Admin::ShippingMethodsController < Plugins::Ecommerce:
52
42
  end
53
43
 
54
44
 
55
-
56
-
57
45
  private
58
46
  def set_order
59
47
  @shipping_method = current_site.shipping_methods.find(params[:id])
60
48
  end
61
49
 
50
+ def shipping_permit_data
51
+ params.require(:plugins_ecommerce_shipping_method).permit!
52
+ end
53
+
62
54
  end
@@ -1,11 +1,3 @@
1
- =begin
2
- Camaleon CMS is a content management system
3
- Copyright (C) 2015 by Owen Peredo Diaz
4
- Email: owenperedo@gmail.com
5
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
6
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
7
- See the GNU Affero General Public License (GPLv3) for more details.
8
- =end
9
1
  class Plugins::Ecommerce::Admin::TaxRatesController < Plugins::Ecommerce::AdminController
10
2
  before_action :set_order, only: ['show','edit','update','destroy']
11
3
 
@@ -28,8 +20,7 @@ class Plugins::Ecommerce::Admin::TaxRatesController < Plugins::Ecommerce::AdminC
28
20
  end
29
21
 
30
22
  def create
31
- data = params[:plugins_ecommerce_tax_rate]
32
- @tax_rate = current_site.tax_rates.new(data)
23
+ @tax_rate = current_site.tax_rates.new(tax_rate_permit_data)
33
24
  if @tax_rate.save
34
25
  @tax_rate.set_meta('_default', params[:options])
35
26
  flash[:notice] = t('camaleon_cms.admin.post_type.message.created')
@@ -40,8 +31,7 @@ class Plugins::Ecommerce::Admin::TaxRatesController < Plugins::Ecommerce::AdminC
40
31
  end
41
32
 
42
33
  def update
43
- data = params[:plugins_ecommerce_tax_rate]
44
- if @tax_rate.update(data)
34
+ if @tax_rate.update(tax_rate_permit_data)
45
35
  @tax_rate.set_meta('_default', params[:options])
46
36
  flash[:notice] = t('camaleon_cms.admin.post_type.message.updated')
47
37
  redirect_to action: :index
@@ -54,6 +44,10 @@ class Plugins::Ecommerce::Admin::TaxRatesController < Plugins::Ecommerce::AdminC
54
44
 
55
45
 
56
46
  private
47
+ def tax_rate_permit_data
48
+ params.require(:plugins_ecommerce_tax_rate).permit!
49
+ end
50
+
57
51
  def set_order
58
52
  @tax_rate = current_site.tax_rates.find(params[:id])
59
53
  end
@@ -1,17 +1,36 @@
1
- =begin
2
- Camaleon CMS is a content management system
3
- Copyright (C) 2015 by Owen Peredo Diaz
4
- Email: owenperedo@gmail.com
5
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
6
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
7
- See the GNU Affero General Public License (GPLv3) for more details.
8
- =end
9
1
  class Plugins::Ecommerce::AdminController < CamaleonCms::Apps::PluginsAdminController
10
2
  before_action :verify_ecommerce_permission
11
3
  def index
12
4
  # here your actions for admin panel
13
5
  end
14
6
 
7
+ def product_attributes
8
+
9
+ end
10
+
11
+ def save_product_attributes
12
+ current_site.product_attributes.where.not(id: params[:attribute].keys).destroy_all
13
+ params[:attribute].each do |key, values|
14
+ if key.include?('new')
15
+ group = current_site.product_attributes.create(label: params[:attribute_names][key][:label])
16
+ else
17
+ group = current_site.product_attributes.find(key)
18
+ group.update(label: params[:attribute_names][key][:label])
19
+ end
20
+ group.values.where.not(id: values.map{|v| v[:id] }).delete_all
21
+ values.each do |val|
22
+ data = {key: val[:key], label: val[:value], position: val[:position]}
23
+ if val[:id].present?
24
+ group.values.find(val[:id]).update(data)
25
+ else
26
+ group.values.create(data)
27
+ end
28
+ end
29
+ end
30
+ flash[:notice] = t('.saved_product_attributes', default: 'Attributes Saved')
31
+ redirect_to action: :product_attributes
32
+ end
33
+
15
34
  private
16
35
  def verify_ecommerce_permission
17
36
  authorize! :posts, get_commerce_post_type
@@ -1,11 +1,3 @@
1
- =begin
2
- Camaleon CMS is a content management system
3
- Copyright (C) 2015 by Owen Peredo Diaz
4
- Email: owenperedo@gmail.com
5
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
6
- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
7
- See the GNU Affero General Public License (GPLv3) for more details.
8
- =end
9
1
  class Plugins::Ecommerce::Front::CheckoutController < Plugins::Ecommerce::FrontController
10
2
  before_action :commerce_authenticate
11
3
  before_action :set_cart
@@ -16,7 +8,7 @@ class Plugins::Ecommerce::Front::CheckoutController < Plugins::Ecommerce::FrontC
16
8
  flash[:notice] = t('plugins.ecommerce.messages.cart_no_products', default: 'Not exist products in your cart')
17
9
  return redirect_to action: :cart_index
18
10
  end
19
- @ecommerce_bredcrumb << [t('plugins.ecommerce.messages.checkout', default: 'Checkout')]
11
+ @ecommerce_breadcrumb << [t('plugins.ecommerce.messages.checkout', default: 'Checkout')]
20
12
  end
21
13
 
22
14
  def step_address
@@ -54,7 +46,7 @@ class Plugins::Ecommerce::Front::CheckoutController < Plugins::Ecommerce::FrontC
54
46
 
55
47
  def cart_index
56
48
  @products = @cart.product_items.decorate
57
- @ecommerce_bredcrumb << [t('plugins.ecommerce.messages.shopping_cart', default: 'Shopping cart')]
49
+ @ecommerce_breadcrumb << [t('plugins.ecommerce.messages.shopping_cart', default: 'Shopping cart')]
58
50
  end
59
51
 
60
52
  def res_coupon
@@ -73,24 +65,30 @@ class Plugins::Ecommerce::Front::CheckoutController < Plugins::Ecommerce::FrontC
73
65
  data = params[:cart]
74
66
  qty = data[:qty].to_f rescue 0
75
67
  product = current_site.products.find(data[:product_id]).decorate
76
- unless product.can_added?(qty)
77
- flash[:error] = t('plugins.ecommerce.messages.not_enough_product_qty', product: product.the_title, qty: product.the_qty_real, default: 'There is not enough products "%{product}" (%{qty})')
68
+ unless product.valid_variation?(params[:variation_id])
69
+ flash[:error] = t('plugins.ecommerce.messages.missing_variation', default: 'Invalid Product Variation')
70
+ return redirect_to action: :cart_index
71
+ end
72
+
73
+ unless product.can_added?(qty, params[:variation_id])
74
+ flash[:error] = t('plugins.ecommerce.messages.not_enough_product_qty', product: product.the_variation_title(params[:variation_id]), qty: product.the_qty_real(params[:variation_id]), default: 'There is not enough products "%{product}" (Available %{qty})')
78
75
  return redirect_to :back
79
76
  end
80
- @cart.add_product(product, qty)
77
+ @cart.add_product(product, qty, params[:variation_id])
81
78
  flash[:notice] = t('plugins.ecommerce.messages.added_product_in_cart', default: 'Product added into cart')
82
79
  redirect_to action: :cart_index
83
80
  end
84
81
 
85
82
  def cart_update
86
83
  errors = []
87
- params[:products].each do |data|
88
- product = @cart.products.find(data[:product_id]).decorate
84
+ params[:product_items].each do |data|
85
+ item = @cart.product_items.find(data[:item_id])
86
+ product = item.product.decorate
89
87
  qty = data[:qty].to_f
90
- if product.can_added?(qty)
91
- @cart.add_product(product, qty)
88
+ if product.can_added?(qty, item.variation_id)
89
+ @cart.add_product(product, qty, item.variation_id)
92
90
  else
93
- 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}" (%{qty})')
91
+ errors << t('plugins.ecommerce.messages.not_enough_product_qty', product: product.the_variation_title(item.variation_id), qty: product.the_qty_real(item.variation_id), default: 'There is not enough products "%{product}" (Available %{qty})')
94
92
  end
95
93
  end
96
94
  flash[:error] = errors.join('<br>') if errors.present?
@@ -99,40 +97,32 @@ class Plugins::Ecommerce::Front::CheckoutController < Plugins::Ecommerce::FrontC
99
97
  end
100
98
 
101
99
  def cart_remove
102
- @cart.remove_product(params[:product_id])
100
+ @cart.product_items.find(params[:product_item_id]).destroy
103
101
  flash[:notice] = t('plugins.ecommerce.messages.cart_deleted', default: 'Product removed from your shopping cart')
104
102
  redirect_to action: :cart_index
105
103
  end
106
104
 
107
105
  def cancel_order
108
- # @cart = current_site.orders.find_by_slug(params[:order])
109
106
  @cart.update({status: 'canceled', kind: 'order', closed_at: Time.now})
110
107
  flash[:notice] = t('plugins.ecommerce.messages.canceled_order', default: "Canceled Order")
111
108
  redirect_to plugins_ecommerce_orders_url
112
109
  end
113
110
 
114
- # pay by stripe
115
111
  def pay_by_stripe
116
- require 'stripe'
117
- Stripe.api_key = @payment.options[:stripe_id]
118
- customer = Stripe::Customer.create(:email => params[:stripeEmail], :source => params[:stripeToken])
119
- begin
120
- charge = Stripe::Charge.create(
121
- :customer => customer.id,
122
- :amount => commerce_to_cents(@cart.total_amount),
123
- :description => "Payment Products: #{@cart.products_title}",
124
- :currency => commerce_current_currency
112
+ result = Plugins::Ecommerce::CartService.new(current_site, @cart).
113
+ pay_with_stripe(payment_method: @payment,
114
+ email: params[:stripeEmail],
115
+ stripe_token: params[:stripeToken],
125
116
  )
126
- @cart.set_meta("payment_data", params)
117
+ if result[:error].present?
118
+ flash[:error] = result[:error]
119
+ if result[:payment_error]
120
+ flash[:payment_error] = true
121
+ end
122
+ redirect_to :back
123
+ else
127
124
  mark_order_like_received(@cart)
128
125
  redirect_to plugins_ecommerce_orders_url
129
- rescue Stripe::CardError => e
130
- flash[:error] = e.message
131
- flash[:payment_error] = true
132
- redirect_to :back
133
- rescue => e
134
- flash[:error] = e.message
135
- redirect_to :back
136
126
  end
137
127
  end
138
128
 
@@ -143,7 +133,15 @@ class Plugins::Ecommerce::Front::CheckoutController < Plugins::Ecommerce::FrontC
143
133
  end
144
134
 
145
135
  def pay_by_authorize_net
146
- res = payment_pay_by_credit_card_authorize_net(@cart, @payment)
136
+ res = Plugins::Ecommerce::CartService.new(current_site, @cart).
137
+ pay_with_authorize_net(payment_method: @payment, ip: request.remote_ip,
138
+ first_name: params[:firstName],
139
+ last_name: params[:lastName],
140
+ number: params[:cardNumber],
141
+ exp_month: params[:expMonth],
142
+ exp_year: params[:expYear],
143
+ cvc: params[:cvCode],
144
+ )
147
145
  if res[:error].present?
148
146
  flash[:error] = res[:error]
149
147
  flash[:payment_error] = true
@@ -155,7 +153,6 @@ class Plugins::Ecommerce::Front::CheckoutController < Plugins::Ecommerce::FrontC
155
153
  end
156
154
 
157
155
  def success_paypal
158
- # @cart = current_site.carts.find_by_slug(params[:order])
159
156
  @cart.set_meta('payment_data', {token: params[:token], PayerID: params[:PayerID]})
160
157
  mark_order_like_received(@cart)
161
158
  redirect_to plugins_ecommerce_orders_url
@@ -167,48 +164,18 @@ class Plugins::Ecommerce::Front::CheckoutController < Plugins::Ecommerce::FrontC
167
164
  end
168
165
 
169
166
  def pay_by_paypal
170
- billing_address = @cart.get_meta("billing_address")
171
- ActiveMerchant::Billing::Base.mode = @payment.options[:paypal_sandbox].to_s.to_bool ? :test : :production
172
- paypal_options = {
173
- :login => @payment.options[:paypal_login],
174
- :password => @payment.options[:paypal_password],
175
- :signature => @payment.options[:paypal_signature]
176
- }
177
- @gateway = ActiveMerchant::Billing::PaypalExpressGateway.new(paypal_options)
178
- @options = {
179
- brand_name: current_site.name,
180
- items: [{number: @cart.slug, name: "Buy Products from #{current_site.the_title}: #{@cart.products_title}", amount: commerce_to_cents(@cart.total_amount)}],
181
- :order_id => @cart.slug,
182
- :currency => current_site.currency_code,
183
- :email => @cart.user.email,
184
- :billing_address => {:name => "#{billing_address[:first_name]} #{billing_address[:last_name]}",
185
- :address1 => billing_address[:address1],
186
- :address2 => billing_address[:address2],
187
- :city => billing_address[:city],
188
- :state => billing_address[:state],
189
- :country => billing_address[:country],
190
- :zip => billing_address[:zip]
191
- },
192
- :description => "Buy Products from #{current_site.the_title}: #{@cart.total_amount}",
193
- :ip => request.remote_ip,
194
- :return_url => plugins_ecommerce_checkout_success_paypal_url(order: @cart.slug),
195
- :cancel_return_url => plugins_ecommerce_checkout_cancel_paypal_url(order: @cart.slug)
196
- }
197
- response = @gateway.setup_purchase(commerce_to_cents(@cart.total_amount), @options)
198
- redirect_to @gateway.redirect_url_for(response.token)
167
+ result = Plugins::Ecommerce::CartService.new(current_site, @cart).
168
+ pay_with_paypal(payment_method: @payment, ip: request.remote_ip, return_url: plugins_ecommerce_checkout_success_paypal_url(order: @cart.slug), cancel_return_url: plugins_ecommerce_checkout_cancel_paypal_url(order: @cart.slug))
169
+ redirect_to result[:redirect_url]
199
170
  end
200
171
 
201
172
  private
202
173
  def set_cart
203
- @cart = current_site.carts.set_user(current_user).first_or_create(name: "Cart by #{current_user.id}").decorate
204
- end
205
-
206
- def commerce_to_cents(money)
207
- (money*100).round
174
+ @cart = Plugins::Ecommerce::UserCartService.new(current_site, current_user).get_cart
208
175
  end
209
176
 
210
177
  def set_bread
211
- @ecommerce_bredcrumb << [t('plugins.ecommerce.messages.checkout', default: 'Checkout'), url_for(action: :cart_index)]
178
+ @ecommerce_breadcrumb << [t('plugins.ecommerce.messages.checkout', default: 'Checkout'), url_for(action: :cart_index)]
212
179
  end
213
180
 
214
181
  def set_payment