mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
We changed to tracking stock of on-demand items to be able to place backorders. This is mostly hidden in the app but was still visible on the inventory page. Now we are hiding that here, too.
124 lines
3.8 KiB
Ruby
124 lines
3.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'open_food_network/spree_api_key_loader'
|
|
|
|
module Admin
|
|
class VariantOverridesController < Admin::ResourceController
|
|
include OpenFoodNetwork::SpreeApiKeyLoader
|
|
include EnterprisesHelper
|
|
|
|
prepend_before_action :load_data
|
|
before_action :load_collection, only: [:bulk_update]
|
|
before_action :load_spree_api_key, only: :index
|
|
|
|
def index; end
|
|
|
|
def bulk_update
|
|
# Ensure we're authorised to update all variant overrides
|
|
@vo_set.collection.each { |vo| authorize! :update, vo }
|
|
|
|
if @vo_set.save
|
|
# Return saved VOs with IDs
|
|
render json: @vo_set.collection, each_serializer: Api::Admin::VariantOverrideSerializer
|
|
elsif @vo_set.errors.present?
|
|
render json: { errors: @vo_set.errors }, status: :bad_request
|
|
else
|
|
render body: nil, status: :internal_server_error
|
|
end
|
|
end
|
|
|
|
def bulk_reset
|
|
# Ensure we're authorised to update all variant overrides.
|
|
@collection.each { |vo| authorize! :bulk_reset, vo }
|
|
@collection.each(&:reset_stock!)
|
|
|
|
if collection_errors.present?
|
|
render json: { errors: collection_errors }, status: :bad_request
|
|
else
|
|
render json: @collection, each_serializer: Api::Admin::VariantOverrideSerializer
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def load_data
|
|
@hubs = OpenFoodNetwork::Permissions.new(spree_current_user).
|
|
variant_override_hubs.by_name
|
|
|
|
# Used in JS to look up the name of the producer of each product
|
|
@producers = OpenFoodNetwork::Permissions.new(spree_current_user).
|
|
variant_override_producers
|
|
|
|
@hub_permissions = OpenFoodNetwork::Permissions.new(spree_current_user).
|
|
variant_override_enterprises_per_hub
|
|
|
|
@inventory_items = InventoryItem.where(enterprise_id: @hubs)
|
|
@import_dates = inventory_import_dates.uniq.to_json
|
|
end
|
|
|
|
def inventory_import_dates
|
|
import_dates = VariantOverride.
|
|
distinct_import_dates.
|
|
for_hubs(editable_enterprises.collect(&:id))
|
|
|
|
options = [{ id: '0', name: 'All' }]
|
|
import_dates.collect(&:import_date).map { |i|
|
|
options.push(id: i.to_date, name: i.to_date.to_fs(:long))
|
|
}
|
|
|
|
options
|
|
end
|
|
|
|
def load_collection
|
|
collection_hash = Hash[variant_overrides_params.each_with_index.map { |vo, i| [i, vo] }]
|
|
|
|
# Reset count_on_hand when switching to producer settings:
|
|
collection_hash.each_value do |vo|
|
|
vo["count_on_hand"] = nil if vo.fetch("on_demand", :unchanged).nil?
|
|
end
|
|
|
|
@vo_set = Sets::VariantOverrideSet.new(@variant_overrides,
|
|
collection_attributes: collection_hash)
|
|
end
|
|
|
|
def collection
|
|
@variant_overrides = VariantOverride.
|
|
includes(:taggings).
|
|
joins(variant: :product).
|
|
preload(variant: :product).
|
|
for_hubs(params[:hub_id] || @hubs)
|
|
|
|
return @variant_overrides unless params.key?(:variant_overrides)
|
|
|
|
@variant_overrides.where(id: modified_variant_overrides_ids)
|
|
end
|
|
|
|
def modified_variant_overrides_ids
|
|
variant_overrides_params.pluck(:id)
|
|
end
|
|
|
|
def collection_actions
|
|
[:index, :bulk_update, :bulk_reset]
|
|
end
|
|
|
|
# This method is also present in ModelSet
|
|
# This is useful for compiling a list of errors on any generic collection
|
|
def collection_errors
|
|
errors = ActiveModel::Errors.new self
|
|
full_messages = @collection.map { |element| element.errors.full_messages }.flatten
|
|
full_messages.each { |fm| errors.add(:base, fm) }
|
|
errors
|
|
end
|
|
|
|
def variant_overrides_params
|
|
params.permit(
|
|
variant_overrides: [
|
|
:id, :variant_id, :hub_id,
|
|
:price, :count_on_hand, :sku, :on_demand,
|
|
:default_stock, :resettable, :tag_list
|
|
]
|
|
).to_h[:variant_overrides]
|
|
end
|
|
end
|
|
end
|