effective_orders 5.5.2 → 5.6.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/admin/orders_controller.rb +16 -65
- data/app/models/effective/order.rb +71 -68
- data/app/models/effective/order_item.rb +16 -11
- data/app/models/effective/product.rb +1 -1
- data/app/views/admin/orders/_form.html.haml +14 -12
- data/app/views/admin/orders/_order_item_fields.html.haml +13 -4
- data/app/views/admin/orders/edit.html.haml +12 -3
- data/app/views/admin/orders/new.html.haml +1 -2
- data/app/views/admin/orders/show.html.haml +2 -2
- data/app/views/effective/orders/_order_actions.html.haml +8 -2
- data/app/views/effective/orders/mark_as_paid/_form.html.haml +5 -5
- data/lib/effective_orders/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e419a31818cf5abba11e1330c5cf38e7637f144d9eacade387f919de7433973
|
4
|
+
data.tar.gz: 12a61662d772982f6ddff6f00bd990dfdab017a33ce011b55caf7f4507715010
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: abc379d14277eb75eef1c315ad05d49bbd801211c8f4781951249421c6433f9e1fef5b5ff5e0348859ccab4a185bc4439ae0a06f0ba8e1bdc9b6bf9199f912ce
|
7
|
+
data.tar.gz: b189c07ee57a22ba4f3fb314da7078b7cf7d8f9d25ab85f3d37e6be74c8924cdc6ccac516053bf2ee0bbc182f8c80f1b4b82505cdd310a6d6bde02b0fff17dd2
|
@@ -14,38 +14,11 @@ module Admin
|
|
14
14
|
submit :save, 'Duplicate', redirect: -> { effective_orders.new_admin_order_path(duplicate_id: resource.to_param) }
|
15
15
|
submit :save, 'Checkout', redirect: -> { effective_orders.checkout_admin_order_path(resource) }
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
error = nil
|
23
|
-
|
24
|
-
Effective::Order.transaction do
|
25
|
-
begin
|
26
|
-
(permitted_params[:order_items_attributes] || {}).each do |_, item_attrs|
|
27
|
-
purchasable = Effective::Product.new(item_attrs[:purchasable_attributes])
|
28
|
-
@order.add(purchasable, quantity: item_attrs[:quantity])
|
29
|
-
end
|
30
|
-
|
31
|
-
@order.attributes = permitted_params.except(:order_items_attributes, :user_id)
|
32
|
-
@order.pending!
|
33
|
-
|
34
|
-
message = 'Successfully created order'
|
35
|
-
message << ". A request for payment has been sent to #{@order.emails_send_to}" if @order.send_payment_request_to_buyer?
|
36
|
-
flash[:success] = message
|
37
|
-
|
38
|
-
redirect_to(admin_redirect_path) and return
|
39
|
-
rescue => e
|
40
|
-
error = e.message
|
41
|
-
raise ActiveRecord::Rollback
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
@page_title = 'New Order'
|
46
|
-
flash.now[:danger] = flash_danger(@order) + error.to_s
|
47
|
-
render :new
|
48
|
-
end
|
17
|
+
submit :save, 'Save', success: -> {
|
18
|
+
message = flash_success(resource, params[:action])
|
19
|
+
message << ". A request for payment has been sent to #{resource.emails_send_to}" if resource.send_payment_request_to_buyer?
|
20
|
+
message
|
21
|
+
}
|
49
22
|
|
50
23
|
# The show page posts to this action
|
51
24
|
# See Effective::OrdersController checkout
|
@@ -58,21 +31,19 @@ module Admin
|
|
58
31
|
|
59
32
|
if request.get?
|
60
33
|
@order.assign_confirmed_if_valid!
|
61
|
-
render
|
34
|
+
render(:checkout)
|
35
|
+
return
|
62
36
|
end
|
63
37
|
|
64
|
-
|
65
|
-
|
66
|
-
@order.assign_attributes(checkout_params)
|
67
|
-
@order.confirm!
|
68
|
-
redirect_to(effective_orders.checkout_admin_order_path(@order)) and return
|
69
|
-
rescue => e
|
70
|
-
raise ActiveRecord::Rollback
|
71
|
-
end
|
72
|
-
end
|
38
|
+
# Otherwise a post
|
39
|
+
@order.assign_attributes(checkout_params)
|
73
40
|
|
74
|
-
|
75
|
-
|
41
|
+
if (@order.confirm! rescue false)
|
42
|
+
redirect_to(effective_orders.checkout_admin_order_path(@order))
|
43
|
+
else
|
44
|
+
flash.now[:danger] = "Unable to proceed: #{flash_errors(@order)}. Please try again."
|
45
|
+
render :checkout
|
46
|
+
end
|
76
47
|
end
|
77
48
|
|
78
49
|
def destroy
|
@@ -124,15 +95,7 @@ module Admin
|
|
124
95
|
private
|
125
96
|
|
126
97
|
def permitted_params
|
127
|
-
params.require(:effective_order).permit
|
128
|
-
:send_payment_request_to_buyer, :note_internal, :note_to_buyer,
|
129
|
-
:payment_provider, :payment_card, :payment, :send_mark_as_paid_email_to_buyer,
|
130
|
-
order_items_attributes: [
|
131
|
-
:quantity, :_destroy, purchasable_attributes: [
|
132
|
-
:name, :qb_item_name, :price, :tax_exempt
|
133
|
-
]
|
134
|
-
]
|
135
|
-
)
|
98
|
+
params.require(:effective_order).permit!
|
136
99
|
end
|
137
100
|
|
138
101
|
def checkout_params
|
@@ -143,17 +106,5 @@ module Admin
|
|
143
106
|
EffectiveResources.authorize!(self, action_name.to_sym, @order || Effective::Order)
|
144
107
|
end
|
145
108
|
|
146
|
-
def admin_redirect_path
|
147
|
-
case params[:commit].to_s
|
148
|
-
when 'Save' ; effective_orders.admin_order_path(@order)
|
149
|
-
when 'Continue' ; effective_orders.admin_orders_path
|
150
|
-
when 'Add New' ; effective_orders.new_admin_order_path(user_id: @order.user.try(:to_param))
|
151
|
-
when 'Duplicate' ; effective_orders.new_admin_order_path(duplicate_id: @order.to_param)
|
152
|
-
when 'Checkout' ; effective_orders.checkout_admin_order_path(@order.to_param)
|
153
|
-
else
|
154
|
-
effective_orders.admin_order_path(@order)
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
109
|
end
|
159
110
|
end
|
@@ -30,10 +30,10 @@ module Effective
|
|
30
30
|
belongs_to :parent, polymorphic: true, optional: true
|
31
31
|
|
32
32
|
belongs_to :user, polymorphic: true, validate: false # This is the buyer/user of the order. We validate it below.
|
33
|
-
|
33
|
+
accepts_nested_attributes_for :user, allow_destroy: false, update_only: true
|
34
34
|
|
35
|
+
has_many :order_items, -> { order(:id) }, inverse_of: :order, dependent: :delete_all
|
35
36
|
accepts_nested_attributes_for :order_items, allow_destroy: false, reject_if: :all_blank
|
36
|
-
accepts_nested_attributes_for :user, allow_destroy: false, update_only: true
|
37
37
|
|
38
38
|
# Attributes
|
39
39
|
effective_resource do
|
@@ -63,18 +63,30 @@ module Effective
|
|
63
63
|
|
64
64
|
serialize :payment, Hash
|
65
65
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
66
|
+
scope :deep, -> { includes(:addresses, :user, order_items: :purchasable) }
|
67
|
+
scope :sorted, -> { order(:id) }
|
68
|
+
|
69
|
+
scope :purchased, -> { where(state: EffectiveOrders::PURCHASED) }
|
70
|
+
scope :purchased_by, lambda { |user| purchased.where(user: user) }
|
71
|
+
scope :not_purchased, -> { where.not(state: EffectiveOrders::PURCHASED) }
|
72
|
+
|
73
|
+
scope :pending, -> { where(state: EffectiveOrders::PENDING) }
|
74
|
+
scope :confirmed, -> { where(state: EffectiveOrders::CONFIRMED) }
|
75
|
+
scope :deferred, -> { where(state: EffectiveOrders::DEFERRED) }
|
76
|
+
scope :declined, -> { where(state: EffectiveOrders::DECLINED) }
|
77
|
+
scope :abandoned, -> { where(state: EffectiveOrders::ABANDONED) }
|
78
|
+
scope :refunds, -> { purchased.where('total < ?', 0) }
|
71
79
|
|
72
|
-
before_validation
|
73
|
-
|
80
|
+
before_validation do
|
81
|
+
self.state ||= EffectiveOrders::PENDING
|
82
|
+
self.state = EffectiveOrders::CONFIRMED if pending? && confirmed_checkout
|
74
83
|
end
|
75
84
|
|
76
|
-
|
77
|
-
|
85
|
+
with_options(unless: -> { done? }) do
|
86
|
+
before_validation { assign_email }
|
87
|
+
before_validation { assign_user_address }
|
88
|
+
before_validation { assign_billing_name }
|
89
|
+
before_validation { assign_order_totals }
|
78
90
|
end
|
79
91
|
|
80
92
|
# Order validations
|
@@ -84,6 +96,8 @@ module Effective
|
|
84
96
|
|
85
97
|
validates :order_items, presence: { message: 'No items are present. Please add additional items.' }
|
86
98
|
validates :state, inclusion: { in: EffectiveOrders::STATES.keys }
|
99
|
+
|
100
|
+
# Price validations
|
87
101
|
validates :subtotal, presence: true
|
88
102
|
|
89
103
|
with_options(if: -> { EffectiveOrders.minimum_charge.to_i > 0 }) do
|
@@ -91,7 +105,7 @@ module Effective
|
|
91
105
|
|
92
106
|
validate(unless: -> { (free? && EffectiveOrders.free?) || (refund? && EffectiveOrders.refund?) }) do
|
93
107
|
if total.present? && total < EffectiveOrders.minimum_charge
|
94
|
-
|
108
|
+
errors.add(:total, "must be $#{'%0.2f' % (EffectiveOrders.minimum_charge.to_i / 100.0)} or more. Please add additional items.")
|
95
109
|
end
|
96
110
|
end
|
97
111
|
end
|
@@ -118,11 +132,6 @@ module Effective
|
|
118
132
|
validates :payment, presence: true
|
119
133
|
|
120
134
|
validates :payment_provider, presence: true
|
121
|
-
|
122
|
-
validate do
|
123
|
-
self.errors.add(:payment_provider, "unknown payment provider") unless (EffectiveOrders.payment_providers + EffectiveOrders.admin_payment_providers).include?(payment_provider)
|
124
|
-
end
|
125
|
-
|
126
135
|
validates :payment_card, presence: true
|
127
136
|
end
|
128
137
|
|
@@ -130,23 +139,17 @@ module Effective
|
|
130
139
|
validates :payment_provider, presence: true
|
131
140
|
|
132
141
|
validate do
|
133
|
-
|
142
|
+
errors.add(:payment_provider, "unknown deferred payment provider") unless EffectiveOrders.deferred_providers.include?(payment_provider)
|
134
143
|
end
|
135
144
|
end
|
136
145
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
scope :purchased, -> { where(state: EffectiveOrders::PURCHASED) }
|
141
|
-
scope :purchased_by, lambda { |user| purchased.where(user: user) }
|
142
|
-
scope :not_purchased, -> { where.not(state: EffectiveOrders::PURCHASED) }
|
146
|
+
before_save(if: -> { state_was == EffectiveOrders::PURCHASED }) do
|
147
|
+
raise EffectiveOrders::AlreadyPurchasedException.new('cannot unpurchase an order') unless purchased?
|
148
|
+
end
|
143
149
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
scope :declined, -> { where(state: EffectiveOrders::DECLINED) }
|
148
|
-
scope :abandoned, -> { where(state: EffectiveOrders::ABANDONED) }
|
149
|
-
scope :refunds, -> { purchased.where('total < ?', 0) }
|
150
|
+
before_save(if: -> { done? }) do
|
151
|
+
raise('cannot change total of a purchased order') if changes[:total].present?
|
152
|
+
end
|
150
153
|
|
151
154
|
# Effective::Order.new()
|
152
155
|
# Effective::Order.new(Product.first)
|
@@ -165,7 +168,7 @@ module Effective
|
|
165
168
|
if atts.kind_of?(Hash)
|
166
169
|
items = Array(atts[:item]) + Array(atts[:items])
|
167
170
|
|
168
|
-
self.user = atts[:user] ||
|
171
|
+
self.user = atts[:user] || items.first.try(:user)
|
169
172
|
|
170
173
|
if (address = atts[:billing_address]).present?
|
171
174
|
self.billing_address = address
|
@@ -280,7 +283,7 @@ module Effective
|
|
280
283
|
if purchasable.blank? || purchasable.marked_for_destruction?
|
281
284
|
item.mark_for_destruction
|
282
285
|
else
|
283
|
-
item.
|
286
|
+
item.assign_purchasable_attributes
|
284
287
|
end
|
285
288
|
end
|
286
289
|
|
@@ -386,6 +389,20 @@ module Effective
|
|
386
389
|
state == EffectiveOrders::DEFERRED
|
387
390
|
end
|
388
391
|
|
392
|
+
def in_progress?
|
393
|
+
pending? || confirmed? || deferred?
|
394
|
+
end
|
395
|
+
|
396
|
+
def done?
|
397
|
+
persisted? && (purchased? || declined?)
|
398
|
+
end
|
399
|
+
|
400
|
+
# A custom order is one that was created by an admin
|
401
|
+
# We allow custom orders to have their order items updated
|
402
|
+
def custom_order?
|
403
|
+
order_items.all? { |oi| oi.purchasable_type == 'Effective::Product' }
|
404
|
+
end
|
405
|
+
|
389
406
|
def purchased?(provider = nil)
|
390
407
|
return false if (state != EffectiveOrders::PURCHASED)
|
391
408
|
return true if provider.nil? || payment_provider == provider.to_s
|
@@ -548,6 +565,10 @@ module Effective
|
|
548
565
|
true
|
549
566
|
end
|
550
567
|
|
568
|
+
def skip_quickbooks!
|
569
|
+
sync_quickbooks!(skip: true)
|
570
|
+
end
|
571
|
+
|
551
572
|
def defer!(provider: 'none', email: true)
|
552
573
|
return false if purchased?
|
553
574
|
|
@@ -624,10 +645,6 @@ module Effective
|
|
624
645
|
EffectiveOrders.send_email(:refund_notification_to_admin, self) if purchased? && refund?
|
625
646
|
end
|
626
647
|
|
627
|
-
def skip_qb_sync!
|
628
|
-
EffectiveOrders.use_effective_qb_sync ? EffectiveQbSync.skip_order!(self) : true
|
629
|
-
end
|
630
|
-
|
631
648
|
protected
|
632
649
|
|
633
650
|
def get_tax_rate
|
@@ -651,56 +668,42 @@ module Effective
|
|
651
668
|
order_items.reject { |oi| oi.marked_for_destruction? }
|
652
669
|
end
|
653
670
|
|
654
|
-
def assign_order_totals
|
655
|
-
self.subtotal = present_order_items.map { |oi| oi.subtotal }.sum
|
656
|
-
self.tax_rate = get_tax_rate()
|
657
|
-
self.tax = get_tax()
|
658
|
-
self.total = subtotal + (tax || 0)
|
659
|
-
end
|
660
|
-
|
661
671
|
def assign_billing_name
|
662
|
-
self.billing_name =
|
672
|
+
self.billing_name = billing_address.try(:full_name).presence || user.to_s.presence
|
663
673
|
end
|
664
674
|
|
665
675
|
def assign_email
|
666
|
-
self.email = user
|
667
|
-
end
|
668
|
-
|
669
|
-
def assign_last_address
|
670
|
-
return unless user.present?
|
671
|
-
return unless (EffectiveOrders.billing_address || EffectiveOrders.shipping_address)
|
672
|
-
return if EffectiveOrders.billing_address && billing_address.present?
|
673
|
-
return if EffectiveOrders.shipping_address && shipping_address.present?
|
674
|
-
|
675
|
-
last_order = Effective::Order.sorted.where(user: user).last
|
676
|
-
return unless last_order.present?
|
677
|
-
|
678
|
-
if EffectiveOrders.billing_address && last_order.billing_address.present?
|
679
|
-
self.billing_address = last_order.billing_address
|
680
|
-
end
|
681
|
-
|
682
|
-
if EffectiveOrders.shipping_address && last_order.shipping_address.present?
|
683
|
-
self.shipping_address = last_order.shipping_address
|
684
|
-
end
|
676
|
+
self.email = user.email if user.try(:email).present?
|
685
677
|
end
|
686
678
|
|
687
679
|
def assign_user_address
|
688
680
|
return unless user.present?
|
689
|
-
return unless (EffectiveOrders.billing_address || EffectiveOrders.shipping_address)
|
690
|
-
return if EffectiveOrders.billing_address && billing_address.present?
|
691
|
-
return if EffectiveOrders.shipping_address && shipping_address.present?
|
692
681
|
|
693
|
-
if billing_address.blank? && user.
|
682
|
+
if EffectiveOrders.billing_address && billing_address.blank? && user.try(:billing_address).present?
|
694
683
|
self.billing_address = user.billing_address
|
695
684
|
self.billing_address.full_name ||= user.to_s.presence
|
696
685
|
end
|
697
686
|
|
698
|
-
if shipping_address.blank? && user.
|
687
|
+
if EffectiveOrders.shipping_address && shipping_address.blank? && user.try(:shipping_address).present?
|
699
688
|
self.shipping_address = user.shipping_address
|
700
689
|
self.shipping_address.full_name ||= user.to_s.presence
|
701
690
|
end
|
702
691
|
end
|
703
692
|
|
693
|
+
# This overwrites the prices, taxes, etc on every save.
|
694
|
+
def assign_order_totals
|
695
|
+
# Copies prices from purchasable into order items
|
696
|
+
present_order_items.each { |oi| oi.assign_purchasable_attributes }
|
697
|
+
|
698
|
+
# Sum of order item subtotals
|
699
|
+
subtotal = present_order_items.map { |oi| oi.subtotal }.sum
|
700
|
+
|
701
|
+
self.subtotal = subtotal
|
702
|
+
self.tax_rate = get_tax_rate()
|
703
|
+
self.tax = get_tax()
|
704
|
+
self.total = subtotal + (tax || 0)
|
705
|
+
end
|
706
|
+
|
704
707
|
def update_purchasables_purchased_order!
|
705
708
|
order_items.each { |oi| oi.purchasable&.update_column(:purchased_order_id, self.id) }
|
706
709
|
end
|
@@ -3,7 +3,9 @@ module Effective
|
|
3
3
|
self.table_name = EffectiveOrders.order_items_table_name.to_s
|
4
4
|
|
5
5
|
belongs_to :order
|
6
|
+
|
6
7
|
belongs_to :purchasable, polymorphic: true
|
8
|
+
accepts_nested_attributes_for :purchasable, allow_destroy: false
|
7
9
|
|
8
10
|
if defined?(EffectiveQbSync)
|
9
11
|
has_one :qb_order_item
|
@@ -18,21 +20,27 @@ module Effective
|
|
18
20
|
timestamps
|
19
21
|
end
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
+
scope :purchased, -> { where(order_id: Effective::Order.purchased) }
|
24
|
+
scope :purchased_by, lambda { |user| where(order_id: Effective::Order.purchased_by(user)) }
|
23
25
|
|
24
26
|
validates :name, presence: true
|
25
27
|
validates :quantity, presence: true, numericality: { greater_than: 0 }
|
26
28
|
validates :price, presence: true
|
27
29
|
validates :tax_exempt, inclusion: { in: [true, false] }
|
28
30
|
|
29
|
-
scope :purchased, -> { where(order_id: Effective::Order.purchased) }
|
30
|
-
scope :purchased_by, lambda { |user| where(order_id: Effective::Order.purchased_by(user)) }
|
31
|
-
|
32
31
|
def to_s
|
33
32
|
((quantity || 0) > 1 ? "#{quantity}x #{name}" : name) || 'order item'
|
34
33
|
end
|
35
34
|
|
35
|
+
# This method is called in a before_validation in order.assign_order_totals()
|
36
|
+
def assign_purchasable_attributes
|
37
|
+
assign_attributes(name: purchasable.purchasable_name, price: purchasable.price, tax_exempt: purchasable.tax_exempt) if purchasable
|
38
|
+
end
|
39
|
+
|
40
|
+
def build_purchasable(atts = {})
|
41
|
+
(self.purchasable ||= Effective::Product.new).tap { |purchasable| purchasable.assign_attributes(atts) }
|
42
|
+
end
|
43
|
+
|
36
44
|
def purchased_download_url
|
37
45
|
purchasable&.purchased_download_url
|
38
46
|
end
|
@@ -58,16 +66,13 @@ module Effective
|
|
58
66
|
end
|
59
67
|
|
60
68
|
def price=(value)
|
61
|
-
|
62
|
-
|
63
|
-
else
|
64
|
-
raise 'expected price to be an Integer representing the number of cents.'
|
65
|
-
end
|
69
|
+
raise 'expected price to be an Integer representing the number of cents.' unless value.kind_of?(Integer)
|
70
|
+
super
|
66
71
|
end
|
67
72
|
|
68
73
|
# first or build
|
69
74
|
def qb_item_name
|
70
|
-
raise('expected
|
75
|
+
raise('expected Effective Quickbooks gem') unless defined?(EffectiveQbSync) || defined?(EffectiveQbOnline)
|
71
76
|
(qb_order_item || build_qb_order_item(name: purchasable&.qb_item_name)).name
|
72
77
|
end
|
73
78
|
|
@@ -1,22 +1,24 @@
|
|
1
|
-
= effective_form_with(model: [:admin, order],
|
2
|
-
|
3
|
-
- user_collection = current_user.class.respond_to?(:sorted) ? current_user.class.sorted : current_user.class.all
|
4
|
-
|
5
|
-
= f.select :user_id, (@users || user_collection),
|
6
|
-
label: 'Buyer', required: true, hint: 'The user that should purchase this order.'
|
1
|
+
= effective_form_with(model: [:admin, order], engine: true) do |f|
|
2
|
+
= f.hidden_field :user_type, value: (f.object.user || current_user).class.name
|
7
3
|
|
8
|
-
|
4
|
+
- collection = (@users || current_user.class.try(:sorted) || current_user.class.all)
|
5
|
+
= f.select :user_id, collection, label: 'Buyer', required: true, hint: 'The user that should purchase this order.'
|
9
6
|
|
10
|
-
|
11
|
-
= f.has_many :order_items, remove: f.object.new_record? do |fc|
|
12
|
-
= render 'order_item_fields', f: fc
|
13
|
-
|
14
|
-
%hr
|
7
|
+
= f.email_cc_field :cc, hint: "Cc the above on any emailed receipts or payment requests."
|
15
8
|
|
9
|
+
- if f.object.new_record?
|
16
10
|
= f.check_box :send_payment_request_to_buyer,
|
17
11
|
label: 'Yes, send a payment request email to the buyer and any cc.',
|
18
12
|
value: (f.object.send_payment_request_to_buyer.nil? ? EffectiveOrders.send_payment_request_to_buyer : f.object.send_payment_request_to_buyer?)
|
19
13
|
|
14
|
+
%hr
|
15
|
+
|
16
|
+
%h2 Order Items
|
17
|
+
= f.has_many :order_items, remove: true do |fc|
|
18
|
+
= render 'order_item_fields', f: fc
|
19
|
+
|
20
|
+
%hr
|
21
|
+
|
20
22
|
.row
|
21
23
|
.col-md-6.effective-order-note-to-buyer
|
22
24
|
%h2 Note to Buyer
|
@@ -1,10 +1,19 @@
|
|
1
1
|
.row.align-items-center
|
2
|
-
= f.fields_for :purchasable, (f.object.purchasable ||
|
3
|
-
|
4
|
-
.col
|
2
|
+
= f.fields_for :purchasable, (f.object.purchasable || f.object.build_purchasable) do |pf|
|
3
|
+
-# Order item fields
|
4
|
+
.col
|
5
|
+
= f.hidden_field :purchasable_id
|
6
|
+
= f.hidden_field :purchasable_type
|
7
|
+
= f.number_field :quantity, input_html: { value: f.object.quantity || 1, min: 1 }
|
8
|
+
|
9
|
+
-# Purchasable fields
|
10
|
+
.col
|
11
|
+
= pf.hidden_field :id
|
12
|
+
= pf.text_field :name
|
13
|
+
|
5
14
|
.col= pf.price_field :price
|
6
15
|
|
7
|
-
- if EffectiveOrders.
|
16
|
+
- if EffectiveOrders.qb_sync? || EffectiveOrders.qb_online?
|
8
17
|
.col= pf.text_field :qb_item_name, label: 'Quickbooks Item'
|
9
18
|
|
10
19
|
.col= pf.check_box :tax_exempt, label: "Tax Exempt", title: 'When checked, tax will not be applied to this item'
|
@@ -1,6 +1,15 @@
|
|
1
1
|
%h1.effective-admin-heading= @page_title
|
2
2
|
|
3
|
-
|
3
|
+
- if @order.custom_order? && @order.in_progress?
|
4
|
+
= render 'effective/orders/order_actions', order: @order
|
4
5
|
|
5
|
-
.
|
6
|
-
|
6
|
+
.mb-4
|
7
|
+
= collapse('show order') do
|
8
|
+
= render 'effective/orders/order', order: @order, no_order_actions: true
|
9
|
+
|
10
|
+
= render 'admin/orders/form', order: @order
|
11
|
+
|
12
|
+
- else
|
13
|
+
- # Same as the show action
|
14
|
+
= render 'effective/orders/order', order: @order
|
15
|
+
= render 'admin/orders/form_note_internal', order: @order
|
@@ -1,4 +1,4 @@
|
|
1
1
|
%h1.effective-admin-heading= @page_title
|
2
2
|
|
3
|
-
= render
|
4
|
-
= render
|
3
|
+
= render 'effective/orders/order', order: @order
|
4
|
+
= render 'admin/orders/form_note_internal', order: @order
|
@@ -7,8 +7,14 @@
|
|
7
7
|
class: 'btn btn-secondary',
|
8
8
|
data: { method: :post, confirm: "Send receipt to #{order.emails_send_to}?" }
|
9
9
|
|
10
|
-
- if
|
11
|
-
- if order.
|
10
|
+
- if controller_path.include?('admin/') && (EffectiveResources.authorized?(controller, :admin, :effective_orders) rescue false)
|
11
|
+
- if order.persisted? && order.in_progress?
|
12
|
+
- if params[:action] == 'show'
|
13
|
+
= link_to('Edit', effective_orders.edit_admin_order_path(order), class: 'btn btn-primary')
|
14
|
+
|
15
|
+
- if params[:action] == 'edit'
|
16
|
+
= link_to('Show', effective_orders.admin_order_path(order), class: 'btn btn-primary')
|
17
|
+
|
12
18
|
= link_to 'Email request for payment to buyer', effective_orders.send_payment_request_admin_order_path(order),
|
13
19
|
class: 'btn btn-secondary',
|
14
20
|
data: { method: :post, confirm: "Send request for payment to #{order.emails_send_to}?" }
|
@@ -13,15 +13,15 @@
|
|
13
13
|
label: 'Payment card type, cheque or transaction number',
|
14
14
|
hint: 'Do not enter credit card numbers here, or anywhere.'
|
15
15
|
|
16
|
+
= f.check_box :send_mark_as_paid_email_to_buyer,
|
17
|
+
label: 'Yes, send a receipt email to the buyer.',
|
18
|
+
input_html: { checked: (f.object.send_mark_as_paid_email_to_buyer.nil? ? EffectiveOrders.send_order_receipts_when_mark_as_paid : f.object.send_mark_as_paid_email_to_buyer?) }
|
19
|
+
|
20
|
+
|
16
21
|
.row
|
17
22
|
.col
|
18
23
|
= f.text_area :note_to_buyer, hint: 'This message will be displayed to the buyer on the receipt.'
|
19
24
|
.col
|
20
25
|
= f.text_area :note_internal, hint: 'For or internal admin use only. This note will never be displayed to the buyer.'
|
21
26
|
|
22
|
-
= f.check_box :send_mark_as_paid_email_to_buyer,
|
23
|
-
label: 'Yes, send a receipt email to the buyer.',
|
24
|
-
input_html: { checked: (f.object.send_mark_as_paid_email_to_buyer.nil? ? EffectiveOrders.send_order_receipts_when_mark_as_paid : f.object.send_mark_as_paid_email_to_buyer?) }
|
25
|
-
|
26
|
-
|
27
27
|
= f.submit order_checkout_label(order.refund? ? :refund : :mark_as_paid)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_orders
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code and Effect
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-05-
|
11
|
+
date: 2022-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|