diff --git a/app/controllers/admin/order_cycles_controller.rb b/app/controllers/admin/order_cycles_controller.rb index ee253561fb..e847a96076 100644 --- a/app/controllers/admin/order_cycles_controller.rb +++ b/app/controllers/admin/order_cycles_controller.rb @@ -11,6 +11,8 @@ module Admin before_filter :remove_unauthorized_bulk_attrs, only: [:bulk_update] before_filter :check_editable_schedule_ids, only: [:create, :update] around_filter :protect_invalid_destroy, only: :destroy + create.after :sync_standing_orders + update.after :sync_standing_orders def index respond_to do |format| @@ -45,7 +47,7 @@ module Admin respond_to do |format| if @order_cycle.save OpenFoodNetwork::OrderCycleFormApplicator.new(@order_cycle, spree_current_user).go! - + invoke_callbacks(:create, :after) flash[:notice] = I18n.t(:order_cycles_create_notice) format.html { redirect_to admin_order_cycles_path } format.json { render :json => {:success => true} } @@ -65,6 +67,7 @@ module Admin # Only update apply exchange information if it is actually submmitted OpenFoodNetwork::OrderCycleFormApplicator.new(@order_cycle, spree_current_user).go! end + invoke_callbacks(:update, :after) flash[:notice] = I18n.t(:order_cycles_update_notice) if params[:reloading] == '1' format.html { redirect_to main_app.edit_admin_order_cycle_path(@order_cycle) } format.json { render :json => {:success => true} } @@ -186,14 +189,25 @@ module Admin def check_editable_schedule_ids return unless params[:order_cycle][:schedule_ids] requested = params[:order_cycle][:schedule_ids].map(&:to_i) - existing = @order_cycle.schedule_ids - permitted = Schedule.where(id: requested | existing).merge(OpenFoodNetwork::Permissions.new(spree_current_user).editable_schedules).pluck(:id) - result = existing + @existing_schedule_ids = @order_cycle.persisted? ? @order_cycle.schedule_ids : [] + permitted = Schedule.where(id: requested | @existing_schedule_ids).merge(OpenFoodNetwork::Permissions.new(spree_current_user).editable_schedules).pluck(:id) + result = @existing_schedule_ids result |= (requested & permitted) # add any requested & permitted ids result -= ((result & permitted) - requested) # remove any existing and permitted ids that were not specifically requested params[:order_cycle][:schedule_ids] = result end + def sync_standing_orders + return unless params[:order_cycle][:schedule_ids] + removed_ids = @existing_schedule_ids - @order_cycle.schedule_ids + new_ids = @order_cycle.schedule_ids - @existing_schedule_ids + if removed_ids.any? || new_ids.any? + Schedule.where(id: removed_ids + new_ids).each do |schedule| + Delayed::Job.enqueue StandingOrderSyncJob.new(schedule) + end + end + end + def ams_prefix_whitelist [:basic, :index] end diff --git a/spec/controllers/admin/order_cycles_controller_spec.rb b/spec/controllers/admin/order_cycles_controller_spec.rb index e80e89dcc1..3c7dd0ae28 100644 --- a/spec/controllers/admin/order_cycles_controller_spec.rb +++ b/spec/controllers/admin/order_cycles_controller_spec.rb @@ -188,6 +188,18 @@ module Admin # coordinated_order_cycle is removed, uncoordinated_order_cycle is NOT added expect(coordinated_order_cycle.reload.schedules).to_not include coordinated_schedule, uncoordinated_schedule end + + it "enqueues a StandingOrderSyncJob when schedule_ids change" do + expect do + spree_put :update, format: :json, id: coordinated_order_cycle.id, order_cycle: { schedule_ids: [coordinated_schedule.id, coordinated_schedule2.id] } + end.to enqueue_job StandingOrderSyncJob + expect do + spree_put :update, format: :json, id: coordinated_order_cycle.id, order_cycle: { schedule_ids: [coordinated_schedule.id] } + end.to enqueue_job StandingOrderSyncJob + expect do + spree_put :update, format: :json, id: coordinated_order_cycle.id, order_cycle: { schedule_ids: [coordinated_schedule.id] } + end.to_not enqueue_job StandingOrderSyncJob + end end end