op_cart 0.0.6 → 0.0.7
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/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
|