diff --git a/app/furniture/marketplace/cart.rb b/app/furniture/marketplace/cart.rb
index c555e90f0..ceccee17a 100644
--- a/app/furniture/marketplace/cart.rb
+++ b/app/furniture/marketplace/cart.rb
@@ -24,7 +24,7 @@ class Cart < Record
def product_total
cart_products.sum(0) do |cart_product|
- cart_product.product.price * cart_product.quantity
+ cart_product.price_total
end
end
@@ -34,8 +34,14 @@ def delivery_fee
0
end
+ def tax_total
+ cart_products.sum(0) do |cart_product|
+ cart_product.tax_amount
+ end
+ end
+
def price_total
- product_total + delivery_fee
+ product_total + delivery_fee + tax_total
end
end
end
diff --git a/app/furniture/marketplace/cart_product.rb b/app/furniture/marketplace/cart_product.rb
index 089d78521..5acb796a9 100644
--- a/app/furniture/marketplace/cart_product.rb
+++ b/app/furniture/marketplace/cart_product.rb
@@ -8,13 +8,23 @@ class CartProduct < Record
delegate :shopper, to: :cart
belongs_to :product, inverse_of: :cart_products
- delegate :name, :description, :marketplace, :price, :price_cents, to: :product
+ delegate :name, :description, :marketplace, :price, :price_cents, :tax_rates, to: :product
validates_uniqueness_of :product, scope: :cart_id
validate :editable_cart
attribute :quantity, :integer, default: 0
+ def tax_amount
+ price_total * (tax_rates.sum(0) do |tax_rate|
+ tax_rate.tax_rate
+ end / 100)
+ end
+
+ def price_total
+ product.price * quantity
+ end
+
private
def editable_cart
diff --git a/app/furniture/marketplace/carts/_total.html.erb b/app/furniture/marketplace/carts/_total.html.erb
index 62b5c4a71..82a996cc8 100644
--- a/app/furniture/marketplace/carts/_total.html.erb
+++ b/app/furniture/marketplace/carts/_total.html.erb
@@ -2,6 +2,9 @@
Products:
<%= humanized_money_with_symbol(cart.product_total) %>
+
+ Taxes:
+ <%= humanized_money_with_symbol(cart.tax_total) %>
<%- if cart.delivery_address.present? %>
Delivery Fee:
<%= humanized_money_with_symbol(cart.delivery_fee) %>
diff --git a/app/furniture/marketplace/checkout.rb b/app/furniture/marketplace/checkout.rb
index 7eae2a884..5588014ff 100644
--- a/app/furniture/marketplace/checkout.rb
+++ b/app/furniture/marketplace/checkout.rb
@@ -29,7 +29,7 @@ def create_stripe_session(success_url:, cancel_url:)
def stripe_line_items
return [] if cart.blank?
- stripe_cart_products_line_items + stripe_delivery_fee_line_items
+ stripe_cart_products_line_items + stripe_delivery_fee_line_items + stripe_taxes_line_items
end
private def stripe_cart_products_line_items
@@ -40,8 +40,7 @@ def stripe_line_items
unit_amount: cart_product.product.price_cents,
product_data: {name: cart_product.product.name}
},
- quantity: cart_product.quantity,
- adjustable_quantity: {enabled: true}
+ quantity: cart_product.quantity
}
end
end
@@ -56,5 +55,14 @@ def stripe_line_items
}}
]
end
+
+ private def stripe_taxes_line_items
+ [{quantity: 1,
+ price_data: {
+ currency: "USD",
+ unit_amount: cart.tax_total.cents,
+ product_data: {name: "Taxes"}
+ }}]
+ end
end
end
diff --git a/spec/furniture/marketplace/cart_spec.rb b/spec/furniture/marketplace/cart_spec.rb
index be9e639fe..8a31f9de0 100644
--- a/spec/furniture/marketplace/cart_spec.rb
+++ b/spec/furniture/marketplace/cart_spec.rb
@@ -15,19 +15,20 @@
let(:marketplace) { create(:marketplace, delivery_fee_cents: 1200) }
let(:cart) { create(:marketplace_cart, marketplace: marketplace) }
let(:product_a) { create(:marketplace_product, marketplace: cart.marketplace) }
- let(:product_b) { create(:marketplace_product, marketplace: cart.marketplace) }
+ let(:product_b) { create(:marketplace_product, marketplace: cart.marketplace, tax_rate_ids: [sales_tax.id]) }
+ let(:sales_tax) { create(:marketplace_tax_rate, marketplace: cart.marketplace, tax_rate: 5.0) }
before do
cart.cart_products.create!(product: product_a, quantity: 1)
cart.cart_products.create!(product: product_b, quantity: 2)
end
- it { is_expected.to eql(product_a.price + product_b.price * 2) }
+ it { is_expected.to eql(product_a.price + product_b.price * 2 + (product_b.price * 2 * 0.05)) }
context "when the #delivery_address is present" do
let(:cart) { create(:marketplace_cart, delivery_address: "123", marketplace: marketplace) }
- it { is_expected.to eql(product_a.price + product_b.price * 2 + marketplace.delivery_fee) }
+ it { is_expected.to eql(product_a.price + product_b.price * 2 + marketplace.delivery_fee + (product_b.price * 2 * 0.05)) }
end
end
@@ -35,6 +36,7 @@
subject(:product_total) { cart.product_total }
let(:cart) { create(:marketplace_cart) }
+
let(:product_a) { create(:marketplace_product, marketplace: cart.marketplace) }
let(:product_b) { create(:marketplace_product, marketplace: cart.marketplace) }
@@ -45,4 +47,20 @@
it { is_expected.to eql(product_a.price * 3 + product_b.price * 2) }
end
+
+ describe "#taxes_total" do
+ subject(:tax_total) { cart.tax_total }
+
+ let(:cart) { create(:marketplace_cart) }
+ let(:product_a) { create(:marketplace_product, marketplace: cart.marketplace) }
+ let(:product_b) { create(:marketplace_product, marketplace: cart.marketplace, tax_rate_ids: [sales_tax.id]) }
+ let(:sales_tax) { create(:marketplace_tax_rate, marketplace: cart.marketplace, tax_rate: 5.0) }
+
+ before do
+ cart.cart_products.create!(product: product_a, quantity: 3)
+ cart.cart_products.create!(product: product_b, quantity: 1)
+ end
+
+ it { is_expected.to eql(product_b.price * 0.05) }
+ end
end