effective_orders 3.2.3 → 4.0.0beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/MIT-LICENSE +1 -1
- data/README.md +11 -99
- data/app/assets/stylesheets/effective_orders.scss +1 -0
- data/app/assets/stylesheets/effective_orders/_cart.scss +4 -0
- data/app/assets/stylesheets/effective_orders/_order.scss +6 -2
- data/app/controllers/admin/orders_controller.rb +17 -17
- data/app/controllers/effective/carts_controller.rb +4 -2
- data/app/controllers/effective/orders_controller.rb +50 -105
- data/app/controllers/effective/providers/cheque.rb +1 -1
- data/app/controllers/effective/providers/moneris.rb +17 -23
- data/app/controllers/effective/providers/stripe.rb +2 -37
- data/app/datatables/effective_customers_datatable.rb +1 -5
- data/app/datatables/effective_order_items_datatable.rb +10 -10
- data/app/datatables/effective_orders_datatable.rb +23 -46
- data/app/helpers/effective_carts_helper.rb +5 -25
- data/app/helpers/effective_orders_helper.rb +29 -61
- data/app/helpers/effective_paypal_helper.rb +10 -8
- data/app/helpers/effective_stripe_helper.rb +2 -33
- data/app/models/concerns/acts_as_purchasable.rb +26 -37
- data/app/models/concerns/acts_as_subscribable.rb +1 -1
- data/app/models/effective/cart.rb +4 -5
- data/app/models/effective/customer.rb +1 -4
- data/app/models/effective/order.rb +132 -163
- data/app/models/effective/order_item.rb +2 -21
- data/app/models/{effective → validators/effective}/sold_out_validator.rb +0 -0
- data/app/views/admin/customers/index.html.haml +1 -4
- data/app/views/admin/order_items/index.html.haml +1 -4
- data/app/views/admin/orders/_actions.html.haml +18 -9
- data/app/views/admin/orders/_form.html.haml +12 -14
- data/app/views/admin/orders/_form_note_internal.html.haml +2 -2
- data/app/views/admin/orders/_order_actions.html.haml +8 -5
- data/app/views/admin/orders/_order_item_fields.html.haml +9 -8
- data/app/views/admin/orders/checkout.html.haml +3 -0
- data/app/views/admin/orders/edit.html.haml +3 -1
- data/app/views/admin/orders/new.html.haml +2 -1
- data/app/views/admin/orders/show.html.haml +2 -5
- data/app/views/effective/carts/_cart.html.haml +1 -1
- data/app/views/effective/carts/_cart_actions.html.haml +3 -4
- data/app/views/effective/carts/show.html.haml +4 -4
- data/app/views/effective/orders/_checkout_actions.html.haml +3 -0
- data/app/views/effective/orders/_checkout_step1.html.haml +20 -27
- data/app/views/effective/orders/_checkout_step2.html.haml +26 -30
- data/app/views/effective/orders/_order.html.haml +1 -2
- data/app/views/effective/orders/_order_actions.html.haml +14 -6
- data/app/views/effective/orders/_order_header.html.haml +2 -2
- data/app/views/effective/orders/_order_note_fields.html.haml +6 -4
- data/app/views/effective/orders/_order_notes.html.haml +15 -0
- data/app/views/effective/orders/_order_payment_details.html.haml +1 -1
- data/app/views/effective/orders/_order_shipping.html.haml +6 -6
- data/app/views/effective/orders/_order_terms_and_conditions_fields.html.haml +5 -6
- data/app/views/effective/orders/_order_user_fields.html.haml +5 -11
- data/app/views/effective/orders/_orders_table.html.haml +2 -6
- data/app/views/effective/orders/index.html.haml +2 -1
- data/app/views/effective/orders/mark_as_paid/_form.html.haml +8 -14
- data/app/views/effective/orders/moneris/_form.html.haml +43 -4
- data/app/views/effective/orders/pretend/_form.html.haml +1 -3
- data/app/views/effective/orders/refund/_form.html.haml +8 -12
- data/app/views/effective/orders/show.html.haml +2 -2
- data/app/views/effective/orders/stripe/_form.html.haml +4 -4
- data/app/views/effective/orders_mailer/payment_request_to_buyer.html.haml +1 -1
- data/app/views/effective/orders_mailer/pending_order_invoice_to_buyer.html.haml +1 -1
- data/config/effective_orders.rb +116 -182
- data/config/routes.rb +16 -27
- data/db/migrate/01_create_effective_orders.rb.erb +6 -5
- data/lib/effective_orders.rb +72 -76
- data/lib/effective_orders/engine.rb +8 -80
- data/lib/effective_orders/version.rb +1 -1
- data/lib/generators/templates/effective_orders_mailer_preview.rb +4 -4
- metadata +26 -38
- data/Rakefile +0 -21
- data/app/assets/config/effective_orders_manifest.js +0 -3
- data/app/assets/images/effective_orders/stripe_connect.png +0 -0
- data/app/controllers/effective/providers/app_checkout.rb +0 -38
- data/app/controllers/effective/providers/ccbill.rb +0 -34
- data/app/controllers/effective/providers/stripe_connect.rb +0 -47
- data/app/helpers/effective_ccbill_helper.rb +0 -25
- data/app/models/effective/providers/ccbill_postback.rb +0 -85
- data/app/models/effective/providers/moneris_charge.rb +0 -115
- data/app/views/effective/orders/_order_note.html.haml +0 -5
- data/app/views/effective/orders/_order_note_to_buyer.html.haml +0 -9
- data/app/views/effective/orders/app_checkout/_form.html.haml +0 -2
- data/app/views/effective/orders/ccbill/_form.html.haml +0 -24
- data/app/views/effective/orders/my_purchases.html.haml +0 -3
- data/app/views/effective/orders/my_sales.html.haml +0 -25
- data/app/views/effective/orders_mailer/order_receipt_to_seller.html.haml +0 -25
- data/lib/effective_orders/app_checkout_service.rb +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e0cf749b4cef2660e59b16b802211c75e79e7400
|
4
|
+
data.tar.gz: c4c452a35a548596146b2fdf099916065361dd55
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af34590308483e7db60eb579b952167622809d2c0cfb9c1101221800e0a3ce51e5ffe6d8d7895755f7fe18282ac379e6de0406f47802c445e16a2492fd838a7a
|
7
|
+
data.tar.gz: c872866386ab0490fd154cb8caf59119c75ea61cb2f601049d92a75ec0d9a97a7f4e939563a13807b53f3440fe8a0d636c40326da2aa6b89f2858a4fa321f73e
|
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
@@ -4,20 +4,19 @@ Carts, Orders, and collecting payment via Stripe, PayPal and Moneris.
|
|
4
4
|
|
5
5
|
A Rails Engine to handle the purchase workflow in a Rails 3.2.x / Rails 4 application.
|
6
6
|
|
7
|
-
Also works with Stripe
|
7
|
+
Also works with Stripe Subscriptions.
|
8
8
|
|
9
9
|
Sends order receipt emails automatically.
|
10
10
|
|
11
11
|
Has Order History, My Purchases, My Sales and Admin screens.
|
12
12
|
|
13
|
-
##
|
13
|
+
## effective_orders 4.0
|
14
14
|
|
15
|
-
This is the
|
15
|
+
This is the 4.0 series of effective_orders.
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
For Bootstrap 4 please see the master branch and/or effective_orders 4.x gems.
|
17
|
+
This requires Twitter Bootstrap 4 and Rails 5.1+
|
20
18
|
|
19
|
+
Please check out [Effective Orders 3.x](https://github.com/code-and-effect/effective_orders/tree/bootstrap3) for more information using this gem with Bootstrap 3.
|
21
20
|
|
22
21
|
## Getting Started
|
23
22
|
|
@@ -26,7 +25,7 @@ Please first install the [effective_addresses](https://github.com/code-and-effec
|
|
26
25
|
Add to your Gemfile:
|
27
26
|
|
28
27
|
```ruby
|
29
|
-
gem 'effective_orders'
|
28
|
+
gem 'effective_orders'
|
30
29
|
```
|
31
30
|
|
32
31
|
Run the bundle command to install it:
|
@@ -264,10 +263,6 @@ acts_as_purchsable provides the following scopes:
|
|
264
263
|
|
265
264
|
`Product.purchased_by(user)` all the Products purchased by a given user.
|
266
265
|
|
267
|
-
`Product.sold` all the Products that have been solid (same as purchased)
|
268
|
-
|
269
|
-
`Product.sold_by(user)` all the Products that this user has sold via Stripe Connect
|
270
|
-
|
271
266
|
`Product.not_purchased` all unpurchased Products
|
272
267
|
|
273
268
|
### Digital Downloads
|
@@ -464,7 +459,7 @@ And call `render_cart(current_cart)` to display the Cart anywhere.
|
|
464
459
|
|
465
460
|
On the Checkout page (`effective_orders.new_order_path`) a new `Effective::Order` object is created and one or more `Effective::OrderItem`s are initialized based on the `current_cart`.
|
466
461
|
|
467
|
-
If the configuration options `config.
|
462
|
+
If the configuration options `config.billing_address` and/or `config.shipping_address` options are `true` then the user will be prompted for the appropriate addresses, based on [effective_addresses](https://github.com/code-and-effect/effective_addresses/).
|
468
463
|
|
469
464
|
If `config.use_address_full_name` is set to `true` then appropriate form field will be shown and the user will be prompted for the appropriate address full name during the checkout process, based on [effective_addresses](https://github.com/code-and-effect/effective_addresses/).
|
470
465
|
|
@@ -512,7 +507,7 @@ The `acts_as_purchasable` `.purchased?` and `.purchased_by?(user)` methods only
|
|
512
507
|
To programatically purchase one or more `acts_as_purchasable` objects:
|
513
508
|
|
514
509
|
```ruby
|
515
|
-
Effective::Order.new(
|
510
|
+
Effective::Order.new(@product1, @product2, user: current_user).purchase!(details: 'from my rake task')
|
516
511
|
```
|
517
512
|
|
518
513
|
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/).
|
@@ -541,7 +536,7 @@ The one gotcha with the above two scenarios, is that when `purchase!` is called,
|
|
541
536
|
You can skip validations with the following command, but be careful as this skips all validations:
|
542
537
|
|
543
538
|
```ruby
|
544
|
-
Effective::Order.new(
|
539
|
+
Effective::Order.new(@product, user: @user).purchase!(validate: false)
|
545
540
|
```
|
546
541
|
|
547
542
|
The `@product` is now considered purchased.
|
@@ -554,32 +549,10 @@ There also exist the scopes: `Effective::Order.purchased` and `Effective::Order.
|
|
554
549
|
|
555
550
|
### My Purchases / Order History
|
556
551
|
|
557
|
-
This screen displays all past purchases made by the current user. You can add it to your site's main menu or User profile area:
|
558
|
-
|
559
|
-
```ruby
|
560
|
-
= link_to_my_purchases() # To display My Purchases
|
561
|
-
```
|
562
|
-
|
563
|
-
or
|
564
|
-
|
565
|
-
```ruby
|
566
|
-
= link_to_my_purchases(label: 'Order History', class: 'btn btn-primary')
|
567
|
-
```
|
568
|
-
|
569
|
-
or
|
570
|
-
|
571
552
|
```ruby
|
572
|
-
= link_to '
|
553
|
+
= link_to 'Order History', effective_orders.orders_path
|
573
554
|
```
|
574
555
|
|
575
|
-
or render it inline on an existing page with
|
576
|
-
|
577
|
-
```ruby
|
578
|
-
render_order_history(user_or_orders)
|
579
|
-
```
|
580
|
-
|
581
|
-
If a user is passed, a call to `Effective::Order.purchased_by(user)` will be made to assign all purchased orders.
|
582
|
-
|
583
556
|
Totally optional, but another way of displaying the Order History is to use the included datatable, based on [effective_datatables](https://github.com/code-and-effect/effective_datatables/)
|
584
557
|
|
585
558
|
In your controller:
|
@@ -829,58 +802,6 @@ You an find these keys from the Stripe Dashbaord -> Your Account (dropdown) -> A
|
|
829
802
|
|
830
803
|
You're ready to accept payments.
|
831
804
|
|
832
|
-
### Stripe Connect
|
833
|
-
|
834
|
-
Stripe Connect allows effective_orders to collect payments on behalf of users.
|
835
|
-
|
836
|
-
First register your application with Stripe
|
837
|
-
|
838
|
-
Stripe Dashboard -> Your Account (dropdown) -> Account Settings -> Apps
|
839
|
-
|
840
|
-
Register your application
|
841
|
-
|
842
|
-
Name: Your Application Name
|
843
|
-
Website URL: root_url
|
844
|
-
|
845
|
-
Development:
|
846
|
-
|
847
|
-
client_id: given by stripe, we need to record this.
|
848
|
-
redirect_uri: stripe_connect_redirect_uri_url # http://www.example.com/effective/orders/stripe_connect_redirect_uri
|
849
|
-
webhook_uri: none
|
850
|
-
|
851
|
-
And add these values to the app/config/effective_orders.rb initializer:
|
852
|
-
|
853
|
-
```ruby
|
854
|
-
config.stripe = {
|
855
|
-
secret_key: 'sk_live_IKd6HDaYUfoRjflWQTXfFNfc',
|
856
|
-
publishable_key: 'pk_live_liEGn9f0mcxKmoSjoeNbbuE1',
|
857
|
-
currency: 'usd',
|
858
|
-
connect_client_id: 'ca_35jLok5G9kosyYF7quTOwcauJjTnUnud'
|
859
|
-
}
|
860
|
-
```
|
861
|
-
|
862
|
-
There are a few additional steps you need to take on the rails application side of things:
|
863
|
-
|
864
|
-
|
865
|
-
Before allowing one of your Users to create a Product for sale, you must enforce that they have a Stripe Connect account setup and configured.
|
866
|
-
|
867
|
-
You can check if they have an account set up using the built in helper `is_stripe_connect_seller?(current_user)`
|
868
|
-
|
869
|
-
If the above check returns false, you must send them to Stripe to set up their StripeConnect account, using the built in helper `link_to_new_stripe_connect_customer`
|
870
|
-
|
871
|
-
Once they've registered their account on the Stripe side, Stripe sends a webhook request, which is processed by the `webhooks_controller.rb`
|
872
|
-
|
873
|
-
In the webhook controller, an `Effective::Customer` object is created, and your user is now ready to sell stuff via StripeConnect.
|
874
|
-
|
875
|
-
|
876
|
-
Your product model must also define a `seller` method so that effective_orders knows who is selling the Product. Add the following to your `acts_as_purchasable` model:
|
877
|
-
|
878
|
-
```ruby
|
879
|
-
def seller
|
880
|
-
User.find(user_id)
|
881
|
-
end
|
882
|
-
```
|
883
|
-
|
884
805
|
### Stripe Subscriptions
|
885
806
|
|
886
807
|
To set up stripe subscriptions:
|
@@ -935,7 +856,7 @@ To set up stripe:
|
|
935
856
|
|
936
857
|
4.) Click API -> Webhooks and add an endpoint `root_url/webhooks/stripe`. You will need something like ngrok to test this.
|
937
858
|
|
938
|
-
5.) Record the webhook Signing secret in `config.
|
859
|
+
5.) Record the webhook Signing secret in `config.subscriptions[:webhook_secret]`
|
939
860
|
|
940
861
|
|
941
862
|
## Paying Via PayPal
|
@@ -1154,15 +1075,6 @@ end
|
|
1154
1075
|
|
1155
1076
|
MIT License. Copyright [Code and Effect Inc.](http://www.codeandeffect.com/)
|
1156
1077
|
|
1157
|
-
## Testing
|
1158
|
-
|
1159
|
-
Run tests by:
|
1160
|
-
|
1161
|
-
```ruby
|
1162
|
-
rspec
|
1163
|
-
```
|
1164
|
-
|
1165
|
-
|
1166
1078
|
## Contributing
|
1167
1079
|
|
1168
1080
|
1. Fork it
|
@@ -28,7 +28,11 @@
|
|
28
28
|
// Print - Resend Receipt. Ontop of order.
|
29
29
|
.effective-order-actions {
|
30
30
|
text-align: right;
|
31
|
-
margin-bottom:
|
31
|
+
margin-bottom: 0.5rem;
|
32
|
+
}
|
33
|
+
|
34
|
+
.effective-order-change-items {
|
35
|
+
margin-bottom: 1rem;
|
32
36
|
}
|
33
37
|
|
34
38
|
// Checkout buttons. Bottom of order.
|
@@ -41,7 +45,7 @@
|
|
41
45
|
}
|
42
46
|
|
43
47
|
.effective-order-admin-purchase-actions {
|
44
|
-
margin-top:
|
48
|
+
margin-top: 0.5rem;
|
45
49
|
}
|
46
50
|
|
47
51
|
form.new_effective_order {
|
@@ -4,6 +4,10 @@ module Admin
|
|
4
4
|
|
5
5
|
layout (EffectiveOrders.layout.kind_of?(Hash) ? EffectiveOrders.layout[:admin_orders] : EffectiveOrders.layout)
|
6
6
|
|
7
|
+
# def effective_resource
|
8
|
+
# @_effective_resource ||= Effective::Resource.new('effective/order', namespace: :admin)
|
9
|
+
# end
|
10
|
+
|
7
11
|
def new
|
8
12
|
@order = Effective::Order.new
|
9
13
|
|
@@ -40,8 +44,7 @@ module Admin
|
|
40
44
|
end
|
41
45
|
|
42
46
|
@order.attributes = order_params.except(:order_items_attributes, :user_id)
|
43
|
-
|
44
|
-
@order.create_as_pending!
|
47
|
+
@order.pending!
|
45
48
|
|
46
49
|
message = 'Successfully created order'
|
47
50
|
message << ". A request for payment has been sent to #{@order.user.email}" if @order.send_payment_request_to_buyer?
|
@@ -55,7 +58,7 @@ module Admin
|
|
55
58
|
end
|
56
59
|
|
57
60
|
@page_title = 'New Order'
|
58
|
-
flash.now[:danger] =
|
61
|
+
flash.now[:danger] = flash_danger(@order)
|
59
62
|
render :new
|
60
63
|
end
|
61
64
|
|
@@ -68,7 +71,6 @@ module Admin
|
|
68
71
|
|
69
72
|
def update
|
70
73
|
@order = Effective::Order.find(params[:id])
|
71
|
-
@order.skip_minimum_charge_validation = true if @order.refund?
|
72
74
|
|
73
75
|
@page_title ||= @order.to_s
|
74
76
|
|
@@ -90,7 +92,6 @@ module Admin
|
|
90
92
|
|
91
93
|
def show
|
92
94
|
@order = Effective::Order.find(params[:id])
|
93
|
-
@order.skip_minimum_charge_validation = true if @order.refund?
|
94
95
|
|
95
96
|
@page_title ||= @order.to_s
|
96
97
|
|
@@ -101,24 +102,26 @@ module Admin
|
|
101
102
|
# See Effective::OrdersController checkout
|
102
103
|
def checkout
|
103
104
|
@order = Effective::Order.find(params[:id])
|
104
|
-
@order.skip_minimum_charge_validation = true if @order.refund?
|
105
|
-
|
106
|
-
@page_title ||= 'Checkout'
|
107
105
|
|
108
106
|
authorize_effective_order!
|
109
107
|
|
108
|
+
if request.get?
|
109
|
+
@order.assign_confirmed_if_valid!
|
110
|
+
render :checkout and return
|
111
|
+
end
|
112
|
+
|
110
113
|
Effective::Order.transaction do
|
111
114
|
begin
|
112
115
|
@order.assign_attributes(checkout_params)
|
113
|
-
@order.
|
114
|
-
redirect_to(effective_orders.
|
116
|
+
@order.confirm!
|
117
|
+
redirect_to(effective_orders.checkout_admin_order_path(@order)) and return
|
115
118
|
rescue => e
|
116
119
|
raise ActiveRecord::Rollback
|
117
120
|
end
|
118
121
|
end
|
119
122
|
|
120
|
-
flash.now[:danger] = "Unable to
|
121
|
-
render :
|
123
|
+
flash.now[:danger] = "Unable to proceed: #{flash_errors(@order)}. Please try again."
|
124
|
+
render :checkout
|
122
125
|
end
|
123
126
|
|
124
127
|
def index
|
@@ -130,7 +133,7 @@ module Admin
|
|
130
133
|
end
|
131
134
|
|
132
135
|
def destroy
|
133
|
-
@order = Effective::Order.find(params[:id])
|
136
|
+
@order = Effective::Order.all.not_purchased.find(params[:id])
|
134
137
|
|
135
138
|
authorize_effective_order!
|
136
139
|
|
@@ -209,13 +212,10 @@ module Admin
|
|
209
212
|
case params[:commit].to_s
|
210
213
|
when 'Save' ; effective_orders.admin_order_path(@order)
|
211
214
|
|
212
|
-
when 'Save and Continue' ; effective_orders.admin_orders_path
|
213
|
-
when 'Save and Add New' ; effective_orders.new_admin_order_path(user_id: @order.user.try(:to_param))
|
214
|
-
when 'Save and Duplicate' ; effective_orders.new_admin_order_path(duplicate_id: @order.to_param)
|
215
|
-
|
216
215
|
when 'Continue' ; effective_orders.admin_orders_path
|
217
216
|
when 'Add New' ; effective_orders.new_admin_order_path(user_id: @order.user.try(:to_param))
|
218
217
|
when 'Duplicate' ; effective_orders.new_admin_order_path(duplicate_id: @order.to_param)
|
218
|
+
when 'Checkout' ; effective_orders.checkout_admin_order_path(@order.to_param)
|
219
219
|
|
220
220
|
else effective_orders.admin_order_path(@order)
|
221
221
|
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
module Effective
|
2
2
|
class CartsController < ApplicationController
|
3
|
-
include EffectiveCartsHelper
|
4
|
-
|
5
3
|
layout (EffectiveOrders.layout.kind_of?(Hash) ? EffectiveOrders.layout[:carts] : EffectiveOrders.layout)
|
6
4
|
|
7
5
|
def show
|
@@ -61,6 +59,10 @@ module Effective
|
|
61
59
|
|
62
60
|
private
|
63
61
|
|
62
|
+
def current_cart
|
63
|
+
view_context.current_cart
|
64
|
+
end
|
65
|
+
|
64
66
|
def add_to_cart_params
|
65
67
|
params.permit(:purchasable_type, :purchasable_id, :quantity)
|
66
68
|
end
|
@@ -1,137 +1,105 @@
|
|
1
1
|
module Effective
|
2
2
|
class OrdersController < ApplicationController
|
3
|
-
include EffectiveCartsHelper
|
4
|
-
|
5
3
|
include Concerns::Purchase
|
6
4
|
|
7
|
-
include Providers::
|
8
|
-
include Providers::
|
9
|
-
include Providers::
|
10
|
-
include Providers::
|
11
|
-
include Providers::
|
12
|
-
include Providers::
|
13
|
-
include Providers::
|
14
|
-
include Providers::
|
15
|
-
include Providers::Pretend if EffectiveOrders.allow_pretend_purchase_in_production && Rails.env.production?
|
16
|
-
include Providers::Refund if EffectiveOrders.allow_refunds
|
17
|
-
include Providers::Stripe if EffectiveOrders.stripe_enabled
|
18
|
-
include Providers::StripeConnect if EffectiveOrders.stripe_connect_enabled
|
5
|
+
include Providers::Cheque if EffectiveOrders.cheque?
|
6
|
+
include Providers::Free if EffectiveOrders.free?
|
7
|
+
include Providers::MarkAsPaid if EffectiveOrders.mark_as_paid?
|
8
|
+
include Providers::Moneris if EffectiveOrders.moneris?
|
9
|
+
include Providers::Paypal if EffectiveOrders.paypal?
|
10
|
+
include Providers::Pretend if EffectiveOrders.pretend?
|
11
|
+
include Providers::Refund if EffectiveOrders.refunds?
|
12
|
+
include Providers::Stripe if EffectiveOrders.stripe?
|
19
13
|
|
20
14
|
layout (EffectiveOrders.layout.kind_of?(Hash) ? EffectiveOrders.layout[:orders] : EffectiveOrders.layout)
|
21
15
|
|
22
|
-
before_action :authenticate_user!, except: [:ccbill_postback, :free, :
|
16
|
+
before_action :authenticate_user!, except: [:ccbill_postback, :free, :paypal_postback, :pretend]
|
23
17
|
before_action :set_page_title, except: [:show]
|
24
18
|
|
25
|
-
#
|
19
|
+
# If you want to use the Add to Cart -> Checkout flow
|
20
|
+
# Add one or more items however you do.
|
21
|
+
# redirect_to effective_orders.new_order_path, which is here.
|
22
|
+
# This is the entry point for any Checkout button.
|
23
|
+
# It displayes an order based on the cart
|
24
|
+
# Always step1
|
26
25
|
def new
|
27
|
-
@order ||= Effective::Order.new(
|
26
|
+
@order ||= Effective::Order.new(view_context.current_cart)
|
28
27
|
|
29
28
|
EffectiveOrders.authorize!(self, :new, @order)
|
30
29
|
|
31
|
-
|
32
|
-
|
33
|
-
@order.valid?
|
34
|
-
|
35
|
-
if @order.errors[:order_items].present?
|
36
|
-
flash[:danger] = @order.errors[:order_items].first
|
37
|
-
redirect_to(effective_orders.cart_path)
|
38
|
-
return
|
39
|
-
elsif @order.errors[:total].present?
|
40
|
-
flash[:danger] = @order.errors[:total].first
|
30
|
+
unless @order.valid?
|
31
|
+
flash[:danger] = "Unable to proceed: #{flash_errors(@order)}. Please try again."
|
41
32
|
redirect_to(effective_orders.cart_path)
|
42
33
|
return
|
43
34
|
end
|
44
|
-
|
45
|
-
@order.errors.clear
|
46
|
-
@order.billing_address.errors.clear if @order.billing_address
|
47
|
-
@order.shipping_address.errors.clear if @order.shipping_address
|
48
35
|
end
|
49
36
|
|
37
|
+
# Confirms an order from the cart.
|
50
38
|
def create
|
51
|
-
@order ||= Effective::Order.new(
|
39
|
+
@order ||= Effective::Order.new(view_context.current_cart)
|
52
40
|
EffectiveOrders.authorize!(self, :create, @order)
|
53
41
|
|
54
|
-
@order.assign_attributes(checkout_params)
|
42
|
+
@order.assign_attributes(checkout_params)
|
55
43
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
rescue => e
|
62
|
-
raise ActiveRecord::Rollback
|
63
|
-
end
|
44
|
+
if (@order.confirm! rescue false)
|
45
|
+
redirect_to(effective_orders.order_path(@order))
|
46
|
+
else
|
47
|
+
flash.now[:danger] = "Unable to proceed: #{flash_errors(@order)}. Please try again."
|
48
|
+
render :new
|
64
49
|
end
|
50
|
+
end
|
65
51
|
|
66
|
-
|
67
|
-
|
52
|
+
# If you want to use the order = Effective::Order.new(@thing); order.save! flow
|
53
|
+
# Add one or more items to the order.
|
54
|
+
# redirect_to effective_orders.order_path(order), which is here
|
55
|
+
# This is the entry point for an existing order.
|
56
|
+
# Might render step1 or step2
|
57
|
+
def show
|
58
|
+
@order = Effective::Order.find(params[:id])
|
59
|
+
EffectiveOrders.authorize!(self, :show, @order)
|
60
|
+
|
61
|
+
@page_title ||= ((@order.user == current_user && !@order.purchased?) ? 'Checkout' : @order.to_s)
|
68
62
|
end
|
69
63
|
|
64
|
+
# Always step1
|
70
65
|
def edit
|
71
66
|
@order ||= Effective::Order.find(params[:id])
|
72
67
|
EffectiveOrders.authorize!(self, :edit, @order)
|
73
68
|
end
|
74
69
|
|
70
|
+
# Confirms the order from existing order
|
75
71
|
def update
|
76
72
|
@order ||= Effective::Order.find(params[:id])
|
77
73
|
EffectiveOrders.authorize!(self, :update, @order)
|
78
74
|
|
79
75
|
@order.assign_attributes(checkout_params)
|
80
76
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
redirect_to(effective_orders.order_path(@order)) and return
|
87
|
-
rescue => e
|
88
|
-
raise ActiveRecord::Rollback
|
89
|
-
end
|
77
|
+
if (@order.confirm! rescue false)
|
78
|
+
redirect_to(effective_orders.order_path(@order))
|
79
|
+
else
|
80
|
+
flash.now[:danger] = "Unable to proceed: #{flash_errors(@order)}. Please try again."
|
81
|
+
render :edit
|
90
82
|
end
|
91
|
-
|
92
|
-
flash.now[:danger] = "Unable to proceed: #{@order.errors.full_messages.to_sentence}. Please try again."
|
93
|
-
render :edit
|
94
|
-
end
|
95
|
-
|
96
|
-
def show
|
97
|
-
@order = Effective::Order.find(params[:id])
|
98
|
-
EffectiveOrders.authorize!(self, :show, @order)
|
99
|
-
|
100
|
-
@page_title ||= ((@order.user == current_user && !@order.purchased?) ? 'Checkout' : @order.to_s)
|
101
83
|
end
|
102
84
|
|
85
|
+
# My Orders History
|
103
86
|
def index
|
104
|
-
@orders = Effective::Order.deep.
|
87
|
+
@orders = Effective::Order.deep.purchased.where(user: current_user)
|
105
88
|
@pending_orders = Effective::Order.deep.pending.where(user: current_user)
|
106
89
|
|
107
90
|
EffectiveOrders.authorize!(self, :index, Effective::Order.new(user: current_user))
|
108
91
|
end
|
109
92
|
|
110
|
-
# Basically an index page.
|
111
|
-
# Purchases is an Order History page. List of purchased orders
|
112
|
-
def my_purchases
|
113
|
-
@orders = Effective::Order.deep.purchased_by(current_user)
|
114
|
-
EffectiveOrders.authorize!(self, :index, Effective::Order.new(user: current_user))
|
115
|
-
end
|
116
|
-
|
117
|
-
# Sales is a list of what products beign sold by me have been purchased
|
118
|
-
def my_sales
|
119
|
-
@order_items = Effective::OrderItem.deep.sold_by(current_user)
|
120
|
-
EffectiveOrders.authorize!(self, :index, Effective::Order.new(user: current_user))
|
121
|
-
end
|
122
|
-
|
123
93
|
# Thank you for Purchasing this Order. This is where a successfully purchased order ends up
|
124
94
|
def purchased # Thank You!
|
125
95
|
@order = if params[:id].present?
|
126
96
|
Effective::Order.find(params[:id])
|
127
97
|
elsif current_user.present?
|
128
|
-
Effective::Order.purchased_by(current_user).
|
98
|
+
Effective::Order.sorted.purchased_by(current_user).last
|
129
99
|
end
|
130
100
|
|
131
|
-
clear_redirect_cookie!
|
132
|
-
|
133
101
|
if @order.blank?
|
134
|
-
redirect_to(effective_orders.
|
102
|
+
redirect_to(effective_orders.orders_path) and return
|
135
103
|
end
|
136
104
|
|
137
105
|
EffectiveOrders.authorize!(self, :show, @order)
|
@@ -143,8 +111,6 @@ module Effective
|
|
143
111
|
@order = Effective::Order.find(params[:id])
|
144
112
|
EffectiveOrders.authorize!(self, :show, @order)
|
145
113
|
|
146
|
-
clear_redirect_cookie!
|
147
|
-
|
148
114
|
redirect_to(effective_orders.order_path(@order)) unless @order.declined?
|
149
115
|
end
|
150
116
|
|
@@ -174,7 +140,7 @@ module Effective
|
|
174
140
|
EffectiveOrders.authorize!(self, :index, Effective::Order.new(user: current_user))
|
175
141
|
|
176
142
|
@orders.each do |order|
|
177
|
-
next unless
|
143
|
+
next unless EffectiveOrders.authorized?(self, :show, order)
|
178
144
|
|
179
145
|
order.send_order_receipt_to_buyer!
|
180
146
|
end
|
@@ -187,25 +153,6 @@ module Effective
|
|
187
153
|
|
188
154
|
private
|
189
155
|
|
190
|
-
def set_redirect_cookie!
|
191
|
-
return unless @order.present?
|
192
|
-
|
193
|
-
if params[:purchased_url]
|
194
|
-
session["effective_orders_#{@order.id}_purchased_url"] = params[:purchased_url]
|
195
|
-
end
|
196
|
-
|
197
|
-
if params[:declined_url]
|
198
|
-
session["effective_orders_#{@order.id}_declined_url"] = params[:declined_url]
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
def clear_redirect_cookie!
|
203
|
-
return unless @order.present?
|
204
|
-
|
205
|
-
session["effective_orders_#{@order.id}_purchased_url"] = nil
|
206
|
-
session["effective_orders_#{@order.id}_declined_url"] = nil
|
207
|
-
end
|
208
|
-
|
209
156
|
# StrongParameters
|
210
157
|
def checkout_params
|
211
158
|
params.require(:effective_order).permit(EffectiveOrders.permitted_params)
|
@@ -213,9 +160,7 @@ module Effective
|
|
213
160
|
|
214
161
|
def set_page_title
|
215
162
|
@page_title ||= case params[:action]
|
216
|
-
when 'index' ; '
|
217
|
-
when 'my_purchases' ; 'Order History'
|
218
|
-
when 'my_sales' ; 'Sales History'
|
163
|
+
when 'index' ; 'Order History'
|
219
164
|
when 'purchased' ; 'Thank You'
|
220
165
|
when 'declined' ; 'Payment Declined'
|
221
166
|
else 'Checkout'
|