effective_orders 4.4.4 → 4.4.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/effective_orders/providers/stripe.js.coffee +77 -0
- data/app/models/concerns/acts_as_purchasable.rb +1 -1
- data/app/models/concerns/acts_as_subscribable.rb +1 -1
- data/app/models/concerns/acts_as_subscribable_buyer.rb +1 -1
- data/app/models/effective/order.rb +3 -2
- data/app/views/admin/orders/_form.html.haml +1 -1
- data/lib/effective_orders/engine.rb +3 -3
- data/lib/effective_orders/version.rb +1 -1
- metadata +3 -3
- data/app/assets/javascripts/effective_orders/providers/stripe.js +0 -97
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 91f309d8560e78018e04639fa0e733cc40632b33048b22b30458e888216420d9
|
4
|
+
data.tar.gz: 6562b45ee4e8e400d94d85e568126ad67648eda2525bdc7fdbfefa6b78bc3ab1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c15aa6b827a544df46d52c2fff312a7dd4500bfd2e5c94cd3a59a88687ef29e053555038685601d578e92c385b00a3e253daec03b7893405adb21d75dad54a80
|
7
|
+
data.tar.gz: 39eabeb2eacc02d433ea2eb2545bb007d56d3cc96e0868f87febd719903dbb574c776c197ab301216c1f994c81619fb2d71fd26b6c26d843ffdad3086de20a6a
|
@@ -0,0 +1,77 @@
|
|
1
|
+
this.StripeForm ||= class StripeForm
|
2
|
+
constructor: ->
|
3
|
+
@form = null
|
4
|
+
@paymentIntent = null
|
5
|
+
|
6
|
+
@data = null
|
7
|
+
@stripe = null
|
8
|
+
@card = null
|
9
|
+
|
10
|
+
initialize: ->
|
11
|
+
@form = $('form[data-stripe-form]').first()
|
12
|
+
return false unless @form.length > 0
|
13
|
+
|
14
|
+
@paymentIntent = @form.find("input[name$='[payment_intent_id]']").first()
|
15
|
+
@data = @form.data('stripe-form')
|
16
|
+
@stripe = Stripe(@data.key)
|
17
|
+
@card = @stripe.elements().create('card', @style())
|
18
|
+
|
19
|
+
@mount()
|
20
|
+
|
21
|
+
style: ->
|
22
|
+
style: {
|
23
|
+
base: { color: '#32325d', fontSize: '16px', },
|
24
|
+
invalid: { color: '#dc3545', iconColor: '#dc3545' }
|
25
|
+
}
|
26
|
+
|
27
|
+
mount: ->
|
28
|
+
@card.mount('#stripe-card-element')
|
29
|
+
|
30
|
+
@card.addEventListener('change', (error) ->
|
31
|
+
$('#stripe-card-errors').text(if error.message then error.message else '')
|
32
|
+
)
|
33
|
+
|
34
|
+
@form.on('click', '[type=submit]', (event) => @submit(event))
|
35
|
+
|
36
|
+
submit: (event) ->
|
37
|
+
event.preventDefault()
|
38
|
+
|
39
|
+
payment = if @shouldUseNewCard() then @useNewCard() else @useExistingCard()
|
40
|
+
|
41
|
+
$.active = $.active + 1
|
42
|
+
|
43
|
+
payment.then((result) =>
|
44
|
+
if result.error
|
45
|
+
@errorPayment(result.error)
|
46
|
+
else if result.paymentIntent.status == 'succeeded'
|
47
|
+
@submitPayment(result.paymentIntent)
|
48
|
+
).then((result) =>
|
49
|
+
$.active = $.active - 1
|
50
|
+
)
|
51
|
+
|
52
|
+
shouldUseNewCard: ->
|
53
|
+
@form.get(0).checkValidity() &&
|
54
|
+
@paymentIntent.val().length == 0 &&
|
55
|
+
(@data.token_required || @form.children('.collapse.show').length > 0)
|
56
|
+
|
57
|
+
useNewCard: ->
|
58
|
+
@stripe.confirmCardPayment(@data.client_secret, {
|
59
|
+
payment_method: {
|
60
|
+
card: @card,
|
61
|
+
billing_details: { email: @data.email }
|
62
|
+
},
|
63
|
+
setup_future_usage: 'off_session'
|
64
|
+
})
|
65
|
+
|
66
|
+
useExistingCard: ->
|
67
|
+
@stripe.confirmCardPayment(@data.client_secret, { payment_method: @data.payment_method })
|
68
|
+
|
69
|
+
submitPayment: (payment) ->
|
70
|
+
@paymentIntent.val(payment['id'])
|
71
|
+
@form.submit()
|
72
|
+
|
73
|
+
errorPayment: (error) ->
|
74
|
+
$('#stripe-card-errors').text(error.message)
|
75
|
+
EffectiveForm.invalidate(@form);
|
76
|
+
|
77
|
+
$ -> (new StripeForm()).initialize()
|
@@ -337,13 +337,14 @@ module Effective
|
|
337
337
|
|
338
338
|
assign_attributes(
|
339
339
|
state: EffectiveOrders::PURCHASED,
|
340
|
-
purchased_at: Time.zone.now,
|
341
340
|
payment: payment_to_h(payment),
|
342
341
|
payment_provider: provider,
|
343
342
|
payment_card: (card.presence || 'none'),
|
344
343
|
skip_buyer_validations: skip_buyer_validations
|
345
344
|
)
|
346
345
|
|
346
|
+
self.purchased_at ||= Time.zone.now
|
347
|
+
|
347
348
|
Effective::Order.transaction do
|
348
349
|
begin
|
349
350
|
run_purchasable_callbacks(:before_purchase)
|
@@ -504,7 +505,7 @@ module Effective
|
|
504
505
|
end
|
505
506
|
|
506
507
|
def update_purchasables_purchased_order!
|
507
|
-
order_items.each { |oi| oi.purchasable
|
508
|
+
order_items.each { |oi| oi.purchasable&.update_column(:purchased_order_id, self.id) }
|
508
509
|
end
|
509
510
|
|
510
511
|
def run_purchasable_callbacks(name)
|
@@ -3,7 +3,7 @@
|
|
3
3
|
= f.select :user_id, @users || User.all.to_a.sort { |user1, user2| user1.to_s <=> user2.to_s },
|
4
4
|
label: 'Buyer', required: true, hint: 'The user that should purchase this order.'
|
5
5
|
|
6
|
-
= f.
|
6
|
+
= f.email_cc_field :cc, hint: "Cc the above on any emailed receipts or payment requests."
|
7
7
|
|
8
8
|
%h2 Order Items
|
9
9
|
.order_items
|
@@ -5,9 +5,9 @@ module EffectiveOrders
|
|
5
5
|
# Include acts_as_addressable concern and allow any ActiveRecord object to call it
|
6
6
|
initializer 'effective_orders.active_record' do |app|
|
7
7
|
ActiveSupport.on_load :active_record do
|
8
|
-
ActiveRecord::Base.extend(ActsAsPurchasable::
|
9
|
-
ActiveRecord::Base.extend(ActsAsSubscribable::
|
10
|
-
ActiveRecord::Base.extend(ActsAsSubscribableBuyer::
|
8
|
+
ActiveRecord::Base.extend(ActsAsPurchasable::Base)
|
9
|
+
ActiveRecord::Base.extend(ActsAsSubscribable::Base)
|
10
|
+
ActiveRecord::Base.extend(ActsAsSubscribableBuyer::Base)
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
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: 4.4.
|
4
|
+
version: 4.4.9
|
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: 2020-
|
11
|
+
date: 2020-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -121,7 +121,7 @@ files:
|
|
121
121
|
- app/assets/images/effective_orders/stripe.png
|
122
122
|
- app/assets/javascripts/effective_orders.js
|
123
123
|
- app/assets/javascripts/effective_orders/customers.js.coffee
|
124
|
-
- app/assets/javascripts/effective_orders/providers/stripe.js
|
124
|
+
- app/assets/javascripts/effective_orders/providers/stripe.js.coffee
|
125
125
|
- app/assets/javascripts/effective_orders/subscriptions.js.coffee
|
126
126
|
- app/assets/stylesheets/effective_orders.scss
|
127
127
|
- app/assets/stylesheets/effective_orders/_cart.scss
|
@@ -1,97 +0,0 @@
|
|
1
|
-
class StripeForm {
|
2
|
-
initialize() {
|
3
|
-
let $form = $('form[data-stripe-form]').first();
|
4
|
-
if ($form.length == 0) { return false; }
|
5
|
-
|
6
|
-
this.$form = $form;
|
7
|
-
this.$paymentIntentId = this.$form.find("input[name$='[payment_intent_id]']").first();
|
8
|
-
|
9
|
-
this.data = $form.data('stripe-form');
|
10
|
-
this.stripe = Stripe(this.data.key);
|
11
|
-
this.card = this.stripe.elements().create("card", { style: this.style() });
|
12
|
-
|
13
|
-
this.mount();
|
14
|
-
}
|
15
|
-
|
16
|
-
mount() {
|
17
|
-
this.card.mount("#stripe-card-element");
|
18
|
-
|
19
|
-
this.card.addEventListener('change', function ({ error }) {
|
20
|
-
if (error) {
|
21
|
-
$('#stripe-card-errors').text(error.message);
|
22
|
-
} else {
|
23
|
-
$('#stripe-card-errors').text('');
|
24
|
-
}
|
25
|
-
});
|
26
|
-
|
27
|
-
this.$form.on('click', '[type=submit]', (event) => { this.submit(event) });
|
28
|
-
}
|
29
|
-
|
30
|
-
shouldUseNewCard() {
|
31
|
-
let $newCardForm = this.$form.children('.collapse.show')
|
32
|
-
|
33
|
-
return (
|
34
|
-
this.$form.get(0).checkValidity() &&
|
35
|
-
(this.data.token_required || $newCardForm.length > 0) &&
|
36
|
-
this.$paymentIntentId.val().length == 0
|
37
|
-
)
|
38
|
-
}
|
39
|
-
|
40
|
-
submit(event) {
|
41
|
-
event.preventDefault();
|
42
|
-
|
43
|
-
let payment = this.shouldUseNewCard() ? this.useNewCard() : this.useExistingCard();
|
44
|
-
|
45
|
-
payment.then((result) => {
|
46
|
-
if (result.error) {
|
47
|
-
this.errorPayment(result.error)
|
48
|
-
} else if (result.paymentIntent.status == 'succeeded') {
|
49
|
-
this.submitPayment(result.paymentIntent);
|
50
|
-
}
|
51
|
-
});
|
52
|
-
}
|
53
|
-
|
54
|
-
useExistingCard() {
|
55
|
-
return this.stripe.confirmCardPayment(this.data.client_secret, {
|
56
|
-
payment_method: this.data.payment_method
|
57
|
-
});
|
58
|
-
}
|
59
|
-
|
60
|
-
useNewCard() {
|
61
|
-
return this.stripe.confirmCardPayment(this.data.client_secret, {
|
62
|
-
payment_method: {
|
63
|
-
card: this.card,
|
64
|
-
billing_details: {
|
65
|
-
email: this.data.email
|
66
|
-
}
|
67
|
-
},
|
68
|
-
setup_future_usage: 'off_session'
|
69
|
-
});
|
70
|
-
}
|
71
|
-
|
72
|
-
errorPayment(error) {
|
73
|
-
$('#stripe-card-errors').text(error.message);
|
74
|
-
EffectiveForm.invalidate(this.$form);
|
75
|
-
}
|
76
|
-
|
77
|
-
submitPayment(payment) {
|
78
|
-
this.$paymentIntentId.val('' + payment['id']);
|
79
|
-
this.$form.submit();
|
80
|
-
}
|
81
|
-
|
82
|
-
style() {
|
83
|
-
return {
|
84
|
-
base: {
|
85
|
-
color: "#32325d",
|
86
|
-
fontSize: "16px",
|
87
|
-
},
|
88
|
-
invalid: {
|
89
|
-
color: "#dc3545",
|
90
|
-
iconColor: "#dc3545"
|
91
|
-
}
|
92
|
-
};
|
93
|
-
}
|
94
|
-
|
95
|
-
}
|
96
|
-
|
97
|
-
$(document).ready(function () { new StripeForm().initialize(); });
|