effective_orders 1.8.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/MIT-LICENSE +1 -1
- data/README.md +150 -60
- data/Rakefile +0 -3
- data/active_admin/effective_orders.rb +14 -9
- data/app/assets/javascripts/effective_orders.js +2 -0
- data/app/assets/javascripts/effective_orders/{stripe_charges.js.coffee → providers/stripe_charges.js.coffee} +1 -1
- data/app/assets/javascripts/effective_orders/{stripe_subscriptions.js.coffee → providers/stripe_subscriptions.js.coffee} +1 -1
- data/app/assets/stylesheets/effective_orders/_order.scss +9 -3
- data/app/controllers/admin/orders_controller.rb +87 -3
- data/app/controllers/concerns/acts_as_active_admin_controller.rb +2 -1
- data/app/controllers/effective/carts_controller.rb +4 -2
- data/app/controllers/effective/orders_controller.rb +101 -60
- data/app/controllers/effective/providers/app_checkout.rb +10 -2
- data/app/controllers/effective/providers/ccbill.rb +34 -0
- data/app/controllers/effective/providers/cheque.rb +30 -0
- data/app/controllers/effective/providers/moneris.rb +7 -7
- data/app/controllers/effective/providers/paypal.rb +7 -5
- data/app/controllers/effective/providers/pretend.rb +22 -0
- data/app/controllers/effective/providers/stripe.rb +26 -24
- data/app/controllers/effective/webhooks_controller.rb +1 -1
- data/app/helpers/effective_carts_helper.rb +59 -29
- data/app/helpers/effective_ccbill_helper.rb +25 -0
- data/app/helpers/effective_orders_helper.rb +50 -41
- data/app/helpers/effective_paypal_helper.rb +11 -11
- data/app/mailers/effective/orders_mailer.rb +95 -20
- data/app/models/concerns/acts_as_purchasable.rb +14 -22
- data/app/models/effective/cart.rb +9 -15
- data/app/models/effective/cart_item.rb +15 -13
- data/app/models/effective/customer.rb +9 -9
- data/app/models/effective/datatables/order_items.rb +14 -8
- data/app/models/effective/datatables/orders.rb +56 -69
- data/app/models/effective/order.rb +250 -139
- data/app/models/effective/order_item.rb +23 -16
- data/app/models/effective/product.rb +23 -0
- data/app/models/effective/providers/ccbill_postback.rb +85 -0
- data/app/models/effective/{stripe_charge.rb → providers/stripe_charge.rb} +1 -1
- data/app/models/effective/subscription.rb +16 -12
- data/app/models/effective/tax_rate_calculator.rb +45 -0
- data/app/views/admin/customers/index.html.haml +2 -5
- data/app/views/admin/order_items/index.html.haml +2 -5
- data/app/views/admin/orders/_actions.html.haml +2 -0
- data/app/views/admin/orders/_form.html.haml +28 -0
- data/app/views/admin/orders/_order_item_fields.html.haml +9 -0
- data/app/views/admin/orders/index.html.haml +9 -5
- data/app/views/admin/orders/new.html.haml +3 -0
- data/app/views/effective/carts/_cart.html.haml +3 -12
- data/app/views/effective/carts/_cart_actions.html.haml +4 -0
- data/app/views/effective/carts/show.html.haml +10 -12
- data/app/views/effective/orders/_checkout_step1.html.haml +46 -0
- data/app/views/effective/orders/_checkout_step2.html.haml +33 -0
- data/app/views/effective/orders/_order.html.haml +2 -0
- data/app/views/effective/orders/_order_actions.html.haml +10 -5
- data/app/views/effective/orders/_order_footer.html.haml +1 -0
- data/app/views/effective/orders/_order_items.html.haml +11 -9
- data/app/views/effective/orders/_order_note.html.haml +8 -0
- data/app/views/effective/orders/_order_note_fields.html.haml +5 -0
- data/app/views/effective/orders/_order_shipping.html.haml +4 -4
- data/app/views/effective/orders/_order_user_fields.html.haml +1 -0
- data/app/views/effective/orders/_orders_table.html.haml +27 -0
- data/app/views/effective/orders/ccbill/_form.html.haml +24 -0
- data/app/views/effective/orders/checkout_step1.html.haml +3 -0
- data/app/views/effective/orders/checkout_step2.html.haml +3 -0
- data/app/views/effective/orders/cheque/_form.html.haml +2 -0
- data/app/views/effective/orders/cheque/pay_by_cheque.html.haml +9 -0
- data/app/views/effective/orders/declined.html.haml +4 -2
- data/app/views/effective/orders/my_purchases.html.haml +1 -1
- data/app/views/effective/orders/my_sales.html.haml +1 -1
- data/app/views/effective/orders/purchased.html.haml +3 -2
- data/app/views/effective/orders/show.html.haml +1 -1
- data/app/views/effective/orders/stripe/_form.html.haml +5 -5
- data/app/views/effective/orders_mailer/order_error.html.haml +11 -0
- data/app/views/effective/orders_mailer/payment_request_to_buyer.html.haml +13 -0
- data/app/views/effective/orders_mailer/pending_order_invoice_to_buyer.html.haml +13 -0
- data/app/views/layouts/effective_orders_mailer_layout.html.haml +7 -7
- data/config/routes.rb +39 -24
- data/db/migrate/01_create_effective_orders.rb.erb +20 -1
- data/db/upgrade/03_upgrade_effective_orders_from1x.rb.erb +95 -0
- data/lib/effective_orders.rb +67 -9
- data/lib/effective_orders/app_checkout_service.rb +1 -2
- data/lib/effective_orders/engine.rb +46 -14
- data/lib/effective_orders/version.rb +1 -1
- data/lib/generators/effective_orders/install_generator.rb +1 -0
- data/lib/generators/effective_orders/upgrade_from03x_generator.rb +1 -0
- data/lib/generators/effective_orders/upgrade_from1x_generator.rb +31 -0
- data/lib/generators/templates/effective_orders.rb +131 -66
- data/lib/generators/templates/effective_orders_mailer_preview.rb +28 -13
- data/spec/controllers/admin/orders_controller_spec.rb +242 -0
- data/spec/controllers/ccbill_orders_controller_spec.rb +103 -0
- data/spec/controllers/moneris_orders_controller_spec.rb +23 -23
- data/spec/controllers/orders_controller_spec.rb +167 -79
- data/spec/controllers/stripe_orders_controller_spec.rb +7 -7
- data/spec/dummy/app/models/product.rb +0 -8
- data/spec/dummy/app/models/product_with_float_price.rb +0 -8
- data/spec/dummy/app/models/user.rb +2 -19
- data/spec/dummy/config/application.rb +2 -1
- data/spec/dummy/config/environments/test.rb +1 -0
- data/spec/dummy/config/initializers/effective_orders.rb +109 -64
- data/spec/dummy/db/schema.rb +15 -2
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/test.log +0 -258
- data/spec/models/acts_as_purchasable_spec.rb +8 -6
- data/spec/models/factories_spec.rb +7 -1
- data/spec/models/order_item_spec.rb +1 -1
- data/spec/models/order_spec.rb +165 -46
- data/spec/models/stripe_charge_spec.rb +5 -5
- data/spec/spec_helper.rb +2 -0
- data/spec/support/factories.rb +49 -33
- metadata +47 -64
- data/app/views/effective/orders/_checkout_step_1.html.haml +0 -43
- data/app/views/effective/orders/_checkout_step_2.html.haml +0 -25
- data/app/views/effective/orders/_my_purchases.html.haml +0 -17
- data/app/views/effective/orders/checkout.html.haml +0 -3
- data/app/views/effective/orders/new.html.haml +0 -4
- data/spec/dummy/log/development.log +0 -82
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 491804404e9833c139b5f3c4d90c190e09ad2fba
|
4
|
+
data.tar.gz: 1d3773f087028234c8c04d784ebec0fcb290efc5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e906c27c833ce87d77450b7d99ed5ac8a94c6d1f72e1be9bbd3efeb16ea7d59403947755c567c0e3f73334f15dff060779b2760b9272dceabfc0c6d5f570d70e
|
7
|
+
data.tar.gz: a3727d9a492c1512fe2f22b4ff540f2c02536454f43fbc239da67ca0b99d955e4604fc947565f571573416c4849b9b3fd087b088010f3e89182f7d6f13b0c71d
|
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
# 2.0 Branch
|
2
|
+
|
3
|
+
This is a work in progress branch. Don't use this yet!
|
4
|
+
|
1
5
|
# Effective Orders
|
2
6
|
|
3
7
|
Carts, Orders, and collecting payment via Stripe, PayPal and Moneris.
|
@@ -12,6 +16,12 @@ Has Order History, My Purchases, My Sales and Admin screens.
|
|
12
16
|
|
13
17
|
## Getting Started
|
14
18
|
|
19
|
+
Check your ruby version. As of the 2.0 branch, effective_orders requires a minimum ruby version of `2.1`:
|
20
|
+
|
21
|
+
```console
|
22
|
+
ruby -v
|
23
|
+
```
|
24
|
+
|
15
25
|
Add to your Gemfile:
|
16
26
|
|
17
27
|
```ruby
|
@@ -52,28 +62,27 @@ Require the stylesheet on the asset pipeline by adding the following to your app
|
|
52
62
|
*= require effective_orders
|
53
63
|
```
|
54
64
|
|
55
|
-
### Upgrading
|
65
|
+
### Upgrading to 2.0.x
|
56
66
|
|
57
|
-
|
67
|
+
The `tax_rate_method` configuration option has been removed and renamed to `order_tax_rate_method`.
|
68
|
+
Changing this in `/config/initializers/effective_orders.rb` is the first step.
|
58
69
|
|
59
|
-
|
60
|
-
|
61
|
-
If you're running a 0.3.x or earlier version, please upgrade to 0.4.x with this one command:
|
70
|
+
The default implementation assigns the tax rate based on the order's billing_address (see the [Tax section](#tax)):
|
62
71
|
|
63
72
|
```ruby
|
64
|
-
|
73
|
+
config.order_tax_rate_method = Proc.new { |order| Effective::TaxRateCalculator.new(order: order).tax_rate }
|
65
74
|
```
|
66
75
|
|
67
|
-
|
68
|
-
|
69
|
-
If you have additional (products or whatever..) tables with a column `price` represented as a Decimal, they should also be upgraded.
|
76
|
+
There are numerous database changes in the 2.0.0 line of effective_orders.
|
70
77
|
|
71
|
-
|
78
|
+
if you are running a 1.x version, please upgrade your database with this command:
|
72
79
|
|
73
80
|
```ruby
|
74
|
-
|
81
|
+
rails generate effective_orders:upgrade_from1x
|
75
82
|
```
|
76
83
|
|
84
|
+
the above command will add `products` table to you DB.
|
85
|
+
|
77
86
|
## High Level Overview
|
78
87
|
|
79
88
|
Your rails app creates and displays a list of `acts_as_purchsable` objects, each with a `link_to_add_to_cart(object)`.
|
@@ -133,22 +142,22 @@ class Product < ActiveRecord::Base
|
|
133
142
|
structure do
|
134
143
|
title :string
|
135
144
|
|
136
|
-
price :integer, :
|
137
|
-
tax_exempt :boolean, :
|
145
|
+
price :integer, default: 0
|
146
|
+
tax_exempt :boolean, default: false
|
138
147
|
|
139
|
-
archived :boolean, :
|
148
|
+
archived :boolean, default: false
|
140
149
|
|
141
150
|
timestamps
|
142
151
|
end
|
143
152
|
|
144
153
|
validates_presence_of :title
|
145
|
-
validates_numericality_of :price, :
|
154
|
+
validates_numericality_of :price, greater_than_or_equal_to: 0
|
146
155
|
|
147
|
-
scope :products, -> { where(:
|
156
|
+
scope :products, -> { where(archived: false) }
|
148
157
|
|
149
158
|
# This archives Products instead of deleting them
|
150
159
|
def destroy
|
151
|
-
update_attributes(:
|
160
|
+
update_attributes(archived: true)
|
152
161
|
end
|
153
162
|
|
154
163
|
end
|
@@ -189,7 +198,7 @@ This is available for simple_form, formtastic and Rails default FormBuilder.
|
|
189
198
|
= simple_form_for(@product) do |f|
|
190
199
|
= f.input :title
|
191
200
|
= f.input :tax_exempt
|
192
|
-
= f.input :price, :
|
201
|
+
= f.input :price, as: :price
|
193
202
|
= f.button :submit
|
194
203
|
```
|
195
204
|
|
@@ -197,7 +206,7 @@ or
|
|
197
206
|
|
198
207
|
```ruby
|
199
208
|
= semantic_form_for(@product) do |f|
|
200
|
-
= f.input :price, :
|
209
|
+
= f.input :price, as: :price
|
201
210
|
```
|
202
211
|
|
203
212
|
or
|
@@ -207,16 +216,16 @@ or
|
|
207
216
|
= f.price_field :price
|
208
217
|
```
|
209
218
|
|
210
|
-
The
|
219
|
+
The `as: :price` will work interchangeably with SimpleForm or Formtastic, as long as only one of these gems is present in your application
|
211
220
|
|
212
221
|
If you use both SimpleForm and Formtastic, you will need to call price input differently:
|
213
222
|
|
214
223
|
```ruby
|
215
224
|
= simple_form_for(@product) do |f|
|
216
|
-
= f.input :price, :
|
225
|
+
= f.input :price, as: :price_simple_form
|
217
226
|
|
218
227
|
= semantic_form_for @user do |f|
|
219
|
-
= f.input :price, :
|
228
|
+
= f.input :price, as: :price_formtastic
|
220
229
|
```
|
221
230
|
|
222
231
|
### Products#show
|
@@ -226,7 +235,7 @@ So back on the Product#show page, we will render the product with an Add To Cart
|
|
226
235
|
```haml
|
227
236
|
%h4= @product.title
|
228
237
|
%p= price_to_currency(@product.price)
|
229
|
-
%p= link_to_add_to_cart(@product, :
|
238
|
+
%p= link_to_add_to_cart(@product, class: 'btn btn-primary', label: 'Add To My Shopping Cart')
|
230
239
|
```
|
231
240
|
|
232
241
|
Please take note of the `price_to_currency` helper above.
|
@@ -246,7 +255,7 @@ We still need to create a link to the Shopping Cart page so that the user can vi
|
|
246
255
|
or
|
247
256
|
|
248
257
|
```ruby
|
249
|
-
= link_to_current_cart(:
|
258
|
+
= link_to_current_cart(label: 'Shopping Cart', class: 'btn btn-prmary') # To display Shopping Cart (3) when there are 3 items
|
250
259
|
```
|
251
260
|
|
252
261
|
or
|
@@ -266,13 +275,13 @@ The checkout screen can be reached through the My Cart page, or linked to direct
|
|
266
275
|
or
|
267
276
|
|
268
277
|
```ruby
|
269
|
-
= link_to_checkout(:
|
278
|
+
= link_to_checkout(label: 'Continue to Checkout', class: 'btn btn-primary')
|
270
279
|
```
|
271
280
|
|
272
281
|
or
|
273
282
|
|
274
283
|
```ruby
|
275
|
-
= link_to '
|
284
|
+
= link_to 'Continue to Checkout', effective_orders.new_order_path
|
276
285
|
```
|
277
286
|
|
278
287
|
From here, the effective_orders engine takes over, walks the user through billing and shipping details screens, then finally collects payment through one of the configured payment processors.
|
@@ -325,17 +334,43 @@ Of course, there's no mechanism here to prevent someone from just copy&pasting t
|
|
325
334
|
If you're interested in that kind of restricted-download functionality, please check out [effective_assets](https://github.com/code-and-effect/effective_assets) and the authenticated-read temporary URLs.
|
326
335
|
|
327
336
|
|
328
|
-
### Tax
|
337
|
+
### Tax Exempt
|
329
338
|
|
330
339
|
All `acts_as_purchasable` objects will respond to the boolean method `tax_exempt`.
|
331
340
|
|
332
341
|
By default, `tax_exempt` is false, meaning that tax must be applied to this item.
|
333
342
|
|
334
|
-
The tax calculation is controlled by the config/initializers/effective_orders.rb `config.tax_rate_method` and may be set on an app wide basis.
|
335
|
-
|
336
343
|
If `tax_exempt` returns true, it means that no tax will be applied to this item.
|
337
344
|
|
338
|
-
|
345
|
+
### Tax
|
346
|
+
|
347
|
+
The tax calculation applied to an order is controlled by the config/initializers/effective_orders.rb `config.order_tax_rate_method`
|
348
|
+
|
349
|
+
The default implementation assigns the tax rate based on the order's billing_address:
|
350
|
+
|
351
|
+
```ruby
|
352
|
+
config.order_tax_rate_method = Proc.new { |order| Effective::TaxRateCalculator.new(order: order).tax_rate }
|
353
|
+
```
|
354
|
+
|
355
|
+
Right now, the `Effective::TaxRateCalculator` only supports taxes for Canadian provinces.
|
356
|
+
|
357
|
+
US and international tax rates are not currently supported and are assigned 0% tax.
|
358
|
+
|
359
|
+
Instead of calculating based on the billing_address, a single static tax rate can be applied to all orders.
|
360
|
+
|
361
|
+
To apply 12.5% tax to all orders:
|
362
|
+
|
363
|
+
```ruby
|
364
|
+
config.order_tax_rate_method = Proc.new { |order| 12.5 }
|
365
|
+
```
|
366
|
+
|
367
|
+
Or to apply 0% tax:
|
368
|
+
|
369
|
+
```ruby
|
370
|
+
config.order_tax_rate_method = Proc.new { |order| 0 }
|
371
|
+
```
|
372
|
+
|
373
|
+
Please see the initializer file for more information.
|
339
374
|
|
340
375
|
|
341
376
|
### Callbacks
|
@@ -398,8 +433,8 @@ You can rescue from this exception by adding the following to your application_c
|
|
398
433
|
```ruby
|
399
434
|
rescue_from Effective::AccessDenied do |exception|
|
400
435
|
respond_to do |format|
|
401
|
-
format.html { render 'static_pages/access_denied', :
|
402
|
-
format.any { render :
|
436
|
+
format.html { render 'static_pages/access_denied', status: 403 }
|
437
|
+
format.any { render text: 'Access Denied', status: 403 }
|
403
438
|
end
|
404
439
|
end
|
405
440
|
```
|
@@ -409,9 +444,9 @@ end
|
|
409
444
|
The permissions you actually want to define for a regular user are as follows (using CanCan):
|
410
445
|
|
411
446
|
```ruby
|
412
|
-
can [:manage], Effective::Cart, :
|
413
|
-
can [:manage], Effective::Order, :
|
414
|
-
can [:manage], Effective::Subscription, :
|
447
|
+
can [:manage], Effective::Cart, user_id: user.id
|
448
|
+
can [:manage], Effective::Order, user_id: user.id # Orders cannot be deleted
|
449
|
+
can [:manage], Effective::Subscription, user_id: user.id
|
415
450
|
```
|
416
451
|
|
417
452
|
In addition to the above, the following permissions allow access to the `/admin` screens:
|
@@ -479,7 +514,7 @@ The Order has now been purchased.
|
|
479
514
|
If you are using effective_orders to roll your own custom payment workflow, you should be aware of the following helpers:
|
480
515
|
|
481
516
|
- `render_checkout(order)` to display the standard Checkout step inline.
|
482
|
-
- `render_checkout(order, :
|
517
|
+
- `render_checkout(order, purchased_redirect_url: '/', declined_redirect_url: '/')` to display the Checkout step with custom redirect paths.
|
483
518
|
|
484
519
|
- `render_purchasables(one_or_more_acts_as_purchasable_objects)` to display a list of purchasable items
|
485
520
|
|
@@ -503,7 +538,7 @@ The `acts_as_purchasable` `.purchased?` and `.purchased_by?(user)` methods only
|
|
503
538
|
To programatically purchase one or more `acts_as_purchasable` objects:
|
504
539
|
|
505
540
|
```ruby
|
506
|
-
Effective::Order.new(
|
541
|
+
Effective::Order.new(@product1, @product2, user: current_user).purchase!(details: 'from my rake task')
|
507
542
|
```
|
508
543
|
|
509
544
|
Here the `billing_address` and `shipping_address` are copied from the `current_user` object if the `current_user` responds_to `billing_address` / `shipping_address` as per [effective_addresses](https://github.com/code-and-effect/effective_addresses/).
|
@@ -517,7 +552,7 @@ order.billing_address = Effective::Address.new(...)
|
|
517
552
|
order.shipping_address = Effective::Address.new(...)
|
518
553
|
order.add(@product1)
|
519
554
|
order.add(@product2)
|
520
|
-
order.purchase!(:
|
555
|
+
order.purchase!(details: {complicated: 'details', in: 'a hash'})
|
521
556
|
```
|
522
557
|
|
523
558
|
The one gotcha with the above two scenarios, is that when `purchase!` is called, the `Effective::Order` in question will run through its validations. These validations include:
|
@@ -526,13 +561,13 @@ The one gotcha with the above two scenarios, is that when `purchase!` is called,
|
|
526
561
|
- `validates_presence_of :shipping_address` when configured to be required
|
527
562
|
- `validates :user` which can be disabled via config initializer
|
528
563
|
|
529
|
-
- `validates_numericality_of :total, :
|
564
|
+
- `validates_numericality_of :total, greater_than_or_equal_to: minimum_charge` where minimum_charge is the configured value, once again from the initializer
|
530
565
|
- `validates_presence_of :order_items` the Order must have at least one OrderItem
|
531
566
|
|
532
567
|
You can skip validations with the following command, but be careful as this skips all validations:
|
533
568
|
|
534
569
|
```ruby
|
535
|
-
Effective::Order.new(@product, @user).purchase!(
|
570
|
+
Effective::Order.new(@product, user: @user).purchase!(validate: false)
|
536
571
|
```
|
537
572
|
|
538
573
|
The `@product` is now considered purchased.
|
@@ -554,7 +589,7 @@ This screen displays all past purchases made by the current user. You can add i
|
|
554
589
|
or
|
555
590
|
|
556
591
|
```ruby
|
557
|
-
= link_to_my_purchases(:
|
592
|
+
= link_to_my_purchases(label: 'Order History', class: 'btn btn-primary')
|
558
593
|
```
|
559
594
|
|
560
595
|
or
|
@@ -576,7 +611,7 @@ Totally optional, but another way of displaying the Order History is to use the
|
|
576
611
|
In your controller:
|
577
612
|
|
578
613
|
```ruby
|
579
|
-
@datatable = Effective::Datatables::Orders.new(:
|
614
|
+
@datatable = Effective::Datatables::Orders.new(user_id: @user.id)
|
580
615
|
```
|
581
616
|
|
582
617
|
and then in the view:
|
@@ -667,17 +702,17 @@ Copy these two values into the appropriate lines of config/effective_orders.rb i
|
|
667
702
|
|
668
703
|
if Rails.env.production?
|
669
704
|
config.moneris = {
|
670
|
-
:
|
671
|
-
:
|
672
|
-
:
|
673
|
-
:
|
705
|
+
ps_store_id: '',
|
706
|
+
hpp_key: '',
|
707
|
+
hpp_url: 'https://www3.moneris.com/HPPDP/index.php',
|
708
|
+
verify_url: 'https://www3.moneris.com/HPPDP/verifyTxn.php'
|
674
709
|
}
|
675
710
|
else
|
676
711
|
config.moneris = {
|
677
|
-
:
|
678
|
-
:
|
679
|
-
:
|
680
|
-
:
|
712
|
+
ps_store_id: 'VZ9BNtore1',
|
713
|
+
hpp_key: 'hp1Y5J35GVDM',
|
714
|
+
hpp_url: 'https://esqa.moneris.com/HPPDP/index.php',
|
715
|
+
verify_url: 'https://esqa.moneris.com/HPPDP/verifyTxn.php'
|
681
716
|
}
|
682
717
|
end
|
683
718
|
```
|
@@ -781,9 +816,9 @@ Then enable Stripe in the app/config/effective_orders.rb initializer and enter y
|
|
781
816
|
config.stripe_enabled = true
|
782
817
|
|
783
818
|
config.stripe = {
|
784
|
-
:
|
785
|
-
:
|
786
|
-
:
|
819
|
+
secret_key: 'sk_live_IKd6HDaYUfoRjflWQTXfFNfc',
|
820
|
+
publishable_key: 'pk_live_liEGn9f0mcxKmoSjoeNbbuE1',
|
821
|
+
currency: 'usd'
|
787
822
|
}
|
788
823
|
```
|
789
824
|
|
@@ -814,10 +849,10 @@ And add these values to the app/config/effective_orders.rb initializer:
|
|
814
849
|
|
815
850
|
```ruby
|
816
851
|
config.stripe = {
|
817
|
-
:
|
818
|
-
:
|
819
|
-
:
|
820
|
-
:
|
852
|
+
secret_key: 'sk_live_IKd6HDaYUfoRjflWQTXfFNfc',
|
853
|
+
publishable_key: 'pk_live_liEGn9f0mcxKmoSjoeNbbuE1',
|
854
|
+
currency: 'usd',
|
855
|
+
connect_client_id: 'ca_35jLok5G9kosyYF7quTOwcauJjTnUnud'
|
821
856
|
}
|
822
857
|
```
|
823
858
|
|
@@ -933,6 +968,63 @@ The secret can be any string. Here's a good way to come up with a secret:
|
|
933
968
|
This process should be very similar although you'll create and configure a seller account on paypal.com rather than the sandbox site.
|
934
969
|
You should generate separate private and public certificates/keys for this and it is advisable to not keep production certificates/keys in version control.
|
935
970
|
|
971
|
+
## Paying via CCBill
|
972
|
+
|
973
|
+
Effective Orders has implemented checkout with CCBill using their "Dynamic Pricing" API and does not
|
974
|
+
integrate with CCBill subscriptions. If you need to make payments for CCBill subscriptions, please help
|
975
|
+
by improving Effective Orders with this functionality.
|
976
|
+
|
977
|
+
### CCBill Account Setup
|
978
|
+
|
979
|
+
You need a merchant account with CCBill so go sign up and login. To set up your account with Dynamic
|
980
|
+
Pricing, you'll need to go through some hoops with CCBill:
|
981
|
+
|
982
|
+
1. Get approval to operate a merchant account from CCBill Merchant Services (they'll need to see your
|
983
|
+
site in action)
|
984
|
+
2. Provide CCBill with two valid forms of ID and wait for them to approve your account
|
985
|
+
3. Create two additional sub accounts for a staging server and your localhost
|
986
|
+
("Account Info" > "Account Setup")
|
987
|
+
4. Get each new sub account approved by Merchant Services (mention that they are for testing only)
|
988
|
+
5. Ask CCBill tech support to set up all sub accounts with Dynamic Pricing
|
989
|
+
6. Set the postback urls for each sub account to be `"#{ your_domain_name }/orders/ccbill_postback`
|
990
|
+
(Look for 'Approval Post URL' and 'Denial Post URL' in "Account Info" > "Sub Account Admin" > select sub account
|
991
|
+
\> "Advanced" > under 'Background Post Information')
|
992
|
+
|
993
|
+
### Effective Orders Configuration
|
994
|
+
|
995
|
+
Get the following information and add it
|
996
|
+
to the Effective Orders initializer. CCBill live chat is generally quick and helpful. They can help you
|
997
|
+
find any of this information.
|
998
|
+
|
999
|
+
- Account number (`:client_accnum`)
|
1000
|
+
- Subaccount number (`:client_subacc`)
|
1001
|
+
- Checkout form id/name (`:form_name`)
|
1002
|
+
- Currency code (`:currency_code`)
|
1003
|
+
- Encryption key/salt (`:dynamic_pricing_salt`)("Account Info" > "Sub Account Admin" > select sub account
|
1004
|
+
\> "Advanced" > under 'Upgrade Security Setup Information' > 'Encryption key')
|
1005
|
+
|
1006
|
+
Effective Orders will authorize to make changes to the customer's order during CCBill's post back after
|
1007
|
+
the transaction. Since, this is not an action that the customer takes directly, please make sure
|
1008
|
+
that the Effective Orders authorization method returns `true` for the controller/action
|
1009
|
+
`'Effective::OrdersController#ccbill_postback'` with an `Effective::Order` resource.
|
1010
|
+
|
1011
|
+
### Testing transactions with CCBill
|
1012
|
+
|
1013
|
+
To test payments with CCBill:
|
1014
|
+
|
1015
|
+
1. Set up yourself as a user who is authorized to make test transactions
|
1016
|
+
([See this guide](https://www.ccbill.com/cs/wiki/tiki-index.php?page=How+do+I+set+up+a+user+to+process+test+transactions%3F))
|
1017
|
+
2. Use ngrok on localhost or a staging server to go through a normal payment (remember to configure the
|
1018
|
+
postback urls (see #6 of [CCBill Account Setup](#ccbill-account-setup))
|
1019
|
+
3. Use one of the provided credit card numbers in the guide from step 1 for the associated response
|
1020
|
+
|
1021
|
+
### Helpful CCBill Documentation
|
1022
|
+
|
1023
|
+
- [Dynamic Pricing](https://www.ccbill.com/cs/wiki/tiki-index.php?page=Dynamic+Pricing)
|
1024
|
+
- [Dynamic Pricing User Guide](https://www.ccbill.com/cs/wiki/tiki-index.php?page=Dynamic+Pricing+User+Guide)
|
1025
|
+
- [Background Post](https://www.ccbill.com/cs/wiki/tiki-index.php?page=Background+Post)
|
1026
|
+
- [Webhooks](https://www.ccbill.com/cs/wiki/tiki-index.php?page=Webhooks+User+Guide)
|
1027
|
+
- [How do I set up a user to process test transactions?](https://www.ccbill.com/cs/wiki/tiki-index.php?page=How+do+I+set+up+a+user+to+process+test+transactions%3F)
|
936
1028
|
|
937
1029
|
## Paying Using App Currency or Logic
|
938
1030
|
|
@@ -1016,12 +1108,10 @@ Code and Effect is the product arm of [AgileStyle](http://www.agilestyle.com/),
|
|
1016
1108
|
|
1017
1109
|
## Testing
|
1018
1110
|
|
1019
|
-
The test suite for this gem is mostly complete.
|
1020
|
-
|
1021
1111
|
Run tests by:
|
1022
1112
|
|
1023
1113
|
```ruby
|
1024
|
-
|
1114
|
+
rspec
|
1025
1115
|
```
|
1026
1116
|
|
1027
1117
|
|
data/Rakefile
CHANGED
@@ -5,9 +5,6 @@ rescue LoadError
|
|
5
5
|
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
6
|
end
|
7
7
|
|
8
|
-
# Our tasks
|
9
|
-
load 'lib/tasks/effective_orders_tasks.rake'
|
10
|
-
|
11
8
|
# Testing tasks
|
12
9
|
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
13
10
|
load 'rails/tasks/engine.rake'
|
@@ -19,6 +19,11 @@ if defined?(ActiveAdmin)
|
|
19
19
|
|
20
20
|
def scoped_collection
|
21
21
|
scoped = end_of_association_chain.includes(:user).includes(order_items: :purchasable)
|
22
|
+
|
23
|
+
if EffectiveOrders.orders_collection_scope.respond_to?(:call)
|
24
|
+
scoped = EffectiveOrders.orders_collection_scope.call(scoped)
|
25
|
+
end
|
26
|
+
|
22
27
|
scoped = scoped.where(user: current_user) if !authorized?(:admin, :effective_orders)
|
23
28
|
scoped
|
24
29
|
end
|
@@ -55,12 +60,12 @@ if defined?(ActiveAdmin)
|
|
55
60
|
price_to_currency(order.total)
|
56
61
|
end
|
57
62
|
|
58
|
-
column :
|
59
|
-
order.
|
63
|
+
column :payment_provider do |order|
|
64
|
+
order.payment_provider
|
60
65
|
end
|
61
66
|
|
62
|
-
column :
|
63
|
-
order.
|
67
|
+
column :payment_card do |order|
|
68
|
+
order.payment_card
|
64
69
|
end
|
65
70
|
|
66
71
|
column do |order|
|
@@ -80,8 +85,8 @@ if defined?(ActiveAdmin)
|
|
80
85
|
col_headers << "Subtotal"
|
81
86
|
col_headers << "Tax"
|
82
87
|
col_headers << "Total"
|
83
|
-
col_headers << '
|
84
|
-
col_headers << '
|
88
|
+
col_headers << 'Payment provider'
|
89
|
+
col_headers << 'Payment card'
|
85
90
|
|
86
91
|
csv_string = CSV.generate do |csv|
|
87
92
|
csv << col_headers
|
@@ -91,12 +96,12 @@ if defined?(ActiveAdmin)
|
|
91
96
|
order.to_param,
|
92
97
|
order.purchased_at.strftime("%Y-%m-%d %H:%M:%S %z"),
|
93
98
|
order.user.try(:email),
|
94
|
-
(order.billing_address.try(:full_name) || order.user.to_s),
|
99
|
+
(order.try(:billing_address).try(:full_name) || order.user.to_s),
|
95
100
|
(order.subtotal / 100.0).round(2),
|
96
101
|
(order.tax / 100.0).round(2),
|
97
102
|
(order.total / 100.0).round(2),
|
98
|
-
order.
|
99
|
-
order.
|
103
|
+
order.payment_provider,
|
104
|
+
order.payment_card
|
100
105
|
]
|
101
106
|
end
|
102
107
|
end
|