spree_gtpay 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. data/LICENSE +26 -0
  2. data/README.md +77 -0
  3. data/app/assets/javascripts/admin/spree_gtpay.js +1 -0
  4. data/app/assets/javascripts/store/spree_gtpay.js +1 -0
  5. data/app/assets/stylesheets/admin/spree_gtpay.css +3 -0
  6. data/app/assets/stylesheets/store/spree_gtpay.css +3 -0
  7. data/app/controllers/spree/admin/gtpay_transactions_controller.rb +16 -0
  8. data/app/controllers/spree/checkout_controller_decorator.rb +51 -0
  9. data/app/controllers/spree/gtpay_transactions_controller.rb +39 -0
  10. data/app/helpers/spree/admin/base_helper_decorator.rb +10 -0
  11. data/app/mailers/spree/transaction_notification_mailer.rb +17 -0
  12. data/app/models/spree/gateway/gtpay.rb +34 -0
  13. data/app/models/spree/gtpay_transaction.rb +97 -0
  14. data/app/models/spree/order_decorator.rb +21 -0
  15. data/app/models/spree/payment_decorator.rb +7 -0
  16. data/app/overrides/add_tab_for_gtpay_transactions.rb +5 -0
  17. data/app/views/spree/admin/gtpay_transactions/_search_form.html.erb +40 -0
  18. data/app/views/spree/admin/gtpay_transactions/index.html.erb +36 -0
  19. data/app/views/spree/admin/gtpay_transactions/query_interface.js.erb +10 -0
  20. data/app/views/spree/checkout/confirm.html.erb +16 -0
  21. data/app/views/spree/checkout/payment/_gateway.html.erb +0 -0
  22. data/app/views/spree/gtpay_transactions/index.html.erb +36 -0
  23. data/app/views/spree/transaction_notification_mailer/send_mail.html.erb +25 -0
  24. data/config/initializers/constants.rb +1 -0
  25. data/config/locales/en.yml +7 -0
  26. data/config/routes.rb +15 -0
  27. data/db/migrate/20140117061910_gtpay_transaction.rb +19 -0
  28. data/lib/generators/spree_gtpay/install/install_generator.rb +31 -0
  29. data/lib/spree_gtpay/engine.rb +26 -0
  30. data/lib/spree_gtpay/factories.rb +6 -0
  31. data/lib/spree_gtpay.rb +2 -0
  32. data/lib/webpay_methods.rb +21 -0
  33. metadata +110 -0
data/LICENSE ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 2014 Vinsol
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification,
5
+ are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+ * Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+ * Neither the name Spree nor the names of its contributors may be used to
13
+ endorse or promote products derived from this software without specific
14
+ prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,77 @@
1
+ SpreeGtpay [![Code Climate](https://codeclimate.com/github/vinsol/Spree-Gtpay.png)](https://codeclimate.com/github/vinsol/Spree-Gtpay) [![Build Status](https://travis-ci.org/vinsol/Spree-Gtpay.svg)](https://travis-ci.org/vinsol/Spree-Gtpay)
2
+ ==========
3
+
4
+ Enable spree store to allow payment via [GtBank Payment](http://gtbank.com/) (a preferred e-payment service provider in Nigeria, Africa)
5
+
6
+ ####For customer:
7
+
8
+ Customer can pay via GtBank payment method at Checkout. Customer can also see the list of GtBank Transactions initiated by them.
9
+
10
+ ####For admin:
11
+
12
+ Admin can see the list of GtBank Transactions initiated by customers under admin section. Admin can also ping GtBank gateway for an updated status of a transaction and the transaction is then updated accordingly.
13
+
14
+
15
+ Installation
16
+ ------------
17
+
18
+ Add spree_gtpay to your Gemfile:
19
+
20
+ ```ruby
21
+ gem 'spree_gtpay'
22
+ ```
23
+
24
+ Bundle your dependencies and run the installation generator:
25
+
26
+ ```shell
27
+ bundle
28
+ bundle exec rails g spree_gtpay:install
29
+ ```
30
+
31
+ Configuration
32
+ --------
33
+
34
+ 1. To setup the payment method Login as an admin and add a new Payment Method (under Configuration), using following details:
35
+
36
+ ```
37
+ Name: GTBank
38
+ Environment: Production (or what ever environment you prefer)
39
+ Provider: Spree::Gateway::Gtpay
40
+ Active: yes
41
+ ```
42
+
43
+ 2. Click update after adding your credentials in the screen that follows:
44
+
45
+ ```
46
+ Payment Url: Provide payment url provided by GTbank.
47
+ Merchant: provide merchant id provided bt GTbank
48
+ ```
49
+
50
+ 3. After this you need to create ```initializers/gtbank_constant.rb``` and add below mentioned to the same file.
51
+
52
+ ```
53
+ GT_DATA = {:product_id => "xxxx", :mac_id => "xxxxxxxxx", :query_url => "xxxxxx" }
54
+ ```
55
+
56
+ These are the details which are provided by interswitch(Ask about it from GTbank if you dont have it) and replace xxx with exact values provided.
57
+
58
+
59
+ Testing
60
+ -------
61
+
62
+ You need to do a quick one-time creation of a test application and then you can use it to run the tests.
63
+
64
+ bundle exec rake test_app
65
+
66
+ Then run the rspec tests with:
67
+
68
+ bundle exec rspec .
69
+
70
+
71
+
72
+ Credits
73
+ -------
74
+
75
+ [![vinsol.com: Ruby on Rails, iOS and Android developers](http://vinsol.com/vin_logo.png "Ruby on Rails, iOS and Android developers")](http://vinsol.com)
76
+
77
+ Copyright (c) 2014 [vinsol.com](http://vinsol.com "Ruby on Rails, iOS and Android developers"), released under the New MIT License
@@ -0,0 +1 @@
1
+ //= require admin/spree_backend
@@ -0,0 +1 @@
1
+ //= require store/spree_frontend
@@ -0,0 +1,3 @@
1
+ /*
2
+ *= require admin/spree_backend
3
+ */
@@ -0,0 +1,3 @@
1
+ /*
2
+ *= require store/spree_frontend
3
+ */
@@ -0,0 +1,16 @@
1
+ module Spree
2
+ module Admin
3
+ class GtpayTransactionsController < ResourceController
4
+
5
+ def index
6
+ @search = Spree::GtpayTransaction.ransack(params[:q])
7
+ @gtpay_transactions = @search.result.order('created_at desc').page(params[:page]).per(20)
8
+ end
9
+
10
+ def query_interface
11
+ @gtpay_transaction.update_transaction_on_query
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,51 @@
1
+ Spree::CheckoutController.class_eval do
2
+ before_filter :redirect_to_gtpay, :only => [:update]
3
+ helper_method :gtpay_payment_method
4
+
5
+ def confirm
6
+ @transaction = @order.gtpay_transactions.create { |t| t.user = spree_current_user }
7
+ if @transaction.persisted?
8
+ render :layout => false
9
+ else
10
+ set_flash_error
11
+ redirect_to checkout_state_path(@order.state) and return
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def redirect_to_gtpay
18
+ if payment_page?
19
+ payment_method = Spree::PaymentMethod.where(:id => (select_gtpay_payment(params[:order][:payments_attributes])[:payment_method_id])).first
20
+ if payment_method.kind_of?(Spree::Gateway::Gtpay)
21
+ if @order.update_attributes(object_params)
22
+ redirect_to(gtpay_confirm_path) and return
23
+ else
24
+ flash[:error] = "Something went wrong. Please try again"
25
+ redirect_to checkout_state_path("address") and return
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ def payment_page?
32
+ params[:state] == "payment" && params[:order][:payments_attributes]
33
+ end
34
+
35
+ def set_flash_error
36
+ if @transaction.errors[:gtpay_tranx_amount].present?
37
+ flash[:error] = "Minimum amount for order must be above #{Spree::Money.new(Spree::GtpayTransaction::MINIMUM_AMOUNT)}"
38
+ else
39
+ flash[:error] = "Something went wrong. Please try again"
40
+ end
41
+ end
42
+
43
+ def select_gtpay_payment(payment_attributes)
44
+ payment_attributes.select { |payment| payment["payment_method_id"] == gtpay_payment_method.id.to_s }.first
45
+ end
46
+
47
+ def gtpay_payment_method
48
+ Spree::Gateway::Gtpay.first
49
+ end
50
+
51
+ end
@@ -0,0 +1,39 @@
1
+ module Spree
2
+ class GtpayTransactionsController < StoreController
3
+ before_filter :load_gtpay_transaction, :only => :callback
4
+ skip_before_filter :verify_authenticity_token, :only => :callback
5
+ before_filter :authenticate_spree_user!, :only => :index
6
+
7
+ def callback
8
+ if @transaction.update_transaction(transaction_params) && @transaction.successful?
9
+ reset_redirect_to_order_detail
10
+ else
11
+ flash[:error] = "Your Transaction was not successful. <br/> Reason: #{@transaction.gtpay_tranx_status_msg}. <br/> Transaction reference: #{@transaction.gtpay_tranx_id}. <br/> Please Try again".html_safe
12
+ redirect_to checkout_state_path(current_order.state)
13
+ end
14
+ end
15
+
16
+ def index
17
+ @transactions = spree_current_user.gtpay_transactions.includes(:order).order('updated_at desc').page(params[:page]).per(20)
18
+ end
19
+
20
+ private
21
+
22
+ def load_gtpay_transaction
23
+ unless @transaction = current_order.gtpay_transactions.pending.where(:gtpay_tranx_id => params[:gtpay_tranx_id]).first
24
+ redirect_to checkout_state_path(current_order.state), :flash => { :error => "Your Order cannot be processed. Please contact customer support <br/> Reason: #{params[:gtpay_tranx_status_msg]} <br/> Transaction Reference: #{params[:gtpay_tranx_id]}".html_safe }
25
+ end
26
+ end
27
+
28
+ def transaction_params
29
+ { :gtpay_tranx_amount => params[:gtpay_tranx_amt], :gtpay_tranx_status_code => params[:gtpay_tranx_status_code], :gtpay_tranx_status_msg => params[:gtpay_tranx_status_msg] }
30
+ end
31
+
32
+ def reset_redirect_to_order_detail
33
+ session[:order_id] = nil
34
+ flash.notice = "Your Order has been processed successfully. <br/> Transaction Reference: #{params[:gtpay_tranx_id]} <br/> Transaction Code: #{params[:gtpay_tranx_status_code]} <br/> Transaction Message: #{params[:gtpay_tranx_status_msg]}".html_safe
35
+ redirect_to spree.order_path(current_order)
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,10 @@
1
+ Spree::Admin::BaseHelper.module_eval do
2
+
3
+ def set_selected_class(status = nil)
4
+ if params[:q] && status == params[:q][:status_eq]
5
+ return "tab_active"
6
+ elsif !(status || params[:q])
7
+ return "tab_active"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,17 @@
1
+ module Spree
2
+ class TransactionNotificationMailer < ActionMailer::Base
3
+ helper 'application'
4
+
5
+ def send_mail(transaction)
6
+ @transaction = transaction
7
+
8
+ email = @transaction.user.email
9
+ @order = @transaction.order
10
+ @status = @transaction.status
11
+ mail(
12
+ :to => email,
13
+ :subject => "#{Spree::Config[:site_name]} - GTbank Payment Transaction #{@status} notification"
14
+ )
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,34 @@
1
+ module Spree
2
+ class Gateway::Gtpay < Gateway
3
+
4
+ preference :payment_url, :string
5
+ preference :merchant_id, :string
6
+
7
+ attr_accessible :preferred_payment_url, :preferred_merchant_id
8
+
9
+ def actions
10
+ %w{capture void}
11
+ end
12
+
13
+ def can_capture?(payment)
14
+ ['checkout', 'pending'].include?(payment.state)
15
+ end
16
+
17
+ def can_void?(payment)
18
+ payment.state != 'void'
19
+ end
20
+
21
+ def capture(*args)
22
+ ActiveMerchant::Billing::Response.new(true, "", {}, {})
23
+ end
24
+
25
+ def void(*args)
26
+ ActiveMerchant::Billing::Response.new(true, "", {}, {})
27
+ end
28
+
29
+ def source_required?
30
+ false
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,97 @@
1
+ module Spree
2
+ class GtpayTransaction < ActiveRecord::Base
3
+ include WebpayMethods
4
+
5
+ CURRENCY_CODE = { "NGN" => "566", "USD" => "844" }
6
+ MINIMUM_AMOUNT = 25
7
+ PENDING = 'Pending'
8
+ SUCCESSFUL = 'Successful'
9
+ UNSUCCESSFUL = 'Unsuccessful'
10
+
11
+ attr_accessible :gtpay_tranx_status_code, :gtpay_tranx_memo, :gtpay_tranx_status_msg, :gtpay_tranx_amount
12
+
13
+ before_validation :generate_tranx_id, :set_default_attirbutes, :on => :create
14
+ before_update :set_status, :if => :gtpay_tranx_status_code_changed?
15
+ before_update :order_complete_and_finalize, :send_transaction_mail, :if => [:status_changed?, :successful?]
16
+ before_update :order_set_failure_for_payment, :if => [:status_changed?, :unsuccessful?]
17
+
18
+ validates :gtpay_tranx_id, :user, :gtpay_tranx_amount, :gtpay_tranx_currency, :presence => true
19
+ validates :gtpay_tranx_amount, :numericality => true
20
+
21
+ belongs_to :user
22
+ belongs_to :order
23
+
24
+ scope :pending, where(:status => PENDING)
25
+ scope :successful, where(:status => SUCCESSFUL)
26
+
27
+ delegate :total, :gtpay_payment, :complete_and_finalize, :set_failure_for_payment, :to => :order, :prefix => true
28
+ delegate :email, to: :user, allow_nil: true
29
+
30
+ def amount_in_cents
31
+ (gtpay_tranx_amount.to_f*100).round.to_i
32
+ end
33
+
34
+ def successful?
35
+ status == SUCCESSFUL
36
+ end
37
+
38
+ def pending?
39
+ status == PENDING
40
+ end
41
+
42
+ def unsuccessful?
43
+ status == UNSUCCESSFUL
44
+ end
45
+
46
+ def amount_valid?
47
+ gtpay_tranx_amount >= order_total
48
+ end
49
+
50
+ def successful_status_code?
51
+ gtpay_tranx_status_code == "00"
52
+ end
53
+
54
+ def update_transaction(transaction_params)
55
+ self.gtpay_tranx_amount = transaction_params[:gtpay_tranx_amount]
56
+ self.gtpay_tranx_status_code = transaction_params[:gtpay_tranx_status_code]
57
+ self.gtpay_tranx_status_msg = transaction_params[:gtpay_tranx_status_msg]
58
+ if successful_status_code?
59
+ update_transaction_on_query
60
+ else
61
+ self.save
62
+ end
63
+ end
64
+
65
+ def update_transaction_on_query
66
+ response = query_interswitch
67
+ update_attributes(:gtpay_tranx_status_code => response["ResponseCode"], :gtpay_tranx_status_msg => response["ResponseDescription"], :gtpay_tranx_amount => (response["Amount"].to_f/100))
68
+ end
69
+
70
+ private
71
+
72
+ def set_status
73
+ if successful_status_code? && amount_valid?
74
+ self.status = SUCCESSFUL
75
+ else
76
+ self.status = UNSUCCESSFUL
77
+ end
78
+ end
79
+
80
+ def generate_tranx_id
81
+ begin
82
+ self.gtpay_tranx_id = "#{ENVIRONMENT_INITIALS}" + SecureRandom.hex(8)
83
+ end while GtpayTransaction.exists?(:gtpay_tranx_id => gtpay_tranx_id)
84
+ end
85
+
86
+ def set_default_attirbutes
87
+ self.gtpay_tranx_currency = CURRENCY_CODE[order.currency]
88
+ self.gtpay_tranx_amount = order_total
89
+ self.status = PENDING
90
+ end
91
+
92
+ def send_transaction_mail
93
+ Spree::TransactionNotificationMailer.delay.send_mail(self)
94
+ end
95
+
96
+ end
97
+ end
@@ -0,0 +1,21 @@
1
+ Spree::Order.class_eval do
2
+
3
+ has_many :gtpay_transactions
4
+
5
+ def gtpay_payment
6
+ @gtpay_payment_method = Spree::Gateway::Gtpay.where(:environment => Rails.env).first
7
+ payments.where("payment_method_id = #{@gtpay_payment_method.id} and state in ('checkout', 'processing', 'pending')").first if @gtpay_payment_method
8
+ end
9
+
10
+ def complete_and_finalize
11
+ gtpay_payment.process_and_complete!
12
+
13
+ update_attributes({:state => "complete", :completed_at => Time.current}, :without_protection => true)
14
+ finalize!
15
+ end
16
+
17
+ def set_failure_for_payment
18
+ gtpay_payment.started_processing!
19
+ gtpay_payment.failure!
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ Spree::Payment.class_eval do
2
+
3
+ def process_and_complete!
4
+ started_processing!
5
+ complete!
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ Deface::Override.new(:virtual_path => "spree/admin/shared/_configuration_menu",
2
+ :name => "add_gtpay_transaction_link_configuration_menu",
3
+ :insert_bottom => "[data-hook='admin_configurations_sidebar_menu']",
4
+ :text => %q{<%= configurations_sidebar_menu_item Spree.t("gtpay_transactions"), admin_gtpay_transactions_path %>},
5
+ :disabled => false)
@@ -0,0 +1,40 @@
1
+ <% content_for :table_filter_title do %>
2
+ <%= Spree.t(:search) %>
3
+ <% end %>
4
+
5
+ <% content_for :table_filter do %>
6
+ <div data-hook="admin_transactions_index_search">
7
+ <%= search_form_for [:admin, @search] do |f| %>
8
+
9
+ <div class="four columns">
10
+ <div class="field">
11
+ <%= label_tag nil, Spree.t(:gtpay_tranx_id) %>
12
+ <%= f.text_field :gtpay_tranx_id_eq %>
13
+ </div>
14
+ <div class="field">
15
+ <%= label_tag nil, Spree.t(:email) %>
16
+ <%= f.email_field :user_email_eq %>
17
+ </div>
18
+ <div class="field">
19
+ <%= f.hidden_field :status_eq, :value => params[:q][:status_eq] if params[:q] %>
20
+ </div>
21
+ </div>
22
+
23
+ <div class="clearfix"></div>
24
+
25
+ <div class="actions filter-actions">
26
+ <div data-hook="admin_orders_index_search_buttons">
27
+ <%= button Spree.t(:filter_results), 'icon-search' %>
28
+ </div>
29
+ </div>
30
+ <% end %>
31
+ </div>
32
+ <% end %>
33
+ <%= link_to "All", admin_gtpay_transactions_path, :class => set_selected_class %>
34
+ |
35
+ <%= link_to "Successful", admin_gtpay_transactions_path('q[status_eq]' => "Successful"), :class => set_selected_class("Successful") %> |
36
+ <%= link_to "Pending", admin_gtpay_transactions_path('q[status_eq]' => "Pending"), :class => set_selected_class("Pending") %>
37
+ |
38
+ <%= link_to "Unsuccessful", admin_gtpay_transactions_path('q[status_eq]' => "Unsuccessful"), :class => set_selected_class("Unsuccessful") %>
39
+ <div class="clearfix"></div>
40
+ <br/>
@@ -0,0 +1,36 @@
1
+ <%= render :partial => 'spree/admin/shared/configuration_menu' %>
2
+ <% content_for :page_title do %>
3
+ <h1><%= Spree.t("gtpay_transactions") %></h1>
4
+ <% end %>
5
+ <%= render :partial => "search_form" %>
6
+
7
+ <table class="index">
8
+ <thead data-hook="admin_gtpay_transactions_index_headers">
9
+ <th><%= Spree.t("transaction_id") %></th>
10
+ <th><%= Spree.t("transaction_date") %></th>
11
+ <th><%= Spree.t("amount") %></th>
12
+ <th><%= Spree.t("order#") %></th>
13
+ <th><%= Spree.t("user") %></th>
14
+ <th><%= Spree.t("status") %></th>
15
+ <th><%= Spree.t("action") %></th>
16
+ </thead>
17
+ <tbody>
18
+ <% @gtpay_transactions.each do |transaction|%>
19
+ <tr id="<%= dom_id transaction %>" data-hook="admin_trackers_index_rows">
20
+ <td><%= transaction.gtpay_tranx_id %></td>
21
+ <td><%= transaction.created_at %></td>
22
+ <td><%= Spree::Money.new(transaction.gtpay_tranx_amount) %></td>
23
+ <td><%= transaction.order.number if transaction.order.present? %></td>
24
+ <td><%= transaction.user.email %></td>
25
+ <td id= "<%= transaction.id%>" class="status"><%= transaction.status %></td>
26
+ <td id= "<%= transaction.id%>" class="action" >
27
+ <%= link_to_unless(transaction.pending?, "") do %>
28
+ <%= button_to(Spree.t(:query), query_interface_admin_gtpay_transaction_path(transaction), :remote => true, :confirm => "Are you sure?", :method => :get) %>
29
+ <% end %>
30
+ </td>
31
+ </tr>
32
+ <% end %>
33
+ </tbody>
34
+ </table>
35
+
36
+ <%= paginate @gtpay_transactions %>
@@ -0,0 +1,10 @@
1
+ $("td#<%= @gtpay_transaction.id%>.status").html("<%= @gtpay_transaction.status %>");
2
+ <% if @gtpay_transaction.successful? %>
3
+ $("td#<%= @gtpay_transaction.id%>.action").html('');
4
+ alert("Transaction is successfully Completed");
5
+ <% elsif @gtpay_transaction.unsuccessful? %>
6
+ $("td#<%= @gtpay_transaction.id%>.action").html('');
7
+ alert("Transaction is unsuccessful, Reason: <%= @gtpay_transaction.gtpay_tranx_status_msg %>");
8
+ <% else %>
9
+ alert("No response from Webpay");
10
+ <% end %>
@@ -0,0 +1,16 @@
1
+ <html>
2
+ <body onload="document.submit2gtpay_form.submit()" style="text-align:center; font-family:Arial, Helvetica, sans-serif; padding-top:100px;">
3
+ <h1 class="message">We are processing your request.<br/>Please do not press browser back button</h1>
4
+ <div style="text-align:center; padding:50px 0;" align="center"><img src="http://www.youth.athletics.ca/images/ajax-loader.gif"></div>
5
+ <form name="submit2gtpay_form" action="<%= gtpay_payment_method.preferred_payment_url%>" target="_self" method="post" style="diaplay:none;">
6
+ <input type="hidden" name="gtpay_mert_id" value="<%= gtpay_payment_method.preferred_merchant_id %>" />
7
+ <input type="hidden" name="gtpay_tranx_id" value="<%= @transaction.gtpay_tranx_id %>" />
8
+ <input type="hidden" name="gtpay_tranx_amt" value="<%= @transaction.amount_in_cents %>" />
9
+ <input type="hidden" name="gtpay_tranx_curr" value="<%= @transaction.gtpay_tranx_currency %>" />
10
+ <input type="hidden" name="gtpay_cust_id" value="<%= @transaction.user_id %>" />
11
+ <input type="hidden" name="gtpay_cust_name" value="<%= @transaction.email %>" />
12
+ <input type="hidden" name="gtpay_tranx_noti_url" value="<%= callback_gtpay_transactions_url %>" />
13
+ <input type="submit" value="Pay Via GTPay" name="btnSubmit" style="display:none"/>
14
+ </form>
15
+ </body>
16
+ </html>
@@ -0,0 +1,36 @@
1
+ <div class="fieldset_style">
2
+ <h3>Transactions</h3>
3
+ <% if @transactions.present? %>
4
+ <table class="order-summary responsive_table" cellspacing="0" cellpadding="0" border="0">
5
+ <thead>
6
+ <tr>
7
+ <th>Payment Service</th>
8
+ <th>Transaction Status</th>
9
+ <th>Transaction Number</th>
10
+ <th><%= Spree.t(:approved_amount) %></th>
11
+ <th>Response(Code:Description)</th>
12
+ <th>Date</th>
13
+ </tr>
14
+ </thead>
15
+ <tbody>
16
+ <% @transactions.each do |transaction| %>
17
+ <tr class="<%= cycle('even', 'odd') %>">
18
+ <td data-title="Payment"><%= "Gtbank Online Payment" %></td>
19
+ <td data-title="Trans. Status"><%= transaction.status.try(:capitalize) %></td>
20
+ <td data-title="Trans. No."><%= transaction.gtpay_tranx_id %></td>
21
+ <td data-title="Approved"><%= Spree::Money.new(transaction.gtpay_tranx_amount) if transaction.order.present? %></td>
22
+ <% if transaction.gtpay_tranx_status_code? && transaction.gtpay_tranx_status_msg? %>
23
+ <td data-title="Response">ApprovalCode:<%= transaction.gtpay_tranx_status_code %><br/ > Description:<%= transaction.gtpay_tranx_status_msg %></td>
24
+ <% else %>
25
+ <td data-title="Response">No Response</td>
26
+ <% end %>
27
+ <td data-title="Date"><%= transaction.created_at.strftime("%d %b %Y, %I:%M%p") %></td>
28
+ </tr>
29
+ <% end %>
30
+ </tbody>
31
+ </table>
32
+ <%= paginate @transactions %>
33
+ <% else %>
34
+ No Transactions
35
+ <% end %>
36
+ </div>
@@ -0,0 +1,25 @@
1
+ <table border="0" cellpadding="5" cellspacing="0">
2
+ <tr>
3
+ <th colspan="2" align="left">Your GTbank Payment Transaction was <%= @status %>. Below mentioned are the details</th>
4
+ </tr>
5
+ <tr>
6
+ <td>Transaction Details</td>
7
+ </tr>
8
+ <tr>
9
+ <td>Transaction ID</td>
10
+ <td>: <%= @transaction.gtpay_tranx_id %></td>
11
+ </tr>
12
+ <tr>
13
+ <td>Transaction Amount</td>
14
+ <td>: <%= Spree::Money.new(@transaction.gtpay_tranx_amount) %></td>
15
+ </tr>
16
+
17
+ <tr>
18
+ <td>Order Description</td>
19
+ <% if @order.line_items.count == 1 %>
20
+ <td>: Payment for <%= @order.line_items.first.product.name + " at #{Spree::Config[:site_name]}"%></td>
21
+ <% else %>
22
+ <td>: Payment for <%= @order.line_items.count.to_s + " products at #{Spree::Config[:site_name]}"%></td>
23
+ <% end %>
24
+ </tr>
25
+ </table>
@@ -0,0 +1 @@
1
+ ENVIRONMENT_INITIALS = Rails.env.first(2)
@@ -0,0 +1,7 @@
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
+ query: "Query"
data/config/routes.rb ADDED
@@ -0,0 +1,15 @@
1
+ Spree::Core::Engine.routes.draw do
2
+
3
+ get :gtpay_confirm, :controller => "checkout", :action => "confirm"
4
+ resources :gtpay_transactions, :only => [:index] do
5
+ collection do
6
+ post :callback
7
+ end
8
+ end
9
+
10
+ namespace :admin do
11
+ resources :gtpay_transactions, :only => [:index] do
12
+ get :query_interface, :on => :member
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ class GtpayTransaction < ActiveRecord::Migration
2
+ def change
3
+ create_table :spree_gtpay_transactions do |t|
4
+ t.references :order
5
+ t.string :gtpay_tranx_id
6
+ t.decimal :gtpay_tranx_amount, :precision => 8, :scale => 2
7
+ t.string :gtpay_tranx_currency
8
+ t.integer :user_id
9
+ t.string :gtpay_tranx_status_code
10
+ t.string :gtpay_tranx_memo
11
+ t.string :gtpay_tranx_status_msg
12
+ t.string :status
13
+ t.timestamps
14
+ end
15
+ add_index :spree_gtpay_transactions, :gtpay_tranx_id
16
+ add_index :spree_gtpay_transactions, :user_id
17
+ add_index :spree_gtpay_transactions, :status
18
+ end
19
+ end
@@ -0,0 +1,31 @@
1
+ module SpreeGtpay
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 'app/assets/javascripts/store/all.js', "//= require store/spree_gtpay\n"
9
+ append_file 'app/assets/javascripts/admin/all.js', "//= require admin/spree_gtpay\n"
10
+ end
11
+
12
+ def add_stylesheets
13
+ inject_into_file 'app/assets/stylesheets/store/all.css', " *= require store/spree_gtpay\n", :before => /\*\//, :verbose => true
14
+ inject_into_file 'app/assets/stylesheets/admin/all.css', " *= require admin/spree_gtpay\n", :before => /\*\//, :verbose => true
15
+ end
16
+
17
+ def add_migrations
18
+ run 'bundle exec rake railties:install:migrations FROM=spree_gtpay'
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
@@ -0,0 +1,26 @@
1
+ module SpreeGtpay
2
+ class Engine < Rails::Engine
3
+ require 'spree/core'
4
+ isolate_namespace Spree
5
+ engine_name 'spree_gtpay'
6
+
7
+ config.autoload_paths += %W(#{config.root}/lib)
8
+
9
+ # use rspec for tests
10
+ config.generators do |g|
11
+ g.test_framework :rspec
12
+ end
13
+
14
+ def self.activate
15
+ Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
16
+ Rails.configuration.cache_classes ? require(c) : load(c)
17
+ end
18
+ end
19
+
20
+ initializer "spree.register.payment_methods" do |app|
21
+ app.config.spree.payment_methods << Spree::Gateway::Gtpay
22
+ end
23
+
24
+ config.to_prepare &method(:activate).to_proc
25
+ end
26
+ end
@@ -0,0 +1,6 @@
1
+ FactoryGirl.define do
2
+ # Define your Spree extensions Factories within this file to enable applications, and other extensions to use and override them.
3
+ #
4
+ # Example adding this to your spec_helper will load these Factories for use:
5
+ # require 'spree_gtpay/factories'
6
+ end
@@ -0,0 +1,2 @@
1
+ require 'spree_core'
2
+ require 'spree_gtpay/engine'
@@ -0,0 +1,21 @@
1
+ module WebpayMethods
2
+ private
3
+
4
+ def query_interswitch
5
+ headers = {:headers => { "Hash" => transaction_hash} }
6
+ begin
7
+ HTTParty.get("#{GT_DATA[:query_url]}#{transaction_params}", headers).parsed_response
8
+ rescue
9
+ {}
10
+ end
11
+ end
12
+
13
+ def transaction_params
14
+ "?productid=#{GT_DATA[:product_id]}&transactionreference=#{gtpay_tranx_id}&amount=#{amount_in_cents}"
15
+ end
16
+
17
+ def transaction_hash
18
+ Digest::SHA512.hexdigest(GT_DATA[:product_id] + gtpay_tranx_id + GT_DATA[:mac_id])
19
+ end
20
+
21
+ end
metadata ADDED
@@ -0,0 +1,110 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spree_gtpay
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Abhishek Jain
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-03-24 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: spree_core
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 2.0.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 2.0.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: delayed_job_active_record
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 4.0.0
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 4.0.0
46
+ description: Enable spree store to allow payment via GtPay
47
+ email: info@vinsol.com
48
+ executables: []
49
+ extensions: []
50
+ extra_rdoc_files: []
51
+ files:
52
+ - LICENSE
53
+ - README.md
54
+ - app/assets/javascripts/admin/spree_gtpay.js
55
+ - app/assets/javascripts/store/spree_gtpay.js
56
+ - app/assets/stylesheets/admin/spree_gtpay.css
57
+ - app/assets/stylesheets/store/spree_gtpay.css
58
+ - app/controllers/spree/admin/gtpay_transactions_controller.rb
59
+ - app/controllers/spree/checkout_controller_decorator.rb
60
+ - app/controllers/spree/gtpay_transactions_controller.rb
61
+ - app/helpers/spree/admin/base_helper_decorator.rb
62
+ - app/mailers/spree/transaction_notification_mailer.rb
63
+ - app/models/spree/gateway/gtpay.rb
64
+ - app/models/spree/gtpay_transaction.rb
65
+ - app/models/spree/order_decorator.rb
66
+ - app/models/spree/payment_decorator.rb
67
+ - app/overrides/add_tab_for_gtpay_transactions.rb
68
+ - app/views/spree/admin/gtpay_transactions/_search_form.html.erb
69
+ - app/views/spree/admin/gtpay_transactions/index.html.erb
70
+ - app/views/spree/admin/gtpay_transactions/query_interface.js.erb
71
+ - app/views/spree/checkout/confirm.html.erb
72
+ - app/views/spree/checkout/payment/_gateway.html.erb
73
+ - app/views/spree/gtpay_transactions/index.html.erb
74
+ - app/views/spree/transaction_notification_mailer/send_mail.html.erb
75
+ - config/initializers/constants.rb
76
+ - config/locales/en.yml
77
+ - config/routes.rb
78
+ - lib/generators/spree_gtpay/install/install_generator.rb
79
+ - lib/spree_gtpay/engine.rb
80
+ - lib/spree_gtpay/factories.rb
81
+ - lib/spree_gtpay.rb
82
+ - lib/webpay_methods.rb
83
+ - db/migrate/20140117061910_gtpay_transaction.rb
84
+ homepage: http://www.vinsol.com
85
+ licenses:
86
+ - MIT
87
+ post_install_message:
88
+ rdoc_options: []
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: 1.9.3
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ requirements:
104
+ - none
105
+ rubyforge_project:
106
+ rubygems_version: 1.8.23
107
+ signing_key:
108
+ specification_version: 3
109
+ summary: Enable spree store to allow payment via GtPay
110
+ test_files: []