piggybak_braintree 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: adaccf828d79ec9668ed86acf84ab9c9d5a01be6
4
+ data.tar.gz: 3406f37f4f1461adeb7d288e0013b451a4854805
5
+ SHA512:
6
+ metadata.gz: 817f53fd86e5797ff757e68408777d3b070d235f6db419ee84d42c1821ab4d04b2111408640cd9e826d2107e4f330f5a8a67cd6779c59e1d134e80c6b5da0fbb
7
+ data.tar.gz: 762ed963fdc4113515fb19a740c08711444bf1ccc9b032b382386d4bcefe6a7acc359e597ed255f75c85217e1042ba59ce48291f35d37ba7be775a934571fb3f
data/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # PiggybakBraintree
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'piggybak_braintree'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install piggybak_braintree
20
+
21
+ ## Usage
22
+
23
+ TODO: Write usage instructions here
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it ( https://github.com/[my-github-username]/piggybak_braintree/fork )
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,3 @@
1
+ function braintree_setup(){
2
+ braintree.setup("<%= @client_token %>", "custom", {id: "new_piggybak_order"});
3
+ }
@@ -0,0 +1,39 @@
1
+ module PiggybakBraintree
2
+ class PaymentCalculator::Braintree
3
+ KEYS = ['private_key', 'public_key', 'merchant_id']
4
+ KLASS = ::Braintree
5
+
6
+ def initialize(payment_method)
7
+ @payment_method = payment_method
8
+ end
9
+
10
+ def configure
11
+ Braintree::Configuration.environment = gateway_mode
12
+ Braintree::Configuration.merchant_id = merchant_id
13
+ Braintree::Configuration.public_key = public_key
14
+ Braintree::Configuration.private_key = private_key
15
+ end
16
+
17
+ def client_token
18
+ Braintree::ClientToken.generate
19
+ end
20
+
21
+ def gateway_mode
22
+ Piggybak.config.activemerchant_mode
23
+ end
24
+
25
+ def private_key
26
+ @payment_method.key_values["private_key".to_sym]
27
+ end
28
+
29
+ def public_key
30
+ @payment_method.key_values["public_key".to_sym]
31
+ end
32
+
33
+ def merchant_id
34
+ @payment_method.key_values["merchant_id".to_sym]
35
+ end
36
+
37
+ end
38
+ end
39
+
@@ -0,0 +1,28 @@
1
+ <script src="https://js.braintreegateway.com/v2/braintree.js"></script>
2
+ <h1>Braintree transaction</h1>
3
+ <%= f.fields_for :line_items, @order.line_items.detect { |li| li.line_item_type == "payment" } do |line_item_f| %>
4
+ <%= line_item_f.hidden_field :line_item_type, { :value => "payment" } %>
5
+ <%= line_item_f.fields_for :payment do |payment| %>
6
+ <div class="item">
7
+ <%= payment.label :number %>
8
+ <%= tag :input, {:type => :text, :class => "card-number required", :id => 'myid', data: {'braintree-name' => 'number'}, :name => 'payment_number'}%>
9
+ </div>
10
+
11
+ <div class="item">
12
+ <%= payment.label :verification_value %>
13
+ <%= tag :input, {:type => :text, :class => "card-cvc required", data: {'braintree-name' => 'cvv'}, :name => 'cvv'}%>
14
+ </div>
15
+
16
+ <div class="item">
17
+ <%= payment.label :month %>
18
+ <%= content_tag :select, options_for_select(1.upto(12).to_a), {:class=> 'card-expiry-month', data: {'braintree-name' => 'expiration_month'}}%> /
19
+ <%= content_tag :select, options_for_select(Time.now.year.upto(Time.now.year + 10).to_a), {:class=> 'card-expiry-year', data: {'braintree-name' => 'expiration_year'}}%>
20
+ </div>
21
+ <% end -%>
22
+ <% end -%>
23
+
24
+ <script type="text/javascript" charset="utf-8">
25
+ $(document).ready(function() {
26
+ braintree_setup();
27
+ });
28
+ </script>
data/config/routes.rb ADDED
@@ -0,0 +1,2 @@
1
+ PiggybakStripe::Engine.routes.draw do
2
+ end
@@ -0,0 +1,5 @@
1
+ require "piggybak_braintree/version"
2
+ require "piggybak_braintree/engine"
3
+
4
+ module PiggybakBraintree
5
+ end
@@ -0,0 +1,26 @@
1
+ require 'piggybak_braintree/payment_decorator'
2
+
3
+ module PiggybakBraintree
4
+ class Engine < ::Rails::Engine
5
+ isolate_namespace PiggybakBraintree
6
+ require 'braintree'
7
+
8
+ config.to_prepare do
9
+ Piggybak::Payment.send(:include, ::PiggybakBraintree::PaymentDecorator)
10
+ Piggybak::OrdersController.send(:include, ::PiggybakBraintree::PiggybakOrdersControllerDecorator)
11
+ end
12
+
13
+ initializer "piggybak_realtime_shipping.add_calculators" do
14
+ Piggybak.config do |config|
15
+ #Ensures that stripe is the only calculator because Piggybak
16
+ #only supports one active calculator
17
+ config.payment_calculators = ["::PiggybakBraintree::PaymentCalculator::Braintree"]
18
+ # Override the default country
19
+ config.default_country = "LV"
20
+ # Override the activemerchant billing mode
21
+ config.activemerchant_mode = :sandbox
22
+ config.additional_line_item_attributes = [:payment_method_nonce]
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,40 @@
1
+ module PiggybakBraintree
2
+ module PaymentDecorator
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ attr_accessor :payment_method_nonce
7
+ attr_accessible :payment_method_nonce
8
+
9
+ validates_presence_of :payment_method_nonce, :on => :create
10
+
11
+ [:month, :year, :payment_method_id].each do |field|
12
+ _validators.reject!{ |key, _| key == field }
13
+
14
+ _validate_callbacks.reject! do |callback|
15
+ callback.raw_filter.attributes == [field]
16
+ end
17
+ end
18
+
19
+ def credit_card
20
+ self.payment_method_nonce
21
+ end
22
+
23
+ def process(order)
24
+ return true if !self.new_record?
25
+
26
+ calculator = ::PiggybakBraintree::PaymentCalculator::Braintree.new(self.payment_method)
27
+ Braintree::Configuration.environment = calculator.gateway_mode
28
+ Braintree::Configuration.merchant_id = calculator.merchant_id
29
+ Braintree::Configuration.public_key = calculator.public_key
30
+ Braintree::Configuration.private_key = calculator.private_key
31
+
32
+ raise
33
+ result = Braintree::Transaction.sale(
34
+ :amount => (order.total_due * 100).to_i,
35
+ :payment_method_nonce => self.credit_card
36
+ )
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,76 @@
1
+ module PiggybakBraintree
2
+ module PiggybakOrdersControllerDecorator
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ def submit
7
+ response.headers['Cache-Control'] = 'no-cache'
8
+ @cart = Piggybak::Cart.new(request.cookies["cart"])
9
+
10
+ if request.post?
11
+ logger = Logger.new("#{Rails.root}/#{Piggybak.config.logging_file}")
12
+
13
+ begin
14
+ ActiveRecord::Base.transaction do
15
+ @order = Piggybak::Order.new(orders_params)
16
+ @order.create_payment_shipment
17
+
18
+ if Piggybak.config.logging
19
+ clean_params = params[:order].clone
20
+ clean_params[:line_items_attributes].each do |k, li_attr|
21
+ if li_attr[:line_item_type] == "payment" && li_attr.has_key?(:payment_attributes)
22
+ if li_attr[:payment_attributes].has_key?(:number)
23
+ li_attr[:payment_attributes][:number] = li_attr[:payment_attributes][:number].mask_cc_number
24
+ end
25
+ if li_attr[:payment_attributes].has_key?(:verification_value)
26
+ li_attr[:payment_attributes][:verification_value] = li_attr[:payment_attributes][:verification_value].mask_csv
27
+ end
28
+ end
29
+ end
30
+ logger.info "#{request.remote_ip}:#{Time.now.strftime("%Y-%m-%d %H:%M")} Order received with params #{clean_params.inspect}"
31
+ end
32
+ @order.initialize_user(current_user)
33
+
34
+ @order.ip_address = request.remote_ip
35
+ @order.user_agent = request.user_agent
36
+ @order.add_line_items(@cart)
37
+
38
+ if Piggybak.config.logging
39
+ logger.info "#{request.remote_ip}:#{Time.now.strftime("%Y-%m-%d %H:%M")} Order contains: #{cookies["cart"]} for user #{current_user ? current_user.email : 'guest'}"
40
+ end
41
+
42
+ if @order.save
43
+ if Piggybak.config.logging
44
+ logger.info "#{request.remote_ip}:#{Time.now.strftime("%Y-%m-%d %H:%M")} Order saved: #{@order.inspect}"
45
+ end
46
+
47
+ cookies["cart"] = { :value => '', :path => '/' }
48
+ session[:last_order] = @order.id
49
+ redirect_to piggybak.receipt_url
50
+ else
51
+ if Piggybak.config.logging
52
+ logger.warn "#{request.remote_ip}:#{Time.now.strftime("%Y-%m-%d %H:%M")} Order failed to save #{@order.errors.full_messages} with #{@order.inspect}."
53
+ end
54
+ raise Exception, @order.errors.full_messages
55
+ end
56
+ end
57
+ rescue Exception => e
58
+ if Piggybak.config.logging
59
+ logger.warn "#{request.remote_ip}:#{Time.now.strftime("%Y-%m-%d %H:%M")} Order exception: #{e.inspect}"
60
+ end
61
+ if @order.errors.empty?
62
+ @order.errors[:base] << "Your order could not go through. Please try again."
63
+ end
64
+ end
65
+ else
66
+ @order = Piggybak::Order.new
67
+ @order.create_payment_shipment
68
+ @order.initialize_user(current_user)
69
+ payment_method = ::PiggybakBraintree::PaymentCalculator::Braintree.new(@order.payment_method)
70
+ payment_method.configure
71
+ @client_token = payment_method.client_token
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,3 @@
1
+ module PiggybakBraintree
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,68 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: piggybak_braintree
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Toms Strubergs
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-12-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: breaintree
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 2.55.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 2.55.0
27
+ description: Integration of Braintree payment gateway for use with Piggybak
28
+ email:
29
+ - toms.strubergs@gmail.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - README.md
35
+ - Rakefile
36
+ - app/assets/javascript/payments.js.erb
37
+ - app/models/piggybak_braintree/payment_calculator/braintree.rb
38
+ - app/views/piggybak/orders/_payment.html.erb
39
+ - config/routes.rb
40
+ - lib/piggybak_braintree.rb
41
+ - lib/piggybak_braintree/engine.rb
42
+ - lib/piggybak_braintree/payment_decorator.rb
43
+ - lib/piggybak_braintree/piggybak_orders_controller_decorator.rb
44
+ - lib/piggybak_braintree/version.rb
45
+ homepage: https://github.com/cardiner/piggybak_braintree
46
+ licenses: []
47
+ metadata: {}
48
+ post_install_message:
49
+ rdoc_options: []
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ requirements: []
63
+ rubyforge_project:
64
+ rubygems_version: 2.4.3
65
+ signing_key:
66
+ specification_version: 4
67
+ summary: Piggybak Braintree
68
+ test_files: []