mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-02-27 01:43:22 +00:00
Remove validations checking order cycle has shipping methods
Instead we will make sure the order cycle is not available on the shopfront if it is doesn't have valid shipping methods. This will preven the issue where if one distributor deletes their shipping method, we don't want to invalidate the order cycle for all other distributors. Co-authored-by: Maikel <maikel@email.org.au>
This commit is contained in:
committed by
Filipe
parent
81730f725d
commit
f4a4f7c9ff
@@ -15,12 +15,8 @@ class BaseController < ApplicationController
|
||||
|
||||
private
|
||||
|
||||
def all_distributor_order_cycles_invalid?
|
||||
OrderCycle.with_distributor(@distributor).active.all?(&:invalid?)
|
||||
end
|
||||
|
||||
def set_order_cycles
|
||||
if !@distributor.ready_for_checkout? || all_distributor_order_cycles_invalid?
|
||||
if !@distributor.ready_for_checkout?
|
||||
@order_cycles = OrderCycle.where('false')
|
||||
return
|
||||
end
|
||||
|
||||
@@ -36,8 +36,6 @@ class OrderCycle < ApplicationRecord
|
||||
after_save :sync_subscriptions, if: :opening?
|
||||
|
||||
validates :name, :coordinator_id, presence: true
|
||||
validate :at_least_one_shipping_method_selected_for_each_distributor
|
||||
validate :no_invalid_order_cycle_shipping_methods
|
||||
validate :orders_close_at_after_orders_open_at?
|
||||
|
||||
preference :product_selection_from_coordinator_inventory_only, :boolean, default: false
|
||||
@@ -309,30 +307,6 @@ class OrderCycle < ApplicationRecord
|
||||
|
||||
private
|
||||
|
||||
def all_distributors_have_at_least_one_shipping_method?
|
||||
distributors.all? do |distributor|
|
||||
(distributor.shipping_method_ids & selected_shipping_method_ids).any?
|
||||
end
|
||||
end
|
||||
|
||||
def at_least_one_shipping_method_selected_for_each_distributor
|
||||
return if selected_shipping_methods.none? ||
|
||||
coordinator.nil? ||
|
||||
simple? ||
|
||||
all_distributors_have_at_least_one_shipping_method?
|
||||
|
||||
errors.add(:base, :at_least_one_shipping_method_per_distributor)
|
||||
end
|
||||
|
||||
def no_invalid_order_cycle_shipping_methods
|
||||
return if order_cycle_shipping_methods.all?(&:valid?)
|
||||
|
||||
errors.add(
|
||||
:base,
|
||||
order_cycle_shipping_methods.map(&:errors).map(&:to_a).flatten.uniq.to_sentence
|
||||
)
|
||||
end
|
||||
|
||||
def opening?
|
||||
(open? || upcoming?) && saved_change_to_orders_close_at? && was_closed?
|
||||
end
|
||||
|
||||
@@ -20,64 +20,6 @@ describe OrderCycle do
|
||||
expect(oc).to_not be_valid
|
||||
end
|
||||
|
||||
describe "#at_least_one_shipping_method_selected_for_each_distributor" do
|
||||
context "distributor order cycle i.e. :sells is 'any'" do
|
||||
context "when multiple distributors have been added to the order cycle already" do
|
||||
it "is valid when adding a shipping method for *all* distributors" do
|
||||
distributor_i = create(:distributor_enterprise)
|
||||
distributor_ii = create(:distributor_enterprise)
|
||||
distributor_i_shipping_method = create(:shipping_method, distributors: [distributor_i])
|
||||
distributor_ii_shipping_method = create(:shipping_method, distributors: [distributor_ii])
|
||||
order_cycle = create(:distributor_order_cycle,
|
||||
distributors: [distributor_i, distributor_ii])
|
||||
|
||||
order_cycle.selected_shipping_method_ids = [
|
||||
distributor_i_shipping_method.id,
|
||||
distributor_ii_shipping_method.id
|
||||
]
|
||||
|
||||
expect(order_cycle).to be_valid
|
||||
end
|
||||
end
|
||||
|
||||
it "is not valid when adding a shipping method for *some but not all* distributors" do
|
||||
distributor_i = create(:distributor_enterprise)
|
||||
distributor_ii = create(:distributor_enterprise)
|
||||
distributor_i_shipping_method = create(:shipping_method, distributors: [distributor_i])
|
||||
distributor_ii_shipping_method = create(:shipping_method, distributors: [distributor_i])
|
||||
order_cycle = create(:distributor_order_cycle, distributors: [distributor_i, distributor_ii])
|
||||
|
||||
order_cycle.selected_shipping_method_ids = [distributor_i_shipping_method.id]
|
||||
|
||||
expect(order_cycle).to be_invalid
|
||||
expect(order_cycle.errors.to_a).to eq [
|
||||
"You need to select at least one shipping method for each distributor"
|
||||
]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "#no_invalid_order_cycle_shipping_methods" do
|
||||
context "when a order cycle shipping method is not valid" do
|
||||
it "adds a validation error,
|
||||
and it is more meaningful than the default 'Order cycle shipping methods is invalid'" do
|
||||
shipping_method = create(:shipping_method)
|
||||
distributor = create(:distributor_enterprise, shipping_methods: [shipping_method])
|
||||
order_cycle = create(:distributor_order_cycle, distributors: [distributor])
|
||||
order_cycle.selected_shipping_methods << shipping_method
|
||||
|
||||
shipping_method.update_column(:display_on, "back_end")
|
||||
|
||||
expect(order_cycle).to be_invalid
|
||||
expect(order_cycle.errors.to_a).to eq ["Shipping method must be available at checkout"]
|
||||
|
||||
shipping_method.update_column(:display_on, "")
|
||||
|
||||
expect(order_cycle.reload).to be_valid
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it "has a coordinator and associated fees" do
|
||||
oc = create(:simple_order_cycle)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user