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..f6e479bcd 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 @@ -56,5 +56,16 @@ def stripe_line_items }} ] end + + private def stripe_taxes_line_items + [{ + quantity: 1, + pice_data: { + currency: "USD", + unit_amount: cart.tax_total, + 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