diff --git a/app/furniture/marketplace/cart.rb b/app/furniture/marketplace/cart.rb
index 2f974594a..10178fb3e 100644
--- a/app/furniture/marketplace/cart.rb
+++ b/app/furniture/marketplace/cart.rb
@@ -26,7 +26,11 @@ def product_total
end
end
- delegate :delivery_fee, to: :marketplace
+ def delivery_fee
+ return marketplace.delivery_fee if delivery_address.present?
+
+ 0
+ end
def price_total
product_total + delivery_fee
diff --git a/app/furniture/marketplace/cart_policy.rb b/app/furniture/marketplace/cart_policy.rb
new file mode 100644
index 000000000..fa400707c
--- /dev/null
+++ b/app/furniture/marketplace/cart_policy.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class Marketplace
+ class CartPolicy < ApplicationPolicy
+ alias_method :cart, :object
+ def permitted_attributes(_params = nil)
+ %i[delivery_address]
+ end
+
+ def create?
+ true
+ end
+
+ def update?
+ cart.shopper.person == current_person
+ end
+
+ class Scope < ApplicationScope
+ def resolve
+ scope.all
+ end
+ end
+ end
+end
diff --git a/app/furniture/marketplace/carts/_cart.html.erb b/app/furniture/marketplace/carts/_cart.html.erb
index 7a216ae34..5134a6c31 100644
--- a/app/furniture/marketplace/carts/_cart.html.erb
+++ b/app/furniture/marketplace/carts/_cart.html.erb
@@ -1,24 +1,44 @@
-
-
-
-
-
- <%= Marketplace::Product.human_attribute_name(:name) %>
- |
-
- <%= Marketplace::Product.human_attribute_name(:description) %>
- |
-
- <%= Marketplace::Product.human_attribute_name(:price) %>
- |
- |
-
-
-
- <%- cart.marketplace.products.each do |product| %>
- <%= render cart.cart_products.find_or_initialize_by(product: product) %>
- <%- end %>
-
- <%= render "marketplace/carts/footer", cart: cart %>
-
+
+
+ <%- if cart.delivery_address.blank? %>
+ <%= form_with model: cart.location do |cart_form| %>
+ <%= render "text_field", attribute: :delivery_address, form: cart_form %>
+
+ <%= cart_form.submit %>
+ <%- end %>
+ <%- else %>
+
+
+ Delivering to <%= cart.delivery_address %>
+
+
+ <%= button_to "Change Address", cart.location, params: { cart: { delivery_address: nil } }%>
+
+
+ <%- end %>
+
+
+
+
+
+
+ <%= Marketplace::Product.human_attribute_name(:name) %>
+ |
+
+ <%= Marketplace::Product.human_attribute_name(:description) %>
+ |
+
+ <%= Marketplace::Product.human_attribute_name(:price) %>
+ |
+ |
+
+
+
+ <%- cart.marketplace.products.each do |product| %>
+ <%= render cart.cart_products.find_or_initialize_by(product: product) %>
+ <%- end %>
+
+ <%= render "marketplace/carts/footer", cart: cart %>
+
+
diff --git a/app/furniture/marketplace/carts/_footer.html.erb b/app/furniture/marketplace/carts/_footer.html.erb
index 29873d7e2..fa4228cf4 100644
--- a/app/furniture/marketplace/carts/_footer.html.erb
+++ b/app/furniture/marketplace/carts/_footer.html.erb
@@ -8,8 +8,9 @@
<%= render "marketplace/carts/total", cart: cart %>
- <%= button_to("Checkout", cart.location(child: :checkout), data: { turbo: false }) %>
+ <%- if cart.delivery_address.present? %>
+ <%= button_to("Checkout", cart.location(child: :checkout), data: { turbo: false }) %>
+ <%- end %>
|
-
diff --git a/app/furniture/marketplace/carts/_total.html.erb b/app/furniture/marketplace/carts/_total.html.erb
index a9a12bc18..a45ecdbbb 100644
--- a/app/furniture/marketplace/carts/_total.html.erb
+++ b/app/furniture/marketplace/carts/_total.html.erb
@@ -1,10 +1,12 @@
-
-
+
+
Products:
<%= humanized_money_with_symbol(cart.product_total) %>
- Delivery:
- <%= humanized_money_with_symbol(cart.delivery_fee) %>
-
+ <%- if cart.delivery_address.present? %>
+ Delivery:
+ <%= humanized_money_with_symbol(cart.delivery_fee) %>
+ <%- end %>
+
Total: <%= humanized_money_with_symbol(cart.price_total) %>
diff --git a/app/furniture/marketplace/carts_controller.rb b/app/furniture/marketplace/carts_controller.rb
new file mode 100644
index 000000000..ade14108a
--- /dev/null
+++ b/app/furniture/marketplace/carts_controller.rb
@@ -0,0 +1,24 @@
+class Marketplace
+ class CartsController < Controller
+ def update
+ authorize(cart)
+ cart.update(cart_params)
+ respond_to do |format|
+ format.html do
+ redirect_to cart.room.location
+ end
+ format.turbo_stream do
+ render turbo_stream: [turbo_stream.replace(dom_id(cart), cart)]
+ end
+ end
+ end
+
+ def cart
+ policy_scope(marketplace.carts).find(params[:id])
+ end
+
+ def cart_params
+ policy(Cart).permit(params.require(:cart))
+ end
+ end
+end
diff --git a/app/furniture/marketplace/checkout.rb b/app/furniture/marketplace/checkout.rb
index 8a59e435c..7eae2a884 100644
--- a/app/furniture/marketplace/checkout.rb
+++ b/app/furniture/marketplace/checkout.rb
@@ -16,9 +16,6 @@ def create_stripe_session(success_url:, cancel_url:)
mode: "payment",
success_url: success_url,
cancel_url: cancel_url,
- shipping_address_collection: {
- allowed_countries: ["US"],
- },
payment_intent_data: {
transfer_group: cart.id
}
diff --git a/spec/furniture/marketplace/cart_spec.rb b/spec/furniture/marketplace/cart_spec.rb
index e2021660a..e9572634e 100644
--- a/spec/furniture/marketplace/cart_spec.rb
+++ b/spec/furniture/marketplace/cart_spec.rb
@@ -22,7 +22,13 @@
cart.cart_products.create!(product: product_b, quantity: 2)
end
- it { is_expected.to eql(product_a.price + product_b.price + product_b.price + marketplace.delivery_fee) }
+ it { is_expected.to eql(product_a.price + product_b.price * 2) }
+
+ 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 + product_b.price + marketplace.delivery_fee) }
+ end
end
describe "#product_total" do
diff --git a/spec/furniture/marketplace/carts_controller_request_spec.rb b/spec/furniture/marketplace/carts_controller_request_spec.rb
new file mode 100644
index 000000000..bcf6f486f
--- /dev/null
+++ b/spec/furniture/marketplace/carts_controller_request_spec.rb
@@ -0,0 +1,21 @@
+require "rails_helper"
+
+RSpec.describe Marketplace::CartsController, type: :request do
+ let(:marketplace) { create(:marketplace) }
+ let(:space) { marketplace.space }
+ let(:room) { marketplace.room }
+ let(:person) { create(:person) }
+
+ let(:shopper) { create(:marketplace_shopper, person: person) }
+
+ describe "#update" do
+ it "changes the delivery address" do
+ cart = create(:marketplace_cart, marketplace: marketplace, shopper: shopper)
+ sign_in(space, person)
+
+ put polymorphic_path(cart.location), params: {cart: {delivery_address: "123 N West St"}}
+
+ expect(response).to redirect_to(room.location)
+ end
+ end
+end