spree_order_groove 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. data/.gitignore +14 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +7 -0
  4. data/LICENSE +26 -0
  5. data/README.md +60 -0
  6. data/Rakefile +21 -0
  7. data/app/assets/javascripts/spree/backend/spree_order_groove.js +2 -0
  8. data/app/assets/javascripts/spree/frontend/spree_order_groove.js +2 -0
  9. data/app/assets/stylesheets/spree/backend/spree_order_groove.css +4 -0
  10. data/app/assets/stylesheets/spree/frontend/spree_order_groove.css +4 -0
  11. data/app/controllers/spree/api/orders_controller_decorator.rb +293 -0
  12. data/app/controllers/spree/checkout_controller_decorator.rb +102 -0
  13. data/app/controllers/spree/orders_controller_decorator.rb +4 -0
  14. data/app/controllers/spree/store_controller_decorator.rb +24 -0
  15. data/app/models/spree/ordergroove_configuration.rb +12 -0
  16. data/app/models/spree/promotion/rules/autodelivery.rb +23 -0
  17. data/app/overrides/decorate_ordergroove_div_cart.rb +6 -0
  18. data/app/overrides/decorate_ordergroove_div_cart_remove.rb +6 -0
  19. data/app/overrides/decorate_ordergroove_div_product_main.rb +6 -0
  20. data/app/overrides/decorate_ordergroove_tags_cart.rb +6 -0
  21. data/app/overrides/decorate_ordergroove_tags_product.rb +6 -0
  22. data/app/views/spree/admin/promotions/rules/_autodelivery_rule.html.erb +0 -0
  23. data/app/views/spree/api/orders/ogcreateorder.v1.rabl +2 -0
  24. data/app/views/spree/shared/_ordergroove_line_item_div.html.erb +4 -0
  25. data/app/views/spree/shared/_ordergroove_line_item_div_remove.html.erb +3 -0
  26. data/app/views/spree/shared/_ordergroove_tags.html.erb +56 -0
  27. data/bin/rails +7 -0
  28. data/config/locales/en.yml +10 -0
  29. data/config/ordergroove.yml +35 -0
  30. data/config/routes.rb +10 -0
  31. data/db/migrate/20150604115532_add_auto_delivery_to_spree_line_items.spree_order_groove.rb +5 -0
  32. data/lib/generators/spree_order_groove/install/install_generator.rb +31 -0
  33. data/lib/rc4.rb +64 -0
  34. data/lib/spree_order_groove.rb +2 -0
  35. data/lib/spree_order_groove/engine.rb +23 -0
  36. data/lib/spree_order_groove/factories.rb +6 -0
  37. data/spec/spec_helper.rb +87 -0
  38. data/spree_order_groove.gemspec +31 -0
  39. metadata +268 -0
@@ -0,0 +1,102 @@
1
+ Spree::CheckoutController.class_eval do
2
+ before_action :apply_autodelivery
3
+ before_action :set_cc_number
4
+
5
+ # this action is updated to post to orderGroove
6
+ def update
7
+ if @order.update_from_params(params, permitted_checkout_attributes, request.headers.env)
8
+ @order.temporary_address = !params[:save_user_address]
9
+ unless @order.next
10
+ flash[:error] = @order.errors.full_messages.join("\n")
11
+ redirect_to checkout_state_path(@order.state) and return
12
+ end
13
+
14
+ if @order.completed?
15
+ @current_order = nil
16
+ flash.notice = Spree.t(:order_processed_successfully)
17
+ flash['order_completed'] = true
18
+
19
+ # this is the changes, if you find the spree version is different, copy this change to your version
20
+ byebug
21
+ og_autoship=cookies[:og_autoship]||0
22
+ merchant_id= Spree::OrdergrooveConfiguration.account["#{current_store.code}"]["og_merchant_id"]
23
+ hashkey= Spree::OrdergrooveConfiguration.account["#{current_store.code}"]["og_hashkey"]
24
+ og_subscription_url= Spree::OrdergrooveConfiguration.account["#{current_store.code}"]["og_subscription_url_#{ENV["RAILS_ENV"]}"]
25
+
26
+ if og_autoship.to_i==1
27
+
28
+ rc4=RC4.new(hashkey)
29
+ Rails.logger.error("*" * 50)
30
+ Rails.logger.error("Order: " + @order.number + "subscribed to auto delivery, post to order groove now")
31
+ Rails.logger.error("*" * 50)
32
+ #encode the subscription
33
+ subscription={:merchant_id =>merchant_id.to_s, :session_id=>cookies[:og_session_id], :merchant_order_id =>@order.number}
34
+ billing_address=@order.bill_address
35
+ subscription[:user]={:user_id=> @order.user_id.to_s, :first_name=>CGI.escape(billing_address.firstname), :last_name=>CGI.escape(billing_address.lastname), :email=>@order.checkout.email}
36
+ subscription[:user][:billing_address]={:first_name=>CGI.escape(billing_address.firstname), :last_name=>CGI.escape(billing_address.lastname),:company_name=>"",:address=>CGI.escape(billing_address.address1),
37
+ :address2=>CGI.escape(billing_address.address2||''),:city=>CGI.escape(billing_address.city),:state_province_code=>(billing_address.state_id==nil ? billing_address.state_name : State.find(billing_address.state_id).abbr),:zip_postal_code=>billing_address.zipcode,:phone=>billing_address.phone,
38
+ :fax=>"",:country_code=>Country.find(billing_address.country_id).iso}
39
+ billing_address=@order.ship_address
40
+ subscription[:user][:shipping_address]={:first_name=>CGI.escape(billing_address.firstname), :last_name=>CGI.escape(billing_address.lastname),:company_name=>"",:address=>CGI.escape(billing_address.address1),
41
+ :address2=>CGI.escape(billing_address.address2||''),:city=>CGI.escape(billing_address.city),:state_province_code=>(billing_address.state_id==nil ? billing_address.state_name : State.find(billing_address.state_id).abbr),:zip_postal_code=>billing_address.zipcode,:phone=>billing_address.phone,
42
+ :fax=>"",:country_code=>Country.find(billing_address.country_id).iso}
43
+
44
+ payment={:cc_holder=>CGI.escape(Base64.encode64(rc4.encrypt(billing_address.firstname + ' ' + billing_address.lastname)).chomp), :cc_type=>'1',:cc_number=> CGI.escape(session[:cc].chomp()),:cc_exp_date=>CGI.escape(Base64.encode64(rc4.encrypt(((@order.payments[0].source[:month].to_i<10 ? '0' : '') +@order.payments[0].source[:month] + '/' + @order.payments[0].source[:year]))).chomp) }
45
+ subscription[:payment] =payment
46
+
47
+ else
48
+ subscription={:merchant_id =>merchant_id.to_s, :session_id=>cookies[:og_session_id]}
49
+ end
50
+
51
+ session[:cc] = ''
52
+
53
+ # now post to orderGroove
54
+ require "net/https"
55
+ require "uri"
56
+ #CheckoutsHelper.fetch("POST",og_subscription_url,'create_request='+ subscription.to_json )
57
+ url=og_subscription_url
58
+ method="POST"
59
+ body= 'create_request='+ subscription.to_json
60
+ headers={}
61
+ headers["Content-Type"] = 'application/json' unless body.nil?
62
+
63
+ begin
64
+ uri = URI.parse(url)
65
+ http = Net::HTTP.new(uri.host, uri.port)
66
+ http.read_timeout = 2
67
+ http.use_ssl = true
68
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
69
+
70
+ request = Net::HTTP::Post.new(uri.request_uri)
71
+ request.body=body
72
+
73
+ response = http.request(request)
74
+ rescue
75
+ Rails.logger.error("Order: " + @order.number + "post to order groove fail")
76
+ end
77
+
78
+
79
+ redirect_to completion_route
80
+ else
81
+ redirect_to checkout_state_path(@order.state)
82
+ end
83
+ else
84
+ render :edit
85
+ end
86
+ end
87
+
88
+ private
89
+ # remember the cc in session
90
+ def set_cc_number
91
+ # this is the changes, if you find the spree version is different, copy this change to your version
92
+
93
+
94
+ if params[:state]=="payment" && params[:payment_source] && cookies[:og_autoship]
95
+ hashkey= Spree::OrdergrooveConfiguration.account["#{current_store.code}"]["og_hashkey"]
96
+ rc4=RC4.new(hashkey)
97
+ session[:cc] = Base64.encode64(rc4.encrypt(params[:payment_source].first.last[:number]))
98
+ end
99
+
100
+ end
101
+
102
+ end
@@ -0,0 +1,4 @@
1
+ Spree::OrdersController.class_eval do
2
+ before_action :apply_autodelivery
3
+
4
+ end
@@ -0,0 +1,24 @@
1
+ Spree::StoreController.class_eval do
2
+ protected
3
+ # This method is placed here so that the CheckoutController
4
+ # and OrdersController can both reference it (or any other controller
5
+ # which needs it)
6
+ def apply_autodelivery
7
+ if !!@order && !(["complete", "awaiting_return", "returned"].include? @order.state)
8
+ auto_delivery = cookies[:og_autoship] && cookies[:og_cart_autoship]
9
+ og_ioi = JSON.parse(cookies[:og_cart_autoship] || '[]')
10
+
11
+ @order.line_items.each do |l|
12
+ l.auto_delivery = (cookies[:og_autoship]=="1" && (og_ioi.map{|d| d['id']}.include? l.variant_id.to_s))
13
+ l.save
14
+ end
15
+
16
+ #@order.save!
17
+ #handler = Spree::PromotionHandler::Autodelivery.new(@order).apply
18
+ #else
19
+ # @order.autodelivery = nil
20
+ #end
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,12 @@
1
+ module Spree
2
+ class OrdergrooveConfiguration
3
+
4
+ def self.account
5
+ bronto_yml=File.join(Rails.root,'config/ordergroove.yml')
6
+ if File.exist? bronto_yml
7
+ bronto_yml=File.join(Rails.root,'config/ordergroove.yml')
8
+ YAML.load(File.read(bronto_yml))
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,23 @@
1
+ module Spree
2
+ class Promotion
3
+ module Rules
4
+ class Autodelivery < PromotionRule
5
+
6
+ def applicable?(promotable)
7
+ promotable.is_a?(Spree::Order)
8
+ end
9
+
10
+ def eligible?(order, options = {}) #line_item is target
11
+
12
+ order.line_items.any? {|l| l[:auto_delivery]}
13
+ end
14
+
15
+ def actionable?(line_item)
16
+
17
+ line_item.auto_delivery
18
+ end
19
+
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,6 @@
1
+ Deface::Override.new(
2
+ :virtual_path => "spree/orders/_line_item",
3
+ :name => "ordergroove_div_cart",
4
+ :replace => "[data-hook='line_item_description']",
5
+ :partial => "spree/shared/ordergroove_line_item_div",
6
+ :disabled => false)
@@ -0,0 +1,6 @@
1
+ Deface::Override.new(
2
+ :virtual_path => "spree/orders/_line_item",
3
+ :name => "ordergroove_div_cart_remove",
4
+ :replace => "[data-hook='cart_item_delete']",
5
+ :partial => "spree/shared/ordergroove_line_item_div_remove",
6
+ :disabled => false)
@@ -0,0 +1,6 @@
1
+ Deface::Override.new(
2
+ :virtual_path => "spree/products/_cart_form",
3
+ :name => "ordergroove_div_product_main",
4
+ :insert_before => "[data-hook='product_price']",
5
+ :text => '<div id="og-div_main"></div>',
6
+ :disabled => false)
@@ -0,0 +1,6 @@
1
+ Deface::Override.new(
2
+ :virtual_path => "spree/orders/edit",
3
+ :name => "ordergroove_tags_cart",
4
+ :insert_after => "[data-hook='cart_container']",
5
+ :partial => "spree/shared/ordergroove_tags",
6
+ :disabled => false)
@@ -0,0 +1,6 @@
1
+ Deface::Override.new(
2
+ :virtual_path => "spree/products/show",
3
+ :name => "ordergroove_tags_product",
4
+ :insert_after => "[data-hook='product_show']",
5
+ :partial => "spree/shared/ordergroove_tags",
6
+ :disabled => false)
@@ -0,0 +1,2 @@
1
+ object @order
2
+ cache [I18n.locale, root_object]
@@ -0,0 +1,4 @@
1
+ <span class="line-item-description" data-hook="line_item_description">
2
+ <%= line_item_description_text(line_item.description) %>
3
+ <div id="og-div_<%= line_item.variant.product.id.to_s %>"></div>
4
+ </span>
@@ -0,0 +1,3 @@
1
+ <td class="cart-item-delete" data-hook="cart_item_delete">
2
+ <%= link_to content_tag(:span, '', class: 'glyphicon glyphicon-minus-sign'), '#', :og_id => "remove_#{line_item.variant.product.id.to_s}", class: 'delete', id: "delete_#{dom_id(line_item)}" %>
3
+ </td>
@@ -0,0 +1,56 @@
1
+ <%
2
+ # order groove tags
3
+ step=0
4
+ if !!@product
5
+ step =1
6
+ elsif !!@order
7
+ if @order.state == "address" || @order.state == "cart"
8
+ step=2
9
+ elsif @order.state == "payment" || @order.state == "confirm"
10
+ step=3
11
+ elsif @order.state == "complete"
12
+ step=4
13
+ end
14
+ end
15
+
16
+ logger.info "Step got here: #{step}"
17
+ if step>0
18
+ merchant_id= Spree::OrdergrooveConfiguration.account["#{current_store.code}"]["og_merchant_id"]
19
+ hashkey= Spree::OrdergrooveConfiguration.account["#{current_store.code}"]["og_hashkey"]
20
+ og_tag_url= Spree::OrdergrooveConfiguration.account["#{current_store.code}"]["og_tag_url_#{ENV["RAILS_ENV"]}"]
21
+
22
+ rc4=RC4.new(hashkey)
23
+ unless hashkey.blank?
24
+ if !!@order && step < 4 # cart review or order review page
25
+ products_json=@order.line_items.map{|item| {:id=> item.variant_id, :quantity=> item.quantity, :unit_price=> item.price, :total_price=> (item.price*item.quantity) }}.to_json
26
+ %>
27
+ <script type="text/javascript">
28
+ var og_settings = {
29
+ "products": <%= raw(products_json) %>,
30
+ "subtotal": "<%= @order.item_total %>",
31
+ "tax_total": "<%= (100*@order.line_item_adjustments.tax.eligible.map{|t| t.amount}.sum).to_i/100.00 %>",
32
+ "shipping_total": "<%= (100*@order.line_item_adjustments.shipping.eligible.map{|t| t.amount}.sum).to_i/100.00 %>",
33
+ "order_total": "<%= @order.total.to_s %>"
34
+ };
35
+ </script>
36
+
37
+ <%
38
+ elsif step==4 %>
39
+ <div id="og-div"></div>
40
+ <script type="text/javascript">
41
+ var og_settings = {}
42
+ </script>
43
+ <%
44
+ elsif step==1 # product page
45
+ %>
46
+ <script type="text/javascript">
47
+ var og_settings = og_settings || {"product": { "id":"<%= @product.id.to_s %>" } };
48
+ </script>
49
+
50
+ <% end %>
51
+
52
+ <script type="text/javascript" src="<%= og_tag_url %>/<%= merchant_id%>/core-model.js"></script>
53
+ <script type="text/javascript" src="<%= og_tag_url %>/<%= merchant_id%>/<%= step%>/controller.js"></script>
54
+ <% end %>
55
+
56
+ <% end %>
data/bin/rails ADDED
@@ -0,0 +1,7 @@
1
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
2
+
3
+ ENGINE_ROOT = File.expand_path('../..', __FILE__)
4
+ ENGINE_PATH = File.expand_path('../../lib/spree_order_groove/engine', __FILE__)
5
+
6
+ require 'rails/all'
7
+ require 'rails/engine/commands'
@@ -0,0 +1,10 @@
1
+ # Sample localization file for English. Add more files in this directory for other locales.
2
+ # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ en:
5
+ hello: "Hello world"
6
+ spree:
7
+ promotion_rule_types:
8
+ autodelivery:
9
+ name: "Autodelivery Rule"
10
+ description: "Order Groove Auto delivery discount"
@@ -0,0 +1,35 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # order Groove for auto delivery
4
+
5
+ default: &default
6
+ og_tag_url_development : https://staging.static.ordergroove.com
7
+ og_tag_url_production : https://static.ordergroove.com
8
+ og_subscription_url_development : https://staging.sc.ordergroove.com/subscription/create
9
+ og_subscription_url_production : https://sc.ordergroove.com/subscription/create
10
+ og_bulkdiscount_url_development : https://staging.v2.ordergroove.com/utilities/html/
11
+ og_bulkdiscount_url_production : https://api.ordergroove.com/utilities/html/
12
+
13
+ og_ftp_host_production : feeds.ordergroove.com
14
+ og_ftp_host_development : staging.feeds.ordergroove.com
15
+ og_ftp_passive : 1
16
+
17
+ store1:
18
+ <<: *default
19
+ og_merchant_id : your_merchagne_id
20
+ og_hashkey : your_hashkey
21
+ og_ftp_user : your_ftp_user
22
+ og_ftp_pass : your_ftp_passworkd
23
+
24
+ pwb:
25
+ <<: *default
26
+ og_merchant_id : your_merchagne_id
27
+ og_hashkey : your_hashkey
28
+ og_ftp_user : your_ftp_user
29
+ og_ftp_pass : your_ftp_passworkd
30
+ he:
31
+ <<: *default
32
+ og_merchant_id : your_merchagne_id
33
+ og_hashkey : your_hashkey
34
+ og_ftp_user : your_ftp_user
35
+ og_ftp_pass : your_ftp_passworkd
data/config/routes.rb ADDED
@@ -0,0 +1,10 @@
1
+ Spree::Core::Engine.add_routes do
2
+ namespace :api do
3
+ #resources :orders do
4
+ # collection do
5
+ # post 'ogcreateorder'
6
+ # end
7
+ #end
8
+ post "/orders/ogcreateorder", to: "orders#ogcreateorder", as: "ogcreateorder"
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ class AddAutoDeliveryToSpreeLineItems < ActiveRecord::Migration
2
+ def change
3
+ add_column :spree_line_items, :auto_delivery, :boolean, :default => false
4
+ end
5
+ end
@@ -0,0 +1,31 @@
1
+ module SpreeOrderGroove
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+
5
+ class_option :auto_run_migrations, :type => :boolean, :default => false
6
+
7
+ def add_javascripts
8
+ append_file 'vendor/assets/javascripts/spree/frontend/all.js', "//= require spree/frontend/spree_order_groove\n"
9
+ append_file 'vendor/assets/javascripts/spree/backend/all.js', "//= require spree/backend/spree_order_groove\n"
10
+ end
11
+
12
+ def add_stylesheets
13
+ inject_into_file 'vendor/assets/stylesheets/spree/frontend/all.css', " *= require spree/frontend/spree_order_groove\n", :before => /\*\//, :verbose => true
14
+ inject_into_file 'vendor/assets/stylesheets/spree/backend/all.css', " *= require spree/backend/spree_order_groove\n", :before => /\*\//, :verbose => true
15
+ end
16
+
17
+ def add_migrations
18
+ run 'bundle exec rake railties:install:migrations FROM=spree_order_groove'
19
+ end
20
+
21
+ def run_migrations
22
+ run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask 'Would you like to run the migrations now? [Y/n]')
23
+ if run_migrations
24
+ run 'bundle exec rake db:migrate'
25
+ else
26
+ puts 'Skipping rake db:migrate, don\'t forget to run it!'
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
data/lib/rc4.rb ADDED
@@ -0,0 +1,64 @@
1
+ # https://github.com/benolee/ruby-rc4.git
2
+ # == RC4
3
+ #
4
+ # RC4 is a pure Ruby implementation of the Rc4 algorithm.
5
+ #
6
+ # == Usage
7
+ #
8
+ # First require the gem:
9
+ #
10
+ # require 'rc4'
11
+
12
+
13
+ class RC4
14
+
15
+ def initialize(str) #the key
16
+ raise SyntaxError, "RC4: Key supplied is blank" if str.eql?('')
17
+ @str = str
18
+ end
19
+
20
+ def encrypt(text)
21
+ process text
22
+ end
23
+
24
+ def decrypt(text)
25
+ process text
26
+ end
27
+
28
+ private
29
+
30
+ def reset
31
+ @q1, @q2 = 0, 0
32
+ @key = []
33
+ @str.each_byte {|elem| @key << elem} while @key.size < 256
34
+ @key.slice!(256..@key.size-1) if @key.size >= 256
35
+ @s = (0..255).to_a
36
+ j = 0
37
+ 0.upto(255) do |i|
38
+ j = (j + @s[i] + @key[i] )%256
39
+ @s[i], @s[j] = @s[j], @s[i]
40
+ end
41
+ end
42
+
43
+ def process(text)
44
+ reset
45
+ out = ""
46
+ 0.upto(text.length-1) do |i|
47
+ if RUBY_VERSION >= "1.9.0"
48
+ char = text[i].ord
49
+ else
50
+ char = text[i]
51
+ end
52
+ out += (char ^ round).chr
53
+ end
54
+ out
55
+ end
56
+
57
+ def round
58
+ @q1 = (@q1 + 1)%256
59
+ @q2 = (@q2 + @s[@q1])%256
60
+ @s[@q1], @s[@q2] = @s[@q2], @s[@q1]
61
+ @s[(@s[@q1]+@s[@q2])%256]
62
+ end
63
+
64
+ end