op_cart 0.0.6 → 0.0.7
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/op_cart/orders.js.coffee +36 -13
- data/app/controllers/op_cart/orders_controller.rb +35 -17
- data/app/models/op_cart/line_item.rb +17 -1
- data/app/models/op_cart/order.rb +23 -1
- data/app/views/op_cart/orders/new.html.slim +24 -14
- data/app/views/op_cart/orders/show.html.slim +22 -0
- data/config/locales/op_cart.en.yml +2 -2
- data/db/migrate/20140829200318_create_op_cart_orders.rb +1 -0
- data/db/seeds.rb +12 -0
- data/lib/op_cart/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5eebd165fcfc2393d11a5bc38187675f501cb540
|
4
|
+
data.tar.gz: ae0ba7bc1ce2ee742a76b6c6fc4b7e4084262c8b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8219b5278281607723727a06fd338a0d52c77e605ba6459cb3ba72d468eaf4ce2ef3521db6229f576cec3206246dea632a85819b3571d6125525dfa0ae25631a
|
7
|
+
data.tar.gz: 8e945ab2f42a3e2d5d363046aaea27d3ee79bd46fee4328a66138ec124963b7919c3da548541b6aa49c40db3f2fabf7b7120cbd67345631237dedaf4aeee873b
|
@@ -1,12 +1,12 @@
|
|
1
|
-
OpCart =
|
1
|
+
@OpCart =
|
2
2
|
ready: ->
|
3
3
|
if $('body').is '.op_cart-orders-new'
|
4
|
-
$number = $ '#
|
5
|
-
$expiry = $ '#
|
6
|
-
$cvc = $ '#
|
7
|
-
$city = $ '#
|
8
|
-
$state = $ '#
|
9
|
-
$zip = $ '#
|
4
|
+
$number = $ '#order_credit_cards_number'
|
5
|
+
$expiry = $ '#order_credit_cards_expiry'
|
6
|
+
$cvc = $ '#order_credit_cards_cvc'
|
7
|
+
$city = $ '#order_shipping_addresses_city'
|
8
|
+
$state = $ '#order_shipping_addresses_state'
|
9
|
+
$zip = $ '#order_shipping_addresses_zip_code'
|
10
10
|
|
11
11
|
$number.payment 'formatCardNumber'
|
12
12
|
$expiry.payment 'formatCardExpiry'
|
@@ -29,11 +29,13 @@ OpCart =
|
|
29
29
|
$form = $(this)
|
30
30
|
$form.find("button").prop "disabled", true
|
31
31
|
|
32
|
-
|
32
|
+
Stripe.setPublishableKey $form.data("stripe-key")
|
33
|
+
|
34
|
+
expiration = $("#order_credit_cards_expiry").payment "cardExpiryVal"
|
33
35
|
|
34
36
|
Stripe.card.createToken
|
35
|
-
number: $("#
|
36
|
-
cvc: $("#
|
37
|
+
number: $("#order_credit_cards_number").val()
|
38
|
+
cvc: $("#order_credit_cards_cvc").val()
|
37
39
|
exp_month: expiration.month || 0
|
38
40
|
exp_year: expiration.year || 0
|
39
41
|
, OpCart.stripeResponseHandler
|
@@ -43,7 +45,6 @@ OpCart =
|
|
43
45
|
stripeResponseHandler: (status, response) ->
|
44
46
|
$form = $("#new_order")
|
45
47
|
|
46
|
-
debugger
|
47
48
|
if response.error || !$form.get(0).checkValidity()
|
48
49
|
if response.error
|
49
50
|
errorMessage = response.error.message
|
@@ -52,10 +53,32 @@ OpCart =
|
|
52
53
|
$form.find(".payment-errors").text errorMessage
|
53
54
|
$form.find("button").prop "disabled", false
|
54
55
|
else
|
55
|
-
$
|
56
|
+
$('#order_card_token').val response.id
|
56
57
|
$form.get(0).submit()
|
57
58
|
|
59
|
+
addItemToOrder: (productId, quantity) ->
|
60
|
+
currentQuantity = @lineItemQuantity productId
|
61
|
+
@lineItemQuantity productId, currentQuantity + 1
|
62
|
+
@updateDisplayedQuantity productId
|
63
|
+
|
64
|
+
removeItemFromOrder: (productId) ->
|
65
|
+
@lineItemQuantity productId, 0
|
66
|
+
@updateDisplayedQuantity productId
|
67
|
+
|
68
|
+
updateDisplayedQuantity: (productId) ->
|
69
|
+
$quantity = $ "#line_item_product_#{productId} .quantity .value"
|
70
|
+
$quantity.html @lineItemQuantity(productId)
|
71
|
+
|
72
|
+
lineItemQuantity: (productId, quantity) ->
|
73
|
+
$liQuantities = $ '#line_items_quantities'
|
74
|
+
liQuantities = JSON.parse $liQuantities.val() || "{}"
|
75
|
+
|
76
|
+
if quantity >= 0
|
77
|
+
liQuantities[productId] = quantity
|
78
|
+
$liQuantities.val JSON.stringify(liQuantities)
|
79
|
+
else
|
80
|
+
liQuantities[productId] || 0
|
58
81
|
|
59
82
|
$ -> OpCart.ready()
|
60
|
-
$(document).on 'page:load',
|
83
|
+
$(document).on 'page:load', OpCart.load
|
61
84
|
|
@@ -1,32 +1,50 @@
|
|
1
1
|
module OpCart
|
2
2
|
class OrdersController < ApplicationController
|
3
|
+
# before_action :authenticate_user!, only: [:show, :edit, :update, :destroy]
|
4
|
+
before_action :set_order, only: [:show, :edit, :update, :destroy]
|
5
|
+
|
3
6
|
def new
|
4
|
-
@products =
|
7
|
+
@products = Product.all
|
5
8
|
@order = Order.new
|
6
9
|
end
|
7
10
|
|
8
11
|
def create
|
9
|
-
|
12
|
+
@order = Order.new order_params
|
13
|
+
@order.status = :new
|
14
|
+
@order.user = current_user || User.first #TODO: Create a user from email
|
15
|
+
add_line_items
|
10
16
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
17
|
+
if @order.save
|
18
|
+
redirect_to @order, notice: 'Thank you for your purchase'
|
19
|
+
else
|
20
|
+
render :new
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def show
|
25
|
+
end
|
15
26
|
|
16
|
-
|
17
|
-
# TODO Create shipping address
|
27
|
+
private
|
18
28
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
29
|
+
def set_order
|
30
|
+
# TODO prevent viewing of others' orders
|
31
|
+
# @order = current_user.orders.find params[:id]
|
32
|
+
@order = Order.find params[:id]
|
33
|
+
end
|
34
|
+
|
35
|
+
def order_params
|
36
|
+
params.require(:order).permit(:email, :card_token,
|
37
|
+
{ shipping_address: [ :full_name, :address, :zip_code, :city, :state ] }
|
23
38
|
)
|
39
|
+
end
|
24
40
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
41
|
+
def add_line_items
|
42
|
+
li_quantities_json = JSON.parse params[:line_items][:quantities]
|
43
|
+
li_quantities_json.each do |product_id, quantity|
|
44
|
+
@order.line_items <<
|
45
|
+
LineItem.new(sellable: Product.find(product_id), quantity: quantity)
|
46
|
+
end
|
30
47
|
end
|
48
|
+
|
31
49
|
end
|
32
50
|
end
|
@@ -7,6 +7,22 @@ module OpCart
|
|
7
7
|
validates :quantity, numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
8
8
|
validates :sellable_snapshot, presence: true
|
9
9
|
validates :sellable, presence: true
|
10
|
-
validates :order, presence: true
|
10
|
+
# validates :order, presence: true
|
11
|
+
|
12
|
+
before_validation :set_unit_price
|
13
|
+
before_validation :snapshot_sellable
|
14
|
+
|
15
|
+
def total
|
16
|
+
(unit_price || sellable.price) * quantity
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
def set_unit_price
|
21
|
+
self.unit_price = sellable.price
|
22
|
+
end
|
23
|
+
|
24
|
+
def snapshot_sellable
|
25
|
+
self.sellable_snapshot = sellable.attributes
|
26
|
+
end
|
11
27
|
end
|
12
28
|
end
|
data/app/models/op_cart/order.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
module OpCart
|
2
2
|
class Order < ActiveRecord::Base
|
3
|
+
has_many :line_items
|
3
4
|
belongs_to :user
|
4
5
|
|
6
|
+
accepts_nested_attributes_for :line_items
|
7
|
+
|
5
8
|
validates :email, presence: true, format: { with: /@/ }
|
6
9
|
validates :total, numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
7
10
|
validates :tax_amount, numericality:
|
@@ -9,12 +12,31 @@ module OpCart
|
|
9
12
|
validates :status, presence: true
|
10
13
|
validates :user, presence: true
|
11
14
|
|
15
|
+
before_validation :set_total
|
12
16
|
before_save :charge_customer
|
13
17
|
|
14
18
|
private
|
15
19
|
|
20
|
+
def set_total
|
21
|
+
self.total = line_items.reduce(0) { |total, line_item| total += line_item.total }
|
22
|
+
end
|
23
|
+
|
16
24
|
def charge_customer
|
17
|
-
|
25
|
+
customer = Stripe::Customer.create(
|
26
|
+
card: card_token,
|
27
|
+
email: email
|
28
|
+
)
|
29
|
+
|
30
|
+
# TODO Create shipping address
|
31
|
+
|
32
|
+
Stripe::Charge.create(
|
33
|
+
amount: total,
|
34
|
+
currency: "usd",
|
35
|
+
customer: customer.id
|
36
|
+
)
|
37
|
+
rescue Stripe::CardError => e
|
38
|
+
# The card has been declined or some other error has occurred
|
39
|
+
self.errors.add e
|
18
40
|
end
|
19
41
|
end
|
20
42
|
end
|
@@ -1,21 +1,30 @@
|
|
1
|
-
|
2
|
-
script src="https://js.stripe.com/v2/" type="text/javascript"
|
3
|
-
|
4
|
-
javascript:
|
5
|
-
Stripe.setPublishableKey('#{Rails.configuration.stripe[:publishable_key]}')
|
6
|
-
|
7
|
-
- if @products.any?
|
8
|
-
-# Hack to display products temporarily
|
1
|
+
- if @products.present?
|
9
2
|
.new_order
|
10
|
-
h2 Items
|
3
|
+
h2 Purchasble Items
|
11
4
|
ul style="list-style-type: none"
|
12
5
|
- @products.each do |product|
|
13
6
|
li
|
14
7
|
p = product.name
|
15
8
|
p = product.description
|
16
9
|
p = number_to_currency product.price / 100
|
10
|
+
p
|
11
|
+
a onclick="OpCart.addItemToOrder(#{product.id}, 1)" style="cursor:pointer"
|
12
|
+
| Add to Order
|
13
|
+
|
14
|
+
h2 Items in Order
|
15
|
+
ul style="list-style-type: none"
|
16
|
+
- @products.each do |product|
|
17
|
+
li id="#{dom_id product, 'line_item'}"
|
18
|
+
p = product.name
|
19
|
+
p = number_to_currency product.price / 100
|
20
|
+
p.quantity
|
21
|
+
span.name Quantity:
|
22
|
+
span.value 0
|
23
|
+
p
|
24
|
+
a onclick="OpCart.removeItemFromOrder(#{product.id})" style="cursor:pointer"
|
25
|
+
| Remove
|
17
26
|
|
18
|
-
= simple_form_for @order do |f|
|
27
|
+
= simple_form_for @order, data: { stripe_key: Rails.configuration.stripe[:publishable_key] } do |f|
|
19
28
|
span.payment-errors
|
20
29
|
p
|
21
30
|
h2 Your Information
|
@@ -23,7 +32,7 @@ javascript:
|
|
23
32
|
|
24
33
|
p
|
25
34
|
h2 Shipping Address
|
26
|
-
= f.simple_fields_for :
|
35
|
+
= f.simple_fields_for :shipping_addresses do |sa|
|
27
36
|
= sa.input :full_name, input_html: { autocomplete: 'name' }
|
28
37
|
= sa.input :address, input_html: { autocomplete: 'street-address' }
|
29
38
|
= sa.input :zip_code, input_html: { autocomplete: 'postal-code' }
|
@@ -32,14 +41,15 @@ javascript:
|
|
32
41
|
|
33
42
|
p
|
34
43
|
h2 Card Details
|
35
|
-
= f.simple_fields_for :
|
44
|
+
= f.simple_fields_for :credit_cards do |c|
|
36
45
|
= c.input :number, input_html: { autocomplete: 'cc-number' }
|
37
46
|
= c.input :expiry, input_html: { autocomplete: 'cc-exp' }
|
38
47
|
= c.input :cvc, input_html: { autocomplete: 'cc-csc' }
|
39
48
|
|
40
|
-
=
|
49
|
+
= f.input :card_token, as: :hidden
|
50
|
+
= hidden_field :line_items, :quantities, value: "{}"
|
41
51
|
|
42
52
|
.form-actions
|
43
53
|
= f.button :button, "Submit Payment"
|
44
54
|
- else
|
45
|
-
p Add an item to your order.
|
55
|
+
p Add an item to your order to begin.
|
@@ -0,0 +1,22 @@
|
|
1
|
+
.new_order
|
2
|
+
h2 Items in Order
|
3
|
+
ul
|
4
|
+
- @order.line_items.each do |line_item|
|
5
|
+
li id="#{dom_id line_item}"
|
6
|
+
p = line_item.sellable.name
|
7
|
+
p.quantity
|
8
|
+
= line_item.quantity
|
9
|
+
| @
|
10
|
+
= number_to_currency line_item.unit_price / 100
|
11
|
+
| =
|
12
|
+
= number_to_currency line_item.total / 100
|
13
|
+
li
|
14
|
+
p Order Total: #{number_to_currency @order.total / 100}
|
15
|
+
|
16
|
+
p
|
17
|
+
h2 Your Information
|
18
|
+
= @order.email
|
19
|
+
p
|
20
|
+
h2 Shipping Address
|
21
|
+
p 123 N Todo Street
|
22
|
+
p Edmond, Oklahoma 73013
|
@@ -3,13 +3,13 @@ en:
|
|
3
3
|
placeholders:
|
4
4
|
order:
|
5
5
|
email: "Email"
|
6
|
-
|
6
|
+
shipping_addresses:
|
7
7
|
full_name: "Full Name"
|
8
8
|
address: "Street Address"
|
9
9
|
zip_code: "Zip Code"
|
10
10
|
city: "City"
|
11
11
|
state: "State"
|
12
|
-
|
12
|
+
credit_cards:
|
13
13
|
number: "Card Number"
|
14
14
|
expiry: 'MM/YY'
|
15
15
|
cvc: 'CVC'
|
data/db/seeds.rb
CHANGED
@@ -9,3 +9,15 @@ product1_attrs = {
|
|
9
9
|
}
|
10
10
|
|
11
11
|
product1 = OpCart::Product.where(sku: product1_attrs[:sku]).first_or_create product1_attrs
|
12
|
+
|
13
|
+
product2_attrs = {
|
14
|
+
name: 'Device 9000',
|
15
|
+
description: 'The much improved Device 9000',
|
16
|
+
sku: 'A2000',
|
17
|
+
price: 25000,
|
18
|
+
allow_purchases: true,
|
19
|
+
charge_taxes: true,
|
20
|
+
user: User.first,
|
21
|
+
}
|
22
|
+
|
23
|
+
product2 = OpCart::Product.where(sku: product2_attrs[:sku]).first_or_create product2_attrs
|
data/lib/op_cart/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: op_cart
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Boehs
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -87,6 +87,7 @@ files:
|
|
87
87
|
- app/models/op_cart/order.rb
|
88
88
|
- app/models/op_cart/product.rb
|
89
89
|
- app/views/op_cart/orders/new.html.slim
|
90
|
+
- app/views/op_cart/orders/show.html.slim
|
90
91
|
- config/initializers/stripe.rb
|
91
92
|
- config/locales/op_cart.en.yml
|
92
93
|
- config/routes.rb
|