diff --git a/rails_application/app/read_models/client_orders/configuration.rb b/rails_application/app/read_models/client_orders/configuration.rb
index 9cd8f903..43dbebda 100644
--- a/rails_application/app/read_models/client_orders/configuration.rb
+++ b/rails_application/app/read_models/client_orders/configuration.rb
@@ -30,10 +30,6 @@ def value
class Product < ApplicationRecord
self.table_name = "client_order_products"
-
- def unavailable?
- available && available <= 0
- end
end
class Configuration
diff --git a/rails_application/app/read_models/client_orders/update_product_availability.rb b/rails_application/app/read_models/client_orders/update_product_availability.rb
index 4fdc5fd6..a3554630 100644
--- a/rails_application/app/read_models/client_orders/update_product_availability.rb
+++ b/rails_application/app/read_models/client_orders/update_product_availability.rb
@@ -1,7 +1,10 @@
module ClientOrders
class UpdateProductAvailability
def call(event)
- Product.find_by(uid: event.data.fetch(:product_id)).update(available: event.data.fetch(:available))
+ product = Product.find_by(uid: event.data.fetch(:product_id))
+ available = event.data.fetch(:available)
+
+ product.update(available: available.positive?)
end
end
end
diff --git a/rails_application/app/views/client/orders/edit.html.erb b/rails_application/app/views/client/orders/edit.html.erb
index 0751dc48..0ef9f3d3 100644
--- a/rails_application/app/views/client/orders/edit.html.erb
+++ b/rails_application/app/views/client/orders/edit.html.erb
@@ -16,7 +16,7 @@
<% order_line = @order_lines&.find{|order_line| order_line.product_id == product.uid} %>
<%= product.name %> |
- <% if product.unavailable? %>
+ <% unless product.available? %>
out of stock
<% end %>
|
diff --git a/rails_application/app/views/orders/edit.html.erb b/rails_application/app/views/orders/edit.html.erb
index 0352d6f4..cb9e4c5b 100644
--- a/rails_application/app/views/orders/edit.html.erb
+++ b/rails_application/app/views/orders/edit.html.erb
@@ -30,7 +30,7 @@
Product |
- |
+ Stock |
Quantity |
Price |
Value |
@@ -43,9 +43,7 @@
<% order_line = @order_lines.find{|order_line| order_line.product_id == product.id} %>
<%= product.name %> |
- <% if product.unavailable? %>
- out of stock
- <% end %>
+ <%= product.available || "-" %>
|
"><%= order_line.try(&:quantity) || 0 %> |
<%= number_to_currency(product.price) %> |
diff --git a/rails_application/db/migrate/20240827090619_add_available_to_client_order_products.rb b/rails_application/db/migrate/20240827090619_add_available_to_client_order_products.rb
index 66ce91e7..df1eb5bd 100644
--- a/rails_application/db/migrate/20240827090619_add_available_to_client_order_products.rb
+++ b/rails_application/db/migrate/20240827090619_add_available_to_client_order_products.rb
@@ -1,5 +1,5 @@
class AddAvailableToClientOrderProducts < ActiveRecord::Migration[7.2]
def change
- add_column :client_order_products, :available, :integer
+ add_column :client_order_products, :available, :boolean, default: true
end
end
diff --git a/rails_application/db/schema.rb b/rails_application/db/schema.rb
index 941de168..99d056d9 100644
--- a/rails_application/db/schema.rb
+++ b/rails_application/db/schema.rb
@@ -46,7 +46,7 @@
t.uuid "uid", null: false
t.string "name"
t.decimal "price", precision: 8, scale: 2
- t.integer "available"
+ t.boolean "available", default: true
end
create_table "client_orders", force: :cascade do |t|
diff --git a/rails_application/test/client_orders/product_test.rb b/rails_application/test/client_orders/product_test.rb
deleted file mode 100644
index 448ddbb0..00000000
--- a/rails_application/test/client_orders/product_test.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-require "test_helper"
-
-module ClientOrders
- class ProductTest < InMemoryTestCase
- cover "ClientOrders*"
-
- def test_unavailable
- product = Product.new(available: nil)
- refute product.unavailable?
-
- product = Product.new(available: 0)
- assert product.unavailable?
-
- product = Product.new(available: 1)
- refute product.unavailable?
-
- product = Product.new(available: -1)
- assert product.unavailable?
- end
- end
-end
diff --git a/rails_application/test/client_orders/update_product_availability_test.rb b/rails_application/test/client_orders/update_product_availability_test.rb
index 40993ebb..16f072e1 100644
--- a/rails_application/test/client_orders/update_product_availability_test.rb
+++ b/rails_application/test/client_orders/update_product_availability_test.rb
@@ -8,10 +8,19 @@ def test_reflects_change
product_id = prepare_product
other_product_id = prepare_product
- supply_product(product_id, 5)
+ assert_changes("Product.find_by_uid(product_id).available?", from: true, to: false) do
+ UpdateProductAvailability.new.call(availability_changed_event(product_id, -1))
+ end
- assert_equal 5, Product.find_by_uid(product_id).available
- assert_nil Product.find_by_uid(other_product_id).available
+ assert_changes("Product.find_by_uid(product_id).available?", from: false, to: true) do
+ UpdateProductAvailability.new.call(availability_changed_event(product_id, 10))
+ end
+
+ assert_changes("Product.find_by_uid(product_id).available?", from: true, to: false) do
+ UpdateProductAvailability.new.call(availability_changed_event(product_id, 0))
+ end
+
+ assert Product.find_by_uid(other_product_id).available?
end
private
@@ -37,5 +46,9 @@ def prepare_product
def supply_product(product_id, quantity)
run_command(Inventory::Supply.new(product_id: product_id, quantity: quantity))
end
+
+ def availability_changed_event(product_id, available)
+ Inventory::AvailabilityChanged.new(data: { product_id: product_id, available: available })
+ end
end
end
diff --git a/rails_application/test/integration/orders_test.rb b/rails_application/test/integration/orders_test.rb
index c9b8f472..1c231e1f 100644
--- a/rails_application/test/integration/orders_test.rb
+++ b/rails_application/test/integration/orders_test.rb
@@ -229,7 +229,7 @@ def test_shows_out_of_stock_badge
get "/orders/new"
follow_redirect!
- assert_select "td span", text: "out of stock", count: 0
+ assert_select "td span", "1"
post "/orders/#{order_id}/add_item?product_id=#{async_remote_id}"
post "/orders",
@@ -243,7 +243,7 @@ def test_shows_out_of_stock_badge
get "/orders/new"
follow_redirect!
- assert_select "td span", "out of stock"
+ assert_select "td span", "0"
end
private