diff --git a/app/furniture/marketplace.rb b/app/furniture/marketplace.rb index 2cdbd1d60..bb84d432b 100644 --- a/app/furniture/marketplace.rb +++ b/app/furniture/marketplace.rb @@ -8,6 +8,7 @@ def self.append_routes(router) router.resources :carts do router.resources :cart_products end + router.resources :checkouts end end diff --git a/app/furniture/marketplace/breadcrumbs.rb b/app/furniture/marketplace/breadcrumbs.rb index 62238802f..a1f47e04c 100644 --- a/app/furniture/marketplace/breadcrumbs.rb +++ b/app/furniture/marketplace/breadcrumbs.rb @@ -7,6 +7,11 @@ link 'Marketplace', marketplace.location end +crumb :marketplace_checkout do |checkout| + parent :marketplace, checkout.cart.marketplace + link 'Checkout', url_for([space, room, checkout]) +end + crumb :marketplace_products do |marketplace| parent :marketplace, marketplace link 'Products', marketplace.location(:products) diff --git a/app/furniture/marketplace/cart_products_controller.rb b/app/furniture/marketplace/cart_products_controller.rb index 126cd319b..45e34e0be 100644 --- a/app/furniture/marketplace/cart_products_controller.rb +++ b/app/furniture/marketplace/cart_products_controller.rb @@ -24,6 +24,7 @@ def create turbo_stream.replace("cart-product-#{cart_product.product_id}", cart_product), turbo_stream.replace("cart-footer-#{cart.id}", partial: "marketplace/carts/footer", locals: {cart: cart}), + turbo_stream.replace("cart-total-#{cart.id}", partial: "marketplace/carts/total", locals: {cart: cart}) ] end end @@ -51,7 +52,8 @@ def update turbo_stream.replace("cart-product-#{cart_product.product_id}", cart_product), turbo_stream.replace("cart-footer-#{cart.id}", partial: "marketplace/carts/footer", locals: {cart: cart}), - ] + turbo_stream.replace("cart-total-#{cart.id}", partial: "marketplace/carts/total", locals: {cart: cart}) + ] end end end @@ -77,7 +79,8 @@ def destroy render turbo_stream: [ turbo_stream.replace("cart-product-#{cart_product.product_id}", cart.cart_products.new(product: cart_product.product)), turbo_stream.replace("cart-footer-#{cart.id}", - partial: "marketplace/carts/footer", locals: {cart: cart}) + partial: "marketplace/carts/footer", locals: {cart: cart}), + turbo_stream.replace("cart-total-#{cart.id}", partial: "marketplace/carts/total", locals: {cart: cart}) ] end end diff --git a/app/furniture/marketplace/carts/_footer.html.erb b/app/furniture/marketplace/carts/_footer.html.erb index f6ec0b2a9..38769f0a2 100644 --- a/app/furniture/marketplace/carts/_footer.html.erb +++ b/app/furniture/marketplace/carts/_footer.html.erb @@ -1,9 +1,16 @@ +<% + marketplace = cart.marketplace + room = marketplace.room + space = room.space +%> + + <%= link_to("checkout", new_space_room_marketplace_checkout_path(space, room, marketplace), html_options = {}) %> Total: - <%= humanized_money_with_symbol(cart.price_total) %> + <%= render "marketplace/carts/total", cart: cart %> diff --git a/app/furniture/marketplace/carts/_total.html.erb b/app/furniture/marketplace/carts/_total.html.erb new file mode 100644 index 000000000..d4dd8a6ae --- /dev/null +++ b/app/furniture/marketplace/carts/_total.html.erb @@ -0,0 +1,3 @@ + + <%= humanized_money_with_symbol(cart.price_total) %> + \ No newline at end of file diff --git a/app/furniture/marketplace/checkout_policy.rb b/app/furniture/marketplace/checkout_policy.rb new file mode 100644 index 000000000..0ccb647ab --- /dev/null +++ b/app/furniture/marketplace/checkout_policy.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class Marketplace + class CheckoutPolicy < ApplicationPolicy + alias checkout object + + def create? + checkout.shopper.person == current_person + end + end +end diff --git a/app/furniture/marketplace/checkouts/_checkout.html.erb b/app/furniture/marketplace/checkouts/_checkout.html.erb new file mode 100644 index 000000000..c2430910b --- /dev/null +++ b/app/furniture/marketplace/checkouts/_checkout.html.erb @@ -0,0 +1,30 @@ +
+ + + + + + + + + + + <%= render checkout.cart.cart_products %> + + + + + + + + +
+ <%= Marketplace::Product.human_attribute_name(:name) %> +  
Total: + <%= render "marketplace/carts/total" %> +
+
diff --git a/app/furniture/marketplace/checkouts/new.html.erb b/app/furniture/marketplace/checkouts/new.html.erb new file mode 100644 index 000000000..ab34d526a --- /dev/null +++ b/app/furniture/marketplace/checkouts/new.html.erb @@ -0,0 +1,2 @@ +<%- breadcrumb :marketplace_checkout, checkout%> +<%= render checkout %> \ No newline at end of file diff --git a/app/furniture/marketplace/checkouts_controller.rb b/app/furniture/marketplace/checkouts_controller.rb new file mode 100644 index 000000000..485da8036 --- /dev/null +++ b/app/furniture/marketplace/checkouts_controller.rb @@ -0,0 +1,27 @@ +class Marketplace + class CheckoutsController < FurnitureController + def new + authorize(checkout) + end + + helper_method def checkout + @checkout ||= cart.build_checkout(shopper: shopper) + end + + helper_method def shopper + @shopper ||= if current_person.is_a?(Guest) + Shopper.find_or_create_by(id: session[:current_cart] ||= SecureRandom.uuid) + else + Shopper.find_or_create_by(person: current_person) + end + end + + helper_method def cart + @cart ||= marketplace.carts.find_or_create_by(shopper: shopper) + end + + helper_method def marketplace + @marketplace ||= policy_scope(Marketplace).find(params[:marketplace_id]) + end + end +end diff --git a/spec/furniture/marketplace/checkouts_controller_request_spec.rb b/spec/furniture/marketplace/checkouts_controller_request_spec.rb new file mode 100644 index 000000000..e3f2cacdf --- /dev/null +++ b/spec/furniture/marketplace/checkouts_controller_request_spec.rb @@ -0,0 +1,13 @@ +require "rails_helper" + +RSpec.describe Marketplace::Checkout, type: :request do + let(:marketplace) { create(:marketplace) } + let(:space) { marketplace.space } + let(:room) { marketplace.room } + + describe "#create" do + it "Create Checkout from a Cart" do + # TODO: insert test + end + end +end