spree_paypal_adaptive_payment 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +22 -0
- data/Gemfile +34 -0
- data/MIT-LICENSE.txt +20 -0
- data/README.markdown +3 -0
- data/Rakefile +14 -0
- data/TAGS +64 -0
- data/Versionfile +1 -0
- data/app/models/billing_integration/paypal_adaptive_payment.rb +25 -0
- data/app/models/paypal_adaptive_payment_account.rb +99 -0
- data/app/views/admin/payments/source_forms/_paypal_adaptive_payments.html.erb +9 -0
- data/app/views/admin/payments/source_views/_paypal_adaptive_payments.html.erb +110 -0
- data/app/views/admin/paypal_adaptive_payments/refund.html.erb +15 -0
- data/app/views/checkout/_confirm.html.erb +11 -0
- data/app/views/checkout/_delivery.html.erb +25 -0
- data/app/views/checkout/_payment.html.erb +30 -0
- data/app/views/checkout/edit.html.erb +18 -0
- data/app/views/checkout/payment/_check.html.erb +0 -0
- data/app/views/checkout/payment/_gateway.html.erb +31 -0
- data/app/views/checkout/payment/_paypal_adaptive_payment.html.erb +3 -0
- data/app/views/checkout/payment/_paypaladaptivepayment.html.erb +3 -0
- data/app/views/checkout/registration.html.erb +20 -0
- data/app/views/shared/_paypal_adaptive_paymetns_checkout.html.erb +3 -0
- data/app/views/shared/paypal_adaptive_payments_confirm.html.erb +10 -0
- data/config/locales/en.yml +32 -0
- data/config/routes.rb +26 -0
- data/db/migrate/20100226133156_create_paypal_adaptive_payment_accounts.rb +15 -0
- data/doc/BillingIntegration/PaypalAdaptivePayment.html +263 -0
- data/doc/PaypalAdaptivePaymentAccount.html +683 -0
- data/doc/SpreePaypalAdaptivePayment/Engine.html +200 -0
- data/doc/SpreePaypalAdaptivePayment.html +106 -0
- data/doc/SpreePaypalAdaptivePaymentHooks.html +116 -0
- data/doc/_index.html +146 -0
- data/doc/class_list.html +47 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +53 -0
- data/doc/css/style.css +320 -0
- data/doc/file.README.html +69 -0
- data/doc/file_list.html +49 -0
- data/doc/frames.html +13 -0
- data/doc/index.html +69 -0
- data/doc/js/app.js +205 -0
- data/doc/js/full_list.js +150 -0
- data/doc/js/jquery.js +16 -0
- data/doc/method_list.html +134 -0
- data/doc/top-level-namespace.html +105 -0
- data/lib/spree_paypal_adaptive_payment.rb +24 -0
- data/lib/spree_paypal_adaptive_payment_hooks.rb +3 -0
- data/lib/tasks/spree_paypal_adaptive_payment.rake +26 -0
- data/public/images/paypal111.gif +0 -0
- data/spec/controllers/checkout_controller_spec.rb +278 -0
- data/spec/factories/address_factory.rb +13 -0
- data/spec/factories/order_factory.rb +11 -0
- data/spec/factories/state_factory.rb +5 -0
- data/spec/spec_helper.rb +40 -0
- data/spree_paypal_adaptive_payment.gemspec +17 -0
- metadata +111 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
source 'http://rubygems.org'
|
2
|
+
|
3
|
+
gem 'sqlite3-ruby', :require => 'sqlite3'
|
4
|
+
|
5
|
+
group :test do
|
6
|
+
gem 'rspec-rails', '= 2.4.1'
|
7
|
+
gem 'factory_girl', '= 1.3.3'
|
8
|
+
gem 'factory_girl_rails', '= 1.0.1'
|
9
|
+
gem 'rcov'
|
10
|
+
gem 'shoulda'
|
11
|
+
gem 'faker'
|
12
|
+
if RUBY_VERSION < "1.9"
|
13
|
+
gem "ruby-debug"
|
14
|
+
else
|
15
|
+
gem "ruby-debug19"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
group :cucumber do
|
20
|
+
gem 'cucumber-rails'
|
21
|
+
gem 'database_cleaner', '~> 0.5.2'
|
22
|
+
gem 'nokogiri'
|
23
|
+
gem 'capybara'
|
24
|
+
gem 'factory_girl', '= 1.3.3'
|
25
|
+
gem 'factory_girl_rails', '= 1.0.1'
|
26
|
+
gem 'faker'
|
27
|
+
gem 'launchy'
|
28
|
+
|
29
|
+
if RUBY_VERSION < "1.9"
|
30
|
+
gem "ruby-debug"
|
31
|
+
else
|
32
|
+
gem "ruby-debug19"
|
33
|
+
end
|
34
|
+
end
|
data/MIT-LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 Jose Pablo Barrantes
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOa AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SaALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.markdown
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/clean'
|
3
|
+
require 'rake/testtask'
|
4
|
+
require 'yard'
|
5
|
+
require "bundler/gem_tasks"
|
6
|
+
|
7
|
+
desc "Default Task"
|
8
|
+
task :default => :test
|
9
|
+
|
10
|
+
Rake::TestTask.new
|
11
|
+
|
12
|
+
YARD::Rake::YardocTask.new do |t|
|
13
|
+
t.options += ['--verbose', '--title', "PayPal Adaptive Payments to Spree store"]
|
14
|
+
end
|
data/TAGS
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
|
2
|
+
db/migrate/20100226133156_create_paypal_adaptive_payment_accounts.rb,128
|
3
|
+
class CreatePaypalAccounts < ActiveRecord::MigrationCreatePaypalAccounts1,0
|
4
|
+
def self.upup2,53
|
5
|
+
def self.downdown12,251
|
6
|
+
|
7
|
+
spec/spec_helper.rb,32
|
8
|
+
def self.globalglobal35,989
|
9
|
+
|
10
|
+
spec/controllers/checkout_controller_spec.rb,0
|
11
|
+
|
12
|
+
spec/factories/order_factory.rb,0
|
13
|
+
|
14
|
+
spec/factories/state_factory.rb,0
|
15
|
+
|
16
|
+
spec/factories/address_factory.rb,0
|
17
|
+
|
18
|
+
config/routes.rb,0
|
19
|
+
|
20
|
+
app/controllers/checkout_controller_decorator.rb,887
|
21
|
+
def paypal_adaptive_payment_confirmpaypal_adaptive_payment_confirm6,192
|
22
|
+
def paypal_adaptive_payment_detailspaypal_adaptive_payment_details87,3119
|
23
|
+
def paypal_adaptive_payment_finishpaypal_adaptive_payment_finish101,3628
|
24
|
+
def record_log(payment, response)record_log160,5556
|
25
|
+
def redirect_to_paypal_adaptive_payment_form_if_neededredirect_to_paypal_adaptive_payment_form_if_needed164,5660
|
26
|
+
def fixed_optsfixed_opts179,6256
|
27
|
+
def order_opts(order, payment_method, stage)order_opts209,7591
|
28
|
+
def address_options(order)address_options266,10332
|
29
|
+
def all_opts(order, payment_method, stage=nil)all_opts287,11108
|
30
|
+
def flat_rate_shipping_and_handling_options(order, stage)flat_rate_shipping_and_handling_options301,11591
|
31
|
+
def gateway_error(response)gateway_error324,12573
|
32
|
+
def payment_methodpayment_method338,12924
|
33
|
+
def paypal_gatewaypaypal_gateway342,13003
|
34
|
+
|
35
|
+
app/controllers/paypal_adaptive_payment_callbacks_controller.rb,191
|
36
|
+
class PaypalAdaptivePaymentCallbacksController < Spree::BaseControllerPaypalAdaptivePaymentCallbacksController1,0
|
37
|
+
def notifynotify7,184
|
38
|
+
def retrieve_detailsretrieve_details32,875
|
39
|
+
|
40
|
+
app/models/paypal_adaptive_payment_account.rb,596
|
41
|
+
class PaypalAdaptivePaymentAccount < ActiveRecord::BasePaypalAdaptivePaymentAccount2,89
|
42
|
+
def actionsactions5,183
|
43
|
+
def capture(payment)capture9,227
|
44
|
+
def can_capture?(payment)can_capture?22,585
|
45
|
+
def credit(payment, amount=nil)credit26,672
|
46
|
+
def can_credit?(payment)can_credit?43,1294
|
47
|
+
def payment_gatewaypayment_gateway51,1561
|
48
|
+
def echeck?(payment)echeck?55,1600
|
49
|
+
def record_log(payment, response)record_log66,1896
|
50
|
+
def find_authorization(payment)find_authorization71,2010
|
51
|
+
def find_capture(payment)find_capture82,2378
|
52
|
+
def gateway_error(text)gateway_error94,2762
|
53
|
+
|
54
|
+
app/models/billing_integration/paypal_adaptive_payment.rb,134
|
55
|
+
class BillingIntegration::PaypalAdaptivePayment < BillingIntegrationBillingIntegration1,0
|
56
|
+
def provider_classprovider_class9,300
|
57
|
+
|
58
|
+
lib/spree_paypal_adaptive_payment_hooks.rb,110
|
59
|
+
class SpreePaypalAdaptivePaymentHooks < Spree::ThemeSupport::HookListenerSpreePaypalAdaptivePaymentHooks1,0
|
60
|
+
|
61
|
+
lib/spree_paypal_adaptive_payment.rb,147
|
62
|
+
module SpreePaypalAdaptivePaymentSpreePaypalAdaptivePayment4,68
|
63
|
+
class Engine < Rails::EngineEngine5,102
|
64
|
+
def self.activateactivate9,187
|
data/Versionfile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
"0.1.0" => { :branch => "master" }
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class BillingIntegration::PaypalAdaptivePayment < BillingIntegration
|
2
|
+
preference :login, :string
|
3
|
+
preference :password, :password
|
4
|
+
preference :signature, :string
|
5
|
+
preference :appid, :string
|
6
|
+
preference :review, :boolean, :default => false
|
7
|
+
preference :no_shipping, :boolean, :default => false
|
8
|
+
preference :currency, :string, :default => 'USD'
|
9
|
+
|
10
|
+
def provider_class
|
11
|
+
# This relies on https://github.com/jpablobr/active_paypal_adaptive_payment
|
12
|
+
ActiveMerchant::Billing::PaypalAdaptivePayment
|
13
|
+
end
|
14
|
+
|
15
|
+
# Spree requires this method for the profiles implementation.
|
16
|
+
# http://spreecommerce.com/documentation/checkout.html#payment-profiles
|
17
|
+
# def create_profile(payment); end
|
18
|
+
|
19
|
+
# Set this to true in order to display the confirm state
|
20
|
+
# in the checkout process...
|
21
|
+
def payment_profiles_supported?
|
22
|
+
false
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# https://github.com/spree/spree_paypal_express/blob/master/app/models/paypal_account.rb
|
2
|
+
class PaypalAdaptivePaymentAccount < ActiveRecord::Base
|
3
|
+
has_many :payments, :as => :source
|
4
|
+
|
5
|
+
def actions
|
6
|
+
%w{capture credit}
|
7
|
+
end
|
8
|
+
|
9
|
+
def capture(payment)
|
10
|
+
authorization = find_authorization(payment)
|
11
|
+
|
12
|
+
ppx_response = payment.payment_method.provider.capture((100 * payment.amount).to_i, authorization.params["transaction_id"])
|
13
|
+
if ppx_response.success?
|
14
|
+
record_log payment, ppx_response
|
15
|
+
payment.complete
|
16
|
+
else
|
17
|
+
gateway_error(ppx_response.message)
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
def can_capture?(payment)
|
23
|
+
!echeck?(payment) && payment.state == "pending"
|
24
|
+
end
|
25
|
+
|
26
|
+
def credit(payment, amount=nil)
|
27
|
+
authorization = find_capture(payment)
|
28
|
+
|
29
|
+
amount = payment.credit_allowed >= payment.order.outstanding_balance.abs ? payment.order.outstanding_balance : payment.credit_allowed
|
30
|
+
|
31
|
+
ppx_response = payment.payment_method.provider.credit(amount.nil? ? (100 * amount).to_i : (100 * amount).to_i, authorization.params['transaction_id'])
|
32
|
+
|
33
|
+
if ppx_response.success?
|
34
|
+
record_log payment, ppx_response
|
35
|
+
payment.update_attribute(:amount, payment.amount - amount)
|
36
|
+
payment.complete
|
37
|
+
payment.order.update!
|
38
|
+
else
|
39
|
+
gateway_error(ppx_response.message)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def can_credit?(payment)
|
44
|
+
return false unless payment.state == "completed"
|
45
|
+
return false unless payment.order.payment_state == "credit_owed"
|
46
|
+
payment.credit_allowed > 0
|
47
|
+
!find_capture(payment).nil?
|
48
|
+
end
|
49
|
+
|
50
|
+
# fix for Payment#payment_profiles_supported?
|
51
|
+
def payment_gateway
|
52
|
+
false
|
53
|
+
end
|
54
|
+
|
55
|
+
def echeck?(payment)
|
56
|
+
logs = payment.log_entries.all(:order => 'created_at DESC')
|
57
|
+
logs.each do |log|
|
58
|
+
details = YAML.load(log.details) # return the transaction details
|
59
|
+
if details.params['payment_type'] == 'echeck'
|
60
|
+
return true
|
61
|
+
end
|
62
|
+
end
|
63
|
+
return false
|
64
|
+
end
|
65
|
+
|
66
|
+
def record_log(payment, response)
|
67
|
+
payment.log_entries.create(:details => response.to_yaml)
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
def find_authorization(payment)
|
72
|
+
logs = payment.log_entries.all(:order => 'created_at DESC')
|
73
|
+
logs.each do |log|
|
74
|
+
details = YAML.load(log.details) # return the transaction details
|
75
|
+
if (details.params['payment_status'] == 'Pending' && details.params['pending_reason'] == 'authorization')
|
76
|
+
return details
|
77
|
+
end
|
78
|
+
end
|
79
|
+
return nil
|
80
|
+
end
|
81
|
+
|
82
|
+
def find_capture(payment)
|
83
|
+
#find the transaction associated with the original authorization/capture
|
84
|
+
logs = payment.log_entries.all(:order => 'created_at DESC')
|
85
|
+
logs.each do |log|
|
86
|
+
details = YAML.load(log.details) # return the transaction details
|
87
|
+
if details.params['payment_status'] == 'Completed'
|
88
|
+
return details
|
89
|
+
end
|
90
|
+
end
|
91
|
+
return nil
|
92
|
+
end
|
93
|
+
|
94
|
+
def gateway_error(text)
|
95
|
+
msg = "#{I18n.t('gateway_error')} ... #{text}"
|
96
|
+
logger.error(msg)
|
97
|
+
raise Spree::GatewayError.new(msg)
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
<fieldset>
|
2
|
+
<legend><%= t('paypal_account') %></legend>
|
3
|
+
|
4
|
+
<table class="index">
|
5
|
+
<tr>
|
6
|
+
<th colspan="6"><%= t('account_details') %></th>
|
7
|
+
</tr>
|
8
|
+
<tr>
|
9
|
+
<td><label><%= t("email") %>:</label></td>
|
10
|
+
<td>
|
11
|
+
<%= payment.source.email %>
|
12
|
+
</td>
|
13
|
+
<td><label><%= t("payer_id") %>:</label></td>
|
14
|
+
<td>
|
15
|
+
<%= payment.source.payer_id %>
|
16
|
+
</td>
|
17
|
+
<td><label><%= t("payer_country") %>:</label></td>
|
18
|
+
<td>
|
19
|
+
<%= payment.source.payer_country %>
|
20
|
+
</td>
|
21
|
+
</tr>
|
22
|
+
<tr>
|
23
|
+
<td><label><%= t("payer_status") %>:</label></td>
|
24
|
+
<td colspan="5">
|
25
|
+
<%= payment.source.payer_status %>
|
26
|
+
</td>
|
27
|
+
</tr>
|
28
|
+
</table>
|
29
|
+
</fieldset>
|
30
|
+
|
31
|
+
<fieldset>
|
32
|
+
<legend><%= t('transactions') %></legend>
|
33
|
+
|
34
|
+
<% payment.log_entries.reverse.each do |log| %>
|
35
|
+
<% details = YAML.load(log.details) rescue "" %>
|
36
|
+
<table class="index">
|
37
|
+
|
38
|
+
<% if details.is_a? ActiveMerchant::Billing::PaypalExpressResponse %>
|
39
|
+
<tr>
|
40
|
+
<th colspan="6"><%= t('transaction') %> <%= details.params["transaction_id"] %> - <%= log.created_at.to_s(:date_time24) %></th>
|
41
|
+
</tr>
|
42
|
+
<tr>
|
43
|
+
<td width="12%;"><label><%= t('type') %>:</label></td>
|
44
|
+
<td width="20%;">
|
45
|
+
<%= details.params["transaction_type"] %>
|
46
|
+
</td>
|
47
|
+
<td width="8%;"><label><%= t("result") %>:</label></td>
|
48
|
+
<td width="20%;">
|
49
|
+
<%= details.message %>
|
50
|
+
</td>
|
51
|
+
<td width="15%;"><label><%= t("amount") %>:</label></td>
|
52
|
+
<td width="20%;">
|
53
|
+
<%= number_to_currency details.params["gross_amount"] %>
|
54
|
+
</td>
|
55
|
+
</tr>
|
56
|
+
<tr>
|
57
|
+
<td><label><%= t("comment") %>:</label></td>
|
58
|
+
<td colspan="3">
|
59
|
+
<%= details.params["message"] %>
|
60
|
+
</td>
|
61
|
+
<td><label><%= t("status") %>:</label></td>
|
62
|
+
<td>
|
63
|
+
<%= details.params["payment_status"] %>
|
64
|
+
</td>
|
65
|
+
</tr>
|
66
|
+
<% if details.params["payment_status"] == "Pending" %>
|
67
|
+
<tr>
|
68
|
+
<td><label><%= t("pending_reason") %>:</label></td>
|
69
|
+
<td colspan="5">
|
70
|
+
<%= details.params["pending_reason"] %>
|
71
|
+
</td>
|
72
|
+
</tr>
|
73
|
+
<% end %>
|
74
|
+
<% elsif details.is_a? ActiveMerchant::Billing::Integrations::Paypal::Notification %>
|
75
|
+
<tr>
|
76
|
+
<th colspan="6"><%= t('ipn_transaction') %> <%= details.params["txn_id"] %> - <%= log.created_at.to_s(:date_time24) %></th>
|
77
|
+
</tr>
|
78
|
+
<tr>
|
79
|
+
<td width="12%;"><label><%= t('type') %>:</label></td>
|
80
|
+
<td width="20%;">
|
81
|
+
<%= details.params["txn_type"] %>
|
82
|
+
</td>
|
83
|
+
<td width="8%;"><label><%= t("result") %>:</label></td>
|
84
|
+
<td width="20%;">
|
85
|
+
<%= details.params["payment_status"] %>
|
86
|
+
</td>
|
87
|
+
<td width="15%;"><label><%= t("amount") %>:</label></td>
|
88
|
+
<td width="20%;">
|
89
|
+
<%= number_to_currency details.params["mc_gross"] %>
|
90
|
+
</td>
|
91
|
+
</tr>
|
92
|
+
<tr>
|
93
|
+
<td><label><%= t("status") %>:</label></td>
|
94
|
+
<td colspan="5">
|
95
|
+
<%= details.params["payment_status"] %>
|
96
|
+
</td>
|
97
|
+
</tr>
|
98
|
+
<% else %>
|
99
|
+
<tr>
|
100
|
+
<th colspan="6"><%= t('unknown_transaction') %> - <%= log.created_at.to_s(:date_time24) %></th>
|
101
|
+
</tr>
|
102
|
+
<tr>
|
103
|
+
<td colspan="6"><pre style="overflow: hidden; width:600px;"><%= log.details %></pre></th>
|
104
|
+
</tr>
|
105
|
+
|
106
|
+
<% end %>
|
107
|
+
</table>
|
108
|
+
<% end %>
|
109
|
+
|
110
|
+
</fieldset>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<%= render :partial => 'admin/shared/order_tabs', :locals => {:current => "Payments"} %>
|
2
|
+
|
3
|
+
<% form_tag do %>
|
4
|
+
|
5
|
+
<h3><%= t('refund') %></h3>
|
6
|
+
<fieldset>
|
7
|
+
<p>
|
8
|
+
<label for="amount"><%= t("amount") %></label>
|
9
|
+
<%= text_field_tag :amount, @paypal_payment.amount %>
|
10
|
+
</p>
|
11
|
+
<p class="form-buttons">
|
12
|
+
<%= button t("make_refund") %>
|
13
|
+
</p>
|
14
|
+
</fieldset>
|
15
|
+
<% end %>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<fieldset id="order_details">
|
2
|
+
<div class="clear"></div>
|
3
|
+
<legend><%= t(@order.state, :scope => :order_state).titleize %></legend>
|
4
|
+
<%= render :partial => 'shared/order_details', :locals => {:order => @order} %>
|
5
|
+
</fieldset>
|
6
|
+
|
7
|
+
<hr />
|
8
|
+
|
9
|
+
<div class="form-buttons">
|
10
|
+
<input type="submit" class="continue button primary" value="<%=t("place_order") %>"/>
|
11
|
+
</div>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<fieldset id='shipping_method'>
|
2
|
+
<legend><%= t("shipping_method") %></legend>
|
3
|
+
<div class="inner">
|
4
|
+
<div id="methods">
|
5
|
+
<p class="field radios">
|
6
|
+
<% @order.rate_hash.each do |shipping_method| %>
|
7
|
+
<label>
|
8
|
+
<%= radio_button(:order, :shipping_method_id, shipping_method[:id]) %>
|
9
|
+
<%= shipping_method[:name] %> <%= number_to_currency shipping_method[:cost] %>
|
10
|
+
</label><br />
|
11
|
+
<% end %>
|
12
|
+
</p>
|
13
|
+
</div>
|
14
|
+
<% if Spree::Config[:shipping_instructions] && @order.rate_hash.present? %>
|
15
|
+
<p id="minstrs">
|
16
|
+
<%= form.label :special_instructions, t("shipping_instructions") %><br />
|
17
|
+
<%= form.text_area :special_instructions, :cols => 40, :rows => 7 %>
|
18
|
+
</p>
|
19
|
+
<% end %>
|
20
|
+
</div>
|
21
|
+
</fieldset>
|
22
|
+
|
23
|
+
<div class="form-buttons">
|
24
|
+
<input type="submit" class="continue button primary" value="<%=t("save_and_continue") %>"/>
|
25
|
+
</div>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<fieldset id="payment">
|
2
|
+
<legend><%= t("payment_information") %></legend>
|
3
|
+
<div data-hook="checkout_payment_step">
|
4
|
+
<% @order.available_payment_methods.each do |method| %>
|
5
|
+
<p>
|
6
|
+
<label>
|
7
|
+
<%= radio_button_tag "order[payments_attributes][][payment_method_id]", method.id, method == @order.payment_method %>
|
8
|
+
<%= t(method.name, :scope => :payment_methods, :default => method.name) %>
|
9
|
+
</label>
|
10
|
+
</p>
|
11
|
+
<% end %>
|
12
|
+
|
13
|
+
<ul id="payment-methods">
|
14
|
+
<% @order.available_payment_methods.each do |method| %>
|
15
|
+
<li id="payment_method_<%= method.id %>" class="<%= 'last' if method == @order.available_payment_methods.last %>">
|
16
|
+
<fieldset>
|
17
|
+
<%= render "checkout/payment/#{method.method_type}", :payment_method => method %>
|
18
|
+
</fieldset>
|
19
|
+
</li>
|
20
|
+
<% end %>
|
21
|
+
</ul>
|
22
|
+
<br style='clear:both;' />
|
23
|
+
<div data-hook="coupon_code_field"></div>
|
24
|
+
</div>
|
25
|
+
</fieldset>
|
26
|
+
|
27
|
+
<hr class="space" />
|
28
|
+
<div class="form-buttons">
|
29
|
+
<input type="submit" class="continue button primary" value="<%=t("save_and_continue") %>" />
|
30
|
+
</div>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<% content_for :head do %>
|
2
|
+
<%= javascript_include_tag 'checkout', '/states' %>
|
3
|
+
<% end %>
|
4
|
+
<div id="checkout">
|
5
|
+
<h1><%= t("checkout")%></h1>
|
6
|
+
<%= checkout_progress %>
|
7
|
+
<br clear="left" />
|
8
|
+
<%= render "shared/error_messages", :target => @order %>
|
9
|
+
<% if @order.state != 'confirm' %>
|
10
|
+
<div id="checkout-summary" data-hook="checkout_summary_box">
|
11
|
+
<%= render 'summary', :order => @order %>
|
12
|
+
</div>
|
13
|
+
<% end %>
|
14
|
+
<%= form_for @order, :url => update_checkout_path(@order.state), :html => { :id => "checkout_form_#{@order.state}" } do |form| %>
|
15
|
+
<%= render @order.state, :form => form %>
|
16
|
+
<input id="post-final" type="submit" style="display:none"/>
|
17
|
+
<% end %>
|
18
|
+
</div>
|
File without changes
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<%= image_tag "creditcards/creditcard.gif", :id => 'creditcard-image' %>
|
2
|
+
<% param_prefix = "payment_source[#{payment_method.id}]" %>
|
3
|
+
|
4
|
+
<p class="field">
|
5
|
+
<label for=""><%= t("card_number") %></label><br />
|
6
|
+
<% options_hash = Rails.env.production? ? {:autocomplete => "off"} : {} %>
|
7
|
+
<%= text_field_tag "#{param_prefix}[number]", '', options_hash.merge(:id => 'card_number', :class => 'required', :size => 19, :maxlength => 19) %>
|
8
|
+
<span class="req">*</span>
|
9
|
+
|
10
|
+
<span id="card_type" style="display:none;">
|
11
|
+
( <span id="looks_like" ><%= t('card_type_is') %> <span id="type"></span></span>
|
12
|
+
<span id="unrecognized"><%= t('unrecognized_card_type') %></span>
|
13
|
+
)
|
14
|
+
</span>
|
15
|
+
</p>
|
16
|
+
<p class="field">
|
17
|
+
<label for=""><%= t("expiration") %></label><br />
|
18
|
+
<%= select_month(Date.today, :prefix => param_prefix, :field_name => 'month', :use_month_numbers => true, :class => 'required') %>
|
19
|
+
<%= select_year(Date.today, :prefix => param_prefix, :field_name => 'year', :start_year => Date.today.year, :end_year => Date.today.year + 15, :class => 'required') %>
|
20
|
+
<span class="req">*</span>
|
21
|
+
</p>
|
22
|
+
<p class="field">
|
23
|
+
<label for=""><%= t("card_code") %></label><br />
|
24
|
+
<%= text_field_tag "#{param_prefix}[verification_value]", '', options_hash.merge(:id => 'card_code', :class => 'required', :size => 5) %>
|
25
|
+
<span class="req">*</span>
|
26
|
+
<a href="/content/cvv" target="_blank" onclick="window.open(this.href,'cvv_info','left=20,top=20,width=500,height=500,toolbar=0,resizable=0,scrollbars=1');return false">
|
27
|
+
(<%= t("whats_this") %>)
|
28
|
+
</a>
|
29
|
+
</p>
|
30
|
+
<%= hidden_field param_prefix, 'first_name', :value => @order.billing_firstname %>
|
31
|
+
<%= hidden_field param_prefix, 'last_name', :value => @order.billing_lastname %>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<%= render "shared/error_messages", :target => @user %>
|
2
|
+
<h2><%= t("registration")%></h2>
|
3
|
+
<div id="registration">
|
4
|
+
<div id="account">
|
5
|
+
<!-- TODO: add partial with registration form -->
|
6
|
+
</div>
|
7
|
+
<% if Spree::Config[:allow_guest_checkout] %>
|
8
|
+
<div id="guest_checkout">
|
9
|
+
<%= render "shared/error_messages", :target => @order %>
|
10
|
+
<h2><%= t(:guest_user_account) %></h2>
|
11
|
+
<%= form_for @order, :url => update_checkout_registration_path, :html => { :method => :put, :id => "checkout_form_registration"} do |f| %>
|
12
|
+
<p>
|
13
|
+
<%= f.label :email, t("email") %><br />
|
14
|
+
<%= f.text_field :email, :class => 'title' %>
|
15
|
+
</p>
|
16
|
+
<p><%= submit_tag t("continue"), :class => 'button primary' %></p>
|
17
|
+
<% end %>
|
18
|
+
</div>
|
19
|
+
<% end %>
|
20
|
+
</div>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<h1><%= t("confirm") %></h1>
|
2
|
+
<p>
|
3
|
+
<%= raw t("order_not_yet_placed") %>
|
4
|
+
</p>
|
5
|
+
|
6
|
+
<%= render :partial => 'shared/order_details', :locals => {:order => @order} -%>
|
7
|
+
<div class="form-buttons">
|
8
|
+
<%= button_to t('place_order'), paypal_finish_order_checkout_url(@order, {:token => params[:token] , :PayerID => params[:PayerID], :payment_method_id =>
|
9
|
+
params[:payment_method_id] } ), :class => "button primary" %>
|
10
|
+
</div>
|
@@ -0,0 +1,32 @@
|
|
1
|
+
---
|
2
|
+
en:
|
3
|
+
ipn_transaction: IPN Transaction
|
4
|
+
unknown_transaction: Unknown Transaction
|
5
|
+
edit_paypal_info: Edit Paypal Express Payment
|
6
|
+
paypal_payment: Paypal Express Payment
|
7
|
+
paypal_txn_id: Transaction Code
|
8
|
+
paypal_capture_complete: Paypal Transaction has been captured.
|
9
|
+
unable_to_capture_paypal: Unable to capture Paypal Transaction.
|
10
|
+
signature: Signature
|
11
|
+
order_not_yet_placed: "Your order has <strong>NOT</strong> been be placed, please review the details and click <strong>Place Order</strong> below to finalize your order."
|
12
|
+
paypal_payment_id: PayPal Payment ID
|
13
|
+
pending_reason: Pending Reason
|
14
|
+
result: Result
|
15
|
+
review: Review
|
16
|
+
no_shipping: No Shipping
|
17
|
+
paypal_account: PayPal Account
|
18
|
+
payer_id: Payer ID
|
19
|
+
payer_country: Country
|
20
|
+
payer_status: Status
|
21
|
+
comment: Comment
|
22
|
+
account_details: Account Details
|
23
|
+
finalize:
|
24
|
+
paypaladaptive_payment: Capture Payment
|
25
|
+
activerecord:
|
26
|
+
attributes:
|
27
|
+
paypal_payment:
|
28
|
+
amount: Amount
|
29
|
+
models:
|
30
|
+
paypal_payment:
|
31
|
+
one: PayPal Payment
|
32
|
+
other: PayPal Payments
|
data/config/routes.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
Rails.application.routes.draw do
|
2
|
+
resources :orders do
|
3
|
+
resource :checkout, :controller => 'checkout' do
|
4
|
+
member do
|
5
|
+
get :paypal_adaptive_payment_checkout
|
6
|
+
get :paypal_adaptive_payment
|
7
|
+
get :paypal_adaptive_payment_confirm
|
8
|
+
post :paypal_adaptive_payment_finish
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
match '/checkout/paypal_adaptive_payment_finish' => 'checkout#paypal_adaptive_payment_finish', :via => [:get, :post]
|
14
|
+
match '/paypal_adaptive_payment_notify' => 'paypal_adaptive_payment_callbacks#notify', :via => [:get, :post]
|
15
|
+
|
16
|
+
namespace :admin do
|
17
|
+
resources :orders do
|
18
|
+
resources :paypal_adaptive_payments do
|
19
|
+
member do
|
20
|
+
get :refund
|
21
|
+
get :capture
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|