shoppe 0.0.18 → 0.0.19
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/stylesheets/shoppe/application.scss +1 -0
- data/app/assets/stylesheets/shoppe/sub.scss +2 -1
- data/app/controllers/shoppe/countries_controller.rb +47 -0
- data/app/controllers/shoppe/orders_controller.rb +4 -0
- data/app/models/shoppe/order.rb +1 -1
- data/app/models/shoppe/order/actions.rb +18 -14
- data/app/models/shoppe/order/delivery.rb +24 -6
- data/app/models/shoppe/order_item.rb +1 -1
- data/app/models/shoppe/product.rb +0 -8
- data/app/models/shoppe/tax_rate.rb +3 -0
- data/app/views/layouts/shoppe/application.html.haml +1 -0
- data/app/views/shoppe/countries/_form.html.haml +31 -0
- data/app/views/shoppe/countries/edit.html.haml +5 -0
- data/app/views/shoppe/countries/index.html.haml +25 -0
- data/app/views/shoppe/countries/new.html.haml +5 -0
- data/app/views/shoppe/orders/_order_details.html.haml +51 -0
- data/app/views/shoppe/orders/_order_items.html.haml +38 -0
- data/app/views/shoppe/orders/_payments_form.html.haml +15 -0
- data/app/views/shoppe/orders/_payments_table.html.haml +37 -0
- data/app/views/shoppe/orders/_search_form.html.haml +24 -0
- data/app/views/shoppe/orders/_status_bar.html.haml +25 -0
- data/app/views/shoppe/orders/index.html.haml +2 -27
- data/app/views/shoppe/orders/show.html.haml +5 -168
- data/app/views/shoppe/shared/error.html.haml +3 -1
- data/config/routes.rb +1 -0
- data/db/seeds.rb +10 -26
- data/lib/shoppe.rb +0 -5
- data/lib/shoppe/error.rb +21 -0
- data/lib/shoppe/errors/inappropriate_delivery_service.rb +0 -5
- data/lib/shoppe/errors/insufficient_stock_to_fulfil.rb +0 -4
- data/lib/shoppe/errors/not_enough_stock.rb +0 -4
- data/lib/shoppe/errors/payment_declined.rb +1 -10
- data/lib/shoppe/errors/refund_failed.rb +0 -9
- data/lib/shoppe/errors/unorderable_item.rb +0 -5
- data/lib/shoppe/version.rb +1 -1
- data/test/app/log/development.log +2934 -0
- data/test/app/tmp/cache/assets/development/sass/ae14d07da246951103a34baf6ced4dbc454e5f8d/dialog.scssc +0 -0
- data/test/app/tmp/cache/assets/development/sass/edac894564dae62b78e653a08d1c41f10ade93f9/application.scssc +0 -0
- data/test/app/tmp/cache/assets/development/sass/edac894564dae62b78e653a08d1c41f10ade93f9/dialog.scssc +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/08eabc96013073092a91d64aaf3da292 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/0a6bca3e510625f255083bd154cc470b +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/267ddf6307abe4d3de2ad900609a6c33 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/2c9164359b1d599a71cebf132035ed6d +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/322295abdd8625fcce4da08f9565cc63 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/445cd520fe49b793bd58dfe8ed70d16e +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/4df1915796b86f6133a3c75bb30be02a +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/5f32b259cbcc52156d2fe21c185d9390 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/71293acda556db2f1dd4f22e3f607f57 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/7938636d16e11b754d4dd046b89863c4 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/7de0e84287a67005fed3fea41ee2c0e9 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/8b6802665cb32689236636d16a1f04e3 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/a7e398541852f6f05ecc5888932a0138 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/accc4dc17ef18d0b510917a005340da5 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/af89877010f84851c64ea77c06baf4ba +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/b519a4f6c5b5a0d9236bdca14e0eb00d +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/b9ad7ea18b7e55c3626a15d1dae142ed +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/c76e2374fc93583d158883980db69094 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/cf45ce1c68370bf536616d1dd87fb89d +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/d7feb1bb9d1746a4c653985285f727cd +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/e60289d4f6dc2754610af229263c914b +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/edf3c55a27678996371bffe56298925b +0 -0
- metadata +44 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a4a6a283ee7752cb07086b2e0d773f9d9b41a579
|
4
|
+
data.tar.gz: 2fafdc5e4fc48385e9f67f6392dca0c7694a61df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d519ec68770b5fc88f9d75d13f112877ed91f72899f87dc4ac03131b2265410d7f0bba5ae4d90f800ecc5c86c695a9de9caabce98bdacd186bceecfec68fe3fe
|
7
|
+
data.tar.gz: acf90329031a180edc5cc62c331535115357c41bac154476bdce5898409785c1b498fa25f94e724d2733983a3bfac60fe12be19d4d2463fc1887160c533d8655
|
@@ -81,6 +81,7 @@ header.main {
|
|
81
81
|
h2.delivery_services { background-image:image-url('shoppe/icons/box.svg'); background-position: 0 3px; background-size:20px;}
|
82
82
|
h2.tax_rates { background-image:image-url('shoppe/icons/currency.svg'); background-position: 0 2px; background-size:22px;}
|
83
83
|
h2.users { background-image:image-url('shoppe/icons/id.svg'); background-position: 0 2px; background-size:22px;}
|
84
|
+
h2.countries { background-image:image-url('shoppe/icons/globe.svg'); background-position: 0 2px; background-size:22px;}
|
84
85
|
h2.settings { background-image:image-url('shoppe/icons/toolbox.svg'); background-position: 0 2px; background-size:22px;}
|
85
86
|
|
86
87
|
}
|
@@ -46,9 +46,10 @@ html.login {
|
|
46
46
|
padding:25px;
|
47
47
|
line-height:1.5;
|
48
48
|
font-size:0.9em;
|
49
|
-
font-weight:500;
|
50
49
|
text-align:center;
|
50
|
+
h2 { color:#C17391; text-transform:uppercase; font-size:0.8em; margin-bottom:15px;}
|
51
51
|
p.back { margin-top:25px;}
|
52
|
+
p.message { font-size:1.1em;}
|
52
53
|
}
|
53
54
|
|
54
55
|
//
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Shoppe
|
2
|
+
class CountriesController < Shoppe::ApplicationController
|
3
|
+
|
4
|
+
before_filter { @active_nav = :countries }
|
5
|
+
before_filter { params[:id] && @country = Shoppe::Country.find(params[:id]) }
|
6
|
+
|
7
|
+
def index
|
8
|
+
@countries = Shoppe::Country.ordered
|
9
|
+
end
|
10
|
+
|
11
|
+
def new
|
12
|
+
@country = Shoppe::Country.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def create
|
16
|
+
@country = Shoppe::Country.new(safe_params)
|
17
|
+
if @country.save
|
18
|
+
redirect_to :countries, :flash => {:notice => "Country has been created successfully"}
|
19
|
+
else
|
20
|
+
render :action => "new"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def edit
|
25
|
+
end
|
26
|
+
|
27
|
+
def update
|
28
|
+
if @country.update(safe_params)
|
29
|
+
redirect_to [:edit, @country], :flash => {:notice => "Country has been updated successfully"}
|
30
|
+
else
|
31
|
+
render :action => "edit"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def destroy
|
36
|
+
@country.destroy
|
37
|
+
redirect_to :countries, :flash => {:notice => "Country has been removed successfully"}
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def safe_params
|
43
|
+
params[:country].permit(:name, :code2, :code3, :continent, :tld, :currency, :eu_member)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
@@ -29,11 +29,15 @@ module Shoppe
|
|
29
29
|
def accept
|
30
30
|
@order.accept!(current_user)
|
31
31
|
redirect_to @order, :notice => "Order has been accepted successfully"
|
32
|
+
rescue Shoppe::Errors::PaymentDeclined => e
|
33
|
+
redirect_to @order, :alert => e.message
|
32
34
|
end
|
33
35
|
|
34
36
|
def reject
|
35
37
|
@order.reject!(current_user)
|
36
38
|
redirect_to @order, :notice => "Order has been rejected successfully"
|
39
|
+
rescue Shoppe::Errors::PaymentDeclined => e
|
40
|
+
redirect_to @order, :alert => e.message
|
37
41
|
end
|
38
42
|
|
39
43
|
def ship
|
data/app/models/shoppe/order.rb
CHANGED
@@ -52,13 +52,15 @@ module Shoppe
|
|
52
52
|
#
|
53
53
|
# @param user [Shoppe::User] the user who carried out this action
|
54
54
|
def accept!(user)
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
55
|
+
transaction do
|
56
|
+
run_callbacks :acceptance do
|
57
|
+
self.accepted_at = Time.now
|
58
|
+
self.accepted_by = user.id
|
59
|
+
self.status = 'accepted'
|
60
|
+
self.save!
|
61
|
+
self.order_items.each(&:accept!)
|
62
|
+
Shoppe::OrderMailer.accepted(self).deliver
|
63
|
+
end
|
62
64
|
end
|
63
65
|
end
|
64
66
|
|
@@ -66,13 +68,15 @@ module Shoppe
|
|
66
68
|
#
|
67
69
|
# @param user [Shoppe::User] the user who carried out the action
|
68
70
|
def reject!(user)
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
71
|
+
transaction do
|
72
|
+
run_callbacks :rejection do
|
73
|
+
self.rejected_at = Time.now
|
74
|
+
self.rejected_by = user.id
|
75
|
+
self.status = 'rejected'
|
76
|
+
self.save!
|
77
|
+
self.order_items.each(&:reject!)
|
78
|
+
Shoppe::OrderMailer.rejected(self).deliver
|
79
|
+
end
|
76
80
|
end
|
77
81
|
end
|
78
82
|
|
@@ -29,15 +29,22 @@ module Shoppe
|
|
29
29
|
order.validates :delivery_country, :presence => true
|
30
30
|
end
|
31
31
|
validate do
|
32
|
-
|
33
|
-
|
32
|
+
if self.delivery_required?
|
33
|
+
if self.delivery_service.nil?
|
34
|
+
errors.add :delivery_service_id, "must be specified"
|
35
|
+
return
|
36
|
+
end
|
37
|
+
|
38
|
+
if self.delivery_service && !available_delivery_services.include?(self.delivery_service)
|
39
|
+
errors.add :delivery_service_id, "is not suitable for this order"
|
40
|
+
end
|
34
41
|
end
|
35
42
|
end
|
36
43
|
|
37
44
|
before_confirmation do
|
38
45
|
# Ensure that before we confirm the order that the delivery service which has been selected
|
39
46
|
# is appropritae for the contents of the order.
|
40
|
-
|
47
|
+
if self.delivery_required? && !self.valid_delivery_service?
|
41
48
|
raise Shoppe::Errors::InappropriateDeliveryService, :order => self
|
42
49
|
end
|
43
50
|
|
@@ -86,6 +93,13 @@ module Shoppe
|
|
86
93
|
order_items.inject(BigDecimal(0)) { |t,i| t + i.weight}
|
87
94
|
end
|
88
95
|
|
96
|
+
# Is delivery required for this order?
|
97
|
+
#
|
98
|
+
# @return [Boolean]
|
99
|
+
def delivery_required?
|
100
|
+
total_weight > BigDecimal(0)
|
101
|
+
end
|
102
|
+
|
89
103
|
# An array of all the delivery services which are suitable for this order in it's
|
90
104
|
# current state (based on its current weight)
|
91
105
|
#
|
@@ -101,9 +115,13 @@ module Shoppe
|
|
101
115
|
# @return [Array] an array of Shoppe:DeliveryServicePrice objects
|
102
116
|
def delivery_service_prices
|
103
117
|
@delivery_service_prices ||= begin
|
104
|
-
|
105
|
-
|
106
|
-
|
118
|
+
if delivery_required?
|
119
|
+
prices = Shoppe::DeliveryServicePrice.joins(:delivery_service).where(:shoppe_delivery_services => {:active => true}).order("`default` desc, price asc").for_weight(total_weight)
|
120
|
+
prices = prices.select { |p| p.countries.empty? || p.country?(self.delivery_country) }
|
121
|
+
prices
|
122
|
+
else
|
123
|
+
[]
|
124
|
+
end
|
107
125
|
end
|
108
126
|
end
|
109
127
|
|
@@ -6,7 +6,7 @@ module Shoppe
|
|
6
6
|
# The associated order
|
7
7
|
#
|
8
8
|
# @return [Shoppe::Order]
|
9
|
-
belongs_to :order, :class_name => 'Shoppe::Order'
|
9
|
+
belongs_to :order, :class_name => 'Shoppe::Order', :touch => true
|
10
10
|
|
11
11
|
# The item which has been ordered
|
12
12
|
belongs_to :ordered_item, :polymorphic => true
|
@@ -91,14 +91,6 @@ module Shoppe
|
|
91
91
|
@stock ||= self.stock_level_adjustments.sum(:adjustment)
|
92
92
|
end
|
93
93
|
|
94
|
-
def self.ransackable_attributes(auth_object = nil)
|
95
|
-
["id", "name", "sku"] + _ransackers.keys
|
96
|
-
end
|
97
|
-
|
98
|
-
def self.ransackable_associations(auth_object = nil)
|
99
|
-
[]
|
100
|
-
end
|
101
|
-
|
102
94
|
# Search for products which include the guven attributes and return an active record
|
103
95
|
# scope of these products. Chainable with other scopes and with_attributes methods.
|
104
96
|
# For example:
|
@@ -22,6 +22,9 @@ module Shoppe
|
|
22
22
|
# All tax rates ordered by their ID
|
23
23
|
scope :ordered, -> { order("shoppe_tax_rates.id")}
|
24
24
|
|
25
|
+
# Set the address type if appropriate
|
26
|
+
before_validation { self.address_type = ADDRESS_TYPES.first if self.address_type.blank? }
|
27
|
+
|
25
28
|
# A description of the tax rate including its name & percentage
|
26
29
|
#
|
27
30
|
# @return [String]
|
@@ -21,6 +21,7 @@
|
|
21
21
|
%li= link_to "Delivery Services", [:delivery_services], :class => @active_nav == :delivery_services ? 'active' : ''
|
22
22
|
%li= link_to "Tax Rates", :tax_rates, :class => @active_nav == :tax_rates ? 'active' : ''
|
23
23
|
%li= link_to "Users", [:users], :class => @active_nav == :users ? 'active' : ''
|
24
|
+
%li= link_to "Countries", :countries, :class => @active_nav == :countries ? 'active' : ''
|
24
25
|
%li= link_to "Settings", :settings, :class => @active_nav == :settings ? 'active' : ''
|
25
26
|
%li= link_to "Logout", [:logout], :method => :delete
|
26
27
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
= form_for @country do |f|
|
2
|
+
= f.error_messages
|
3
|
+
= field_set_tag "User Details" do
|
4
|
+
.splitContainer
|
5
|
+
%dl.third
|
6
|
+
%dt= f.label :name
|
7
|
+
%dd= f.text_field :name, :class => 'focus text'
|
8
|
+
%dl.third
|
9
|
+
%dt= f.label :code2, "ISO 3166-alpha-2"
|
10
|
+
%dd= f.text_field :code2, :class => 'text'
|
11
|
+
%dl.third
|
12
|
+
%dt= f.label :code3, "ISO 3166-alpha-3"
|
13
|
+
%dd= f.text_field :code3, :class => 'text'
|
14
|
+
.splitContainer
|
15
|
+
%dl.third
|
16
|
+
%dt= f.label :continent
|
17
|
+
%dd= f.text_field :continent, :class => 'text'
|
18
|
+
%dl.third
|
19
|
+
%dt= f.label :tld, "TLD"
|
20
|
+
%dd= f.text_field :tld, :class => 'text'
|
21
|
+
%dl.third
|
22
|
+
%dt= f.label :eu_member, "EU Member?"
|
23
|
+
%dd.checkbox
|
24
|
+
= f.check_box :eu_member
|
25
|
+
= f.label :eu_member, 'Country is an EU member?'
|
26
|
+
|
27
|
+
%p.submit
|
28
|
+
- unless @country.new_record?
|
29
|
+
%span.right= link_to "Delete", @country, :class => 'button purple', :method => :delete, :data => {:confirm => "Are you sure you wish to remove this country?"}
|
30
|
+
= f.submit :class => 'button green'
|
31
|
+
= link_to "Cancel", :countries, :class => 'button'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
- @page_title = "Countries"
|
2
|
+
|
3
|
+
= content_for :header do
|
4
|
+
%p.buttons=link_to "New country", :new_country, :class => 'button green'
|
5
|
+
%h2.countries Countries
|
6
|
+
|
7
|
+
.table
|
8
|
+
%table.data
|
9
|
+
%thead
|
10
|
+
%tr
|
11
|
+
%th Name
|
12
|
+
%th ISO 3166-1-alpha-2
|
13
|
+
%th ISO 3166-1-alpha-3
|
14
|
+
%th Continent
|
15
|
+
%th TLD
|
16
|
+
%th EU?
|
17
|
+
%tbody
|
18
|
+
- for country in @countries
|
19
|
+
%tr
|
20
|
+
%td= link_to country.name, [:edit, country]
|
21
|
+
%td= country.code2
|
22
|
+
%td= country.code3
|
23
|
+
%td= country.continent
|
24
|
+
%td= country.tld
|
25
|
+
%td= boolean_tag country.eu_member?
|
@@ -0,0 +1,51 @@
|
|
1
|
+
.details
|
2
|
+
.left
|
3
|
+
%dl
|
4
|
+
%dt Name
|
5
|
+
%dd= @order.first_name + ' ' + @order.last_name
|
6
|
+
%dt Company
|
7
|
+
%dd= @order.company.blank? ? '-' : @order.company
|
8
|
+
%dt Billing#{@order.separate_delivery_address? ? '' : '/Delivery'} Address
|
9
|
+
%dd= @order.billing_address1
|
10
|
+
%dd= @order.billing_address2
|
11
|
+
%dd= @order.billing_address3
|
12
|
+
%dd= @order.billing_address4
|
13
|
+
%dd= @order.billing_postcode
|
14
|
+
%dd= @order.billing_country.try(:name)
|
15
|
+
- if @order.separate_delivery_address?
|
16
|
+
%dt Delivery Address
|
17
|
+
%dd= @order.delivery_name
|
18
|
+
%dd= @order.delivery_address1
|
19
|
+
%dd= @order.delivery_address2
|
20
|
+
%dd= @order.delivery_address3
|
21
|
+
%dd= @order.delivery_address4
|
22
|
+
%dd= @order.delivery_postcode
|
23
|
+
%dd= @order.delivery_country.try(:name)
|
24
|
+
.right
|
25
|
+
%dl
|
26
|
+
%dt E-Mail Address
|
27
|
+
%dd= mail_to @order.email_address
|
28
|
+
%dt Telephone
|
29
|
+
%dd= @order.phone_number
|
30
|
+
%dt Weight
|
31
|
+
%dd= number_to_weight @order.total_weight
|
32
|
+
%dt Build Time
|
33
|
+
%dd= distance_of_time_in_words(@order.created_at, @order.received_at)
|
34
|
+
- if @order.invoiced?
|
35
|
+
%dt Invoice Number
|
36
|
+
%dd= @order.invoice_number
|
37
|
+
%dt Order Balance
|
38
|
+
%dd= boolean_tag @order.paid_in_full?, nil, :true_text => number_to_currency(@order.balance), :false_text => number_to_currency(@order.balance)
|
39
|
+
- if @order.accepted? && !@order.shipped?
|
40
|
+
= form_tag [:ship, @order] do
|
41
|
+
%dl.form
|
42
|
+
%dt.padding= label_tag 'consignment_number', 'Consignment Number'
|
43
|
+
%dd= text_field_tag 'consignment_number', '', :class => 'text'
|
44
|
+
%dl.form
|
45
|
+
%dd= submit_tag "Mark as shipped", :class => 'button green button-mini'
|
46
|
+
|
47
|
+
- unless @order.accepted? || @order.rejected?
|
48
|
+
%dl.form
|
49
|
+
%dd
|
50
|
+
= link_to "Accept", [:accept, @order], :method => :post, :class => 'button green'
|
51
|
+
= link_to "Reject", [:reject, @order], :method => :post, :class => 'button purple'
|
@@ -0,0 +1,38 @@
|
|
1
|
+
.order_items
|
2
|
+
.table
|
3
|
+
%table.data
|
4
|
+
%thead
|
5
|
+
%tr
|
6
|
+
%th.qty Qty
|
7
|
+
%th Item
|
8
|
+
%th SKU
|
9
|
+
%th.money Cost
|
10
|
+
%th.money Price
|
11
|
+
%th.money= Shoppe.settings.tax_name
|
12
|
+
%th.money Sub-Total
|
13
|
+
%tbody
|
14
|
+
- for item in @order.order_items
|
15
|
+
%tr
|
16
|
+
%td.qty= item.quantity
|
17
|
+
%td.product= item.ordered_item.full_name
|
18
|
+
%td.sku= item.ordered_item.sku
|
19
|
+
%td.money= number_to_currency item.total_cost
|
20
|
+
%td.money= number_to_currency item.sub_total
|
21
|
+
%td.money= number_to_currency item.tax_amount
|
22
|
+
%td.money= number_to_currency item.total
|
23
|
+
- if @order.delivery_service
|
24
|
+
%td.qty
|
25
|
+
%td.product= link_to @order.delivery_service.name, [:edit, @order.delivery_service]
|
26
|
+
%td.sku
|
27
|
+
%td.money= number_to_currency @order.delivery_cost_price
|
28
|
+
%td.money= number_to_currency @order.delivery_price
|
29
|
+
%td.money= number_to_currency @order.delivery_tax_amount
|
30
|
+
%td.money= number_to_currency @order.delivery_price + @order.delivery_tax_amount
|
31
|
+
%tfoot
|
32
|
+
%tr
|
33
|
+
%td.qty= @order.total_items
|
34
|
+
%td{:colspan => 2}
|
35
|
+
%td.money= number_to_currency @order.total_cost
|
36
|
+
%td.money= number_to_currency @order.total_before_tax
|
37
|
+
%td.money= number_to_currency @order.tax
|
38
|
+
%td.money= number_to_currency @order.total
|
@@ -0,0 +1,15 @@
|
|
1
|
+
= form_for [@order, Shoppe::Payment.new(:amount => @order.balance)] do |f|
|
2
|
+
%dl.text
|
3
|
+
%dt= f.label :method
|
4
|
+
%dd= f.text_field :method, :class => 'text'
|
5
|
+
%dl.text
|
6
|
+
%dt= f.label :reference
|
7
|
+
%dd= f.text_field :reference, :class => 'text'
|
8
|
+
%dl.amount
|
9
|
+
%dt= f.label :amount
|
10
|
+
%dd
|
11
|
+
.moneyInput
|
12
|
+
.currency= Shoppe.settings.currency_unit.html_safe
|
13
|
+
= f.text_field :amount, :class => 'text'
|
14
|
+
%dl.submit
|
15
|
+
%dd= f.submit "Add Payment", :class => 'button green'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
- unless @payments.empty?
|
2
|
+
.table
|
3
|
+
%table.data
|
4
|
+
%thead
|
5
|
+
%tr
|
6
|
+
%th ID
|
7
|
+
%th Type
|
8
|
+
%th Method
|
9
|
+
%th Reference
|
10
|
+
%th Amount
|
11
|
+
%th Refunded?
|
12
|
+
%th
|
13
|
+
%tbody
|
14
|
+
- for payment in @payments
|
15
|
+
%tr
|
16
|
+
%td= payment.id
|
17
|
+
%td
|
18
|
+
= payment.refund? ? 'Refund' : 'Payment'
|
19
|
+
%span.float-right= boolean_tag payment.confirmed?
|
20
|
+
%td= payment.method
|
21
|
+
%td= link_to_if payment.transaction_url, payment.reference, payment.transaction_url
|
22
|
+
|
23
|
+
- if payment.refund?
|
24
|
+
%td{:colspan => 2}
|
25
|
+
%b= number_to_currency payment.amount
|
26
|
+
- if payment.parent_payment_id
|
27
|
+
from payment ##{payment.parent_payment_id}
|
28
|
+
- else
|
29
|
+
%td= number_to_currency payment.amount
|
30
|
+
%td= boolean_tag payment.refunded?, nil, :true_text => number_to_currency(payment.amount_refunded)
|
31
|
+
%td.refund
|
32
|
+
- if payment.refundable?
|
33
|
+
= link_to "Refund", [:refund, @order, payment], :class => 'button purple button-mini', :rel => 'dialog'
|
34
|
+
- else
|
35
|
+
= link_to "Delete", [@order, payment], :class => 'button purple button-mini', :data => {:confirm => "Are you sure you wish to remove this payment?"}, :method => :delete
|
36
|
+
- else
|
37
|
+
%p.notice There are no payments recorded for this order...
|