piggybak_braintree 0.0.1

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.
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: []