diff --git a/app/controllers/items_controller.rb b/app/controllers/items_controller.rb
index c87e608e92..2dec08ba32 100644
--- a/app/controllers/items_controller.rb
+++ b/app/controllers/items_controller.rb
@@ -73,18 +73,18 @@ def show
def update
@item = current_organization.items.find(params[:id])
- @item.attributes = item_params
deactivated = @item.active_changed? && !@item.active
if deactivated && !@item.can_deactivate?
flash.now[:error] = "Can't deactivate this item - it is currently assigned to either an active kit or a storage location!"
render action: :edit
return
end
+ result = ItemUpdateService.new(item: @item, params: item_params, request_unit_ids: request_unit_ids).call
- if update_item
+ if result.success?
redirect_to items_path, notice: "#{@item.name} updated!"
else
- flash.now[:error] = "Something didn't work quite right -- try again? #{@item.errors.map { |error| "#{error.attribute}: #{error.message}" }}"
+ flash.now[:error] = result.error.record.errors.full_messages.to_sentence
render action: :edit
end
end
@@ -185,27 +185,6 @@ def request_unit_ids
params.require(:item).permit(request_unit_ids: []).fetch(:request_unit_ids, [])
end
- # We need to update both the item and the request_units together and fail together
- def update_item
- if Flipper.enabled?(:enable_packs)
- update_item_and_request_units
- else
- @item.save
- end
- end
-
- def update_item_and_request_units
- begin
- Item.transaction do
- @item.save!
- @item.sync_request_units!(request_unit_ids)
- end
- rescue
- return false
- end
- true
- end
-
helper_method \
def filter_params(_parameters = nil)
return {} unless params.key?(:filters)
diff --git a/app/services/item_update_service.rb b/app/services/item_update_service.rb
new file mode 100644
index 0000000000..a99047073d
--- /dev/null
+++ b/app/services/item_update_service.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+class ItemUpdateService
+ attr_reader :item, :params, :request_unit_ids
+ def initialize(item:, params:, request_unit_ids: [])
+ @item = item
+ @request_unit_ids = request_unit_ids
+ @params = params
+ end
+
+ def call
+ ActiveRecord::Base.transaction do
+ item.update!(params)
+ update_kit_value
+ if Flipper.enabled?(:enable_packs)
+ item.sync_request_units!(request_unit_ids)
+ end
+ end
+ Result.new(value: item)
+ rescue => e
+ Result.new(error: e)
+ end
+
+ private
+
+ def update_kit_value
+ return unless item.kit
+
+ kit_value_in_cents = item.kit.items.reduce(0) do |sum, i|
+ sum + i.value_in_cents.to_i * item.kit.line_items.find_by(item_id: i.id).quantity.to_i
+ end
+ item.kit.update!(value_in_cents: kit_value_in_cents)
+ end
+end
diff --git a/app/services/kit_create_service.rb b/app/services/kit_create_service.rb
index 7884d5d61c..397b529714 100644
--- a/app/services/kit_create_service.rb
+++ b/app/services/kit_create_service.rb
@@ -43,6 +43,11 @@ def call
unless item_creation_result.success?
raise item_creation_result.error
end
+ kit.items.update_all(visible_to_partners: kit.visible_to_partners)
+ kit_value_in_cents = kit.items.reduce(0) do |sum, i|
+ sum + i.value_in_cents.to_i * kit.line_items.find_by(item_id: i.id).quantity.to_i
+ end
+ kit.update!(value_in_cents: kit_value_in_cents)
rescue StandardError => e
errors.add(:base, e.message)
raise ActiveRecord::Rollback
diff --git a/app/views/items/_form.html.erb b/app/views/items/_form.html.erb
index 874d9c0933..8b44b3e71d 100644
--- a/app/views/items/_form.html.erb
+++ b/app/views/items/_form.html.erb
@@ -22,25 +22,25 @@
<%= f.input :reporting_category, label: 'NDBN Reporting Category', collection: Item.reporting_categories_for_select, disabled: !!@item.kit_id, required: !@item.kit_id, hint: @reporting_category_hint %>
- <%= f.input :name, label: "Value per item", wrapper: :input_group do %>
+ <%= f.input :value_in_dollars, label: "Value per item", wrapper: :input_group do %>
<%= f.input_field :value_in_dollars, class: "form-control" %>
<% end %>
- <%= f.input :name, label: "Quantity Per Individual", wrapper: :input_group do %>
+ <%= f.input :distribution_quantity, label: "Quantity Per Individual", wrapper: :input_group do %>
<%= f.input_field :distribution_quantity, class: "form-control" %>
<% end %>
<% if current_user.has_cached_role?(Role::ORG_ADMIN, current_organization) %>
- <%= f.input :name, label: "On hand minimum quantity", wrapper: :input_group do %>
+ <%= f.input :on_hand_minimum_quantity, label: "On hand minimum quantity", wrapper: :input_group do %>
<%= f.input_field :on_hand_minimum_quantity, input_html: {value: 0}, class: "form-control" %>
<% end %>
- <%= f.input :name, label: "On hand recommended quantity", wrapper: :input_group do %>
+ <%= f.input :on_hand_recommended_quantity, label: "On hand recommended quantity", wrapper: :input_group do %>
<%= f.input_field :on_hand_recommended_quantity, class: "form-control" %>
<% end %>
<% end %>
- <%= f.input :name, label: "Package size", wrapper: :input_group do %>
+ <%= f.input :package_size, label: "Package size", wrapper: :input_group do %>
<%= f.input_field :package_size, class: "form-control", min: 0 %>
<% end %>
@@ -50,7 +50,7 @@
<% end %>
<% end %>
- <%= f.input :visible, label: "Item is Visible to Partners?", wrapper: :input_group do %>
+ <%= f.input :visible_to_partners, label: "Item is Visible to Partners?", wrapper: :input_group do %>
<%= f.check_box :visible_to_partners, {class: "input-group-text", id: "visible_to_partners"}, "true", "false" %>
<% end %>
diff --git a/app/views/kits/_form.html.erb b/app/views/kits/_form.html.erb
index 3c1acb8320..abe2761c79 100644
--- a/app/views/kits/_form.html.erb
+++ b/app/views/kits/_form.html.erb
@@ -14,11 +14,6 @@
<%= f.check_box :visible_to_partners, {class: "input-group-text", id: "visible_to_partners"}, "true", "false" %>
<% end %>
- <%= f.input :value_in_cents, label: "Value for kit", wrapper: :input_group do %>
-
- <%= f.input_field :value_in_dollars, class: "form-control", min: 0 %>
- <% end %>
-