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 +7 -0
- data/README.md +31 -0
- data/Rakefile +2 -0
- data/app/assets/javascript/payments.js.erb +3 -0
- data/app/models/piggybak_braintree/payment_calculator/braintree.rb +39 -0
- data/app/views/piggybak/orders/_payment.html.erb +28 -0
- data/config/routes.rb +2 -0
- data/lib/piggybak_braintree.rb +5 -0
- data/lib/piggybak_braintree/engine.rb +26 -0
- data/lib/piggybak_braintree/payment_decorator.rb +40 -0
- data/lib/piggybak_braintree/piggybak_orders_controller_decorator.rb +76 -0
- data/lib/piggybak_braintree/version.rb +3 -0
- metadata +68 -0
    
        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,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,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
         | 
    
        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: []
         |