mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
@@ -7,5 +7,6 @@ class OrderCycleNotificationJob < ActiveJob::Base
|
||||
order_cycle.suppliers.each do |supplier|
|
||||
ProducerMailer.order_cycle_report(supplier, order_cycle).deliver_now
|
||||
end
|
||||
order_cycle.update_columns mails_sent: true
|
||||
end
|
||||
end
|
||||
|
||||
@@ -151,7 +151,7 @@ class OrderCycle < ApplicationRecord
|
||||
def clone!
|
||||
oc = dup
|
||||
oc.name = I18n.t("models.order_cycle.cloned_order_cycle_name", order_cycle: oc.name)
|
||||
oc.orders_open_at = oc.orders_close_at = nil
|
||||
oc.orders_open_at = oc.orders_close_at = oc.mails_sent = oc.processed_at = nil
|
||||
oc.coordinator_fee_ids = coordinator_fee_ids
|
||||
# rubocop:disable Layout/LineLength
|
||||
oc.preferred_product_selection_from_coordinator_inventory_only = preferred_product_selection_from_coordinator_inventory_only
|
||||
@@ -281,7 +281,9 @@ class OrderCycle < ApplicationRecord
|
||||
|
||||
def reset_processed_at
|
||||
return unless orders_close_at.present? && orders_close_at_was.present?
|
||||
return unless orders_close_at > orders_close_at_was
|
||||
|
||||
self.processed_at = nil if orders_close_at > orders_close_at_was
|
||||
self.processed_at = nil
|
||||
self.mails_sent = false
|
||||
end
|
||||
end
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
- content_for :page_actions do
|
||||
- if can? :notify_producers, @order_cycle
|
||||
%li
|
||||
- processed = @order_cycle.processed_at.present?
|
||||
- mails_sent = @order_cycle.mails_sent?
|
||||
- url = main_app.notify_producers_admin_order_cycle_path
|
||||
- confirm_msg = "#{t('.notify_producers_tip')} #{t(:are_you_sure)}"
|
||||
%a.button.icon-email.with-tip{ href: url, data: { method: 'post', confirm: confirm_msg }, 'data-powertip': t('.notify_producers_tip') }
|
||||
= processed ? t('.re_notify_producers') : t(:notify_producers)
|
||||
- if processed
|
||||
= mails_sent ? t('.re_notify_producers') : t(:notify_producers)
|
||||
- if mails_sent
|
||||
.badge.icon-ok.success
|
||||
|
||||
- content_for :page_title do
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
class AddMailsSentToOrderCycles < ActiveRecord::Migration[6.1]
|
||||
def change
|
||||
add_column :order_cycles, :mails_sent, :boolean, default: false
|
||||
end
|
||||
end
|
||||
12
db/migrate/20220114110920_update_order_cycle_mails.rb
Normal file
12
db/migrate/20220114110920_update_order_cycle_mails.rb
Normal file
@@ -0,0 +1,12 @@
|
||||
class UpdateOrderCycleMails < ActiveRecord::Migration[6.1]
|
||||
class MigrationOrderCycle < ActiveRecord::Base
|
||||
self.table_name = "order_cycles"
|
||||
end
|
||||
|
||||
def up
|
||||
MigrationOrderCycle.
|
||||
where(automatic_notifications: true).
|
||||
where.not(processed_at: nil).
|
||||
update_all(mails_sent: true)
|
||||
end
|
||||
end
|
||||
@@ -10,7 +10,7 @@
|
||||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(version: 2021_12_17_094141) do
|
||||
ActiveRecord::Schema.define(version: 2022_01_14_110920) do
|
||||
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "plpgsql"
|
||||
@@ -295,6 +295,7 @@ ActiveRecord::Schema.define(version: 2021_12_17_094141) do
|
||||
t.datetime "updated_at", null: false
|
||||
t.datetime "processed_at"
|
||||
t.boolean "automatic_notifications", default: false
|
||||
t.boolean "mails_sent", default: false
|
||||
end
|
||||
|
||||
create_table "producer_properties", force: :cascade do |t|
|
||||
|
||||
@@ -10,8 +10,14 @@ describe OrderCycleNotificationJob do
|
||||
allow(ProducerMailer).to receive(:order_cycle_report).twice.and_return(mail)
|
||||
end
|
||||
|
||||
it 'sends a mail to each supplier' do
|
||||
it "sends a mail to each supplier" do
|
||||
OrderCycleNotificationJob.perform_now order_cycle.id
|
||||
expect(ProducerMailer).to have_received(:order_cycle_report).twice
|
||||
end
|
||||
|
||||
it "records that mails have been sent for the order cycle" do
|
||||
expect do
|
||||
OrderCycleNotificationJob.perform_now(order_cycle.id)
|
||||
end.to change{ order_cycle.reload.mails_sent? }.from(false).to(true)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -373,7 +373,7 @@ describe OrderCycle do
|
||||
oc = create(:simple_order_cycle,
|
||||
coordinator_fees: [create(:enterprise_fee, enterprise: coordinator)],
|
||||
preferred_product_selection_from_coordinator_inventory_only: true,
|
||||
automatic_notifications: true)
|
||||
automatic_notifications: true, processed_at: Time.zone.now, mails_sent: true)
|
||||
ex1 = create(:exchange, order_cycle: oc)
|
||||
ex2 = create(:exchange, order_cycle: oc)
|
||||
oc.clone!
|
||||
@@ -385,6 +385,8 @@ describe OrderCycle do
|
||||
expect(occ.coordinator).not_to be_nil
|
||||
expect(occ.preferred_product_selection_from_coordinator_inventory_only).to be true
|
||||
expect(occ.automatic_notifications).to eq(oc.automatic_notifications)
|
||||
expect(occ.processed_at).to eq(nil)
|
||||
expect(occ.mails_sent).to eq(nil)
|
||||
expect(occ.coordinator).to eq(oc.coordinator)
|
||||
|
||||
expect(occ.coordinator_fee_ids).not_to be_empty
|
||||
|
||||
@@ -272,36 +272,51 @@ describe '
|
||||
expect(exchange.tag_list).to eq(["wholesale"])
|
||||
end
|
||||
|
||||
it "editing an order cycle" do
|
||||
oc = create(:simple_order_cycle,
|
||||
suppliers: [supplier_managed, supplier_permitted, supplier_unmanaged], coordinator: distributor_managed, distributors: [distributor_managed, distributor_permitted, distributor_unmanaged], name: 'Order Cycle 1' )
|
||||
distributor_managed.update_attribute(:enable_subscriptions, true)
|
||||
context "editing an order cycle" do
|
||||
let(:oc) do
|
||||
create(:simple_order_cycle, suppliers: [supplier_managed, supplier_permitted, supplier_unmanaged],
|
||||
coordinator: distributor_managed,
|
||||
distributors: [distributor_managed, distributor_permitted, distributor_unmanaged],
|
||||
name: 'Order Cycle 1' )
|
||||
end
|
||||
|
||||
visit edit_admin_order_cycle_path(oc)
|
||||
before { distributor_managed.update_attribute(:enable_subscriptions, true) }
|
||||
|
||||
expect(page).to have_field 'order_cycle_name', with: oc.name
|
||||
select2_select schedule.name, from: 'schedule_ids'
|
||||
expect(page).not_to have_select2 'schedule_ids',
|
||||
with_options: [schedule_of_other_managed_distributor.name]
|
||||
it "shows if notifications have been sent" do
|
||||
oc.update_columns mails_sent: true
|
||||
|
||||
click_button 'Save and Next'
|
||||
visit edit_admin_order_cycle_path(oc)
|
||||
|
||||
# When I remove all incoming exchanges
|
||||
page.find("tr.supplier-#{supplier_managed.id} a.remove-exchange").click
|
||||
page.find("tr.supplier-#{supplier_permitted.id} a.remove-exchange").click
|
||||
click_button 'Save and Next'
|
||||
expect(page).to have_content I18n.t("admin.order_cycles.edit.re_notify_producers").upcase
|
||||
end
|
||||
|
||||
# And I remove all outgoing exchanges
|
||||
page.find("tr.distributor-#{distributor_managed.id} a.remove-exchange").click
|
||||
page.find("tr.distributor-#{distributor_permitted.id} a.remove-exchange").click
|
||||
click_button 'Save and Back to List'
|
||||
expect(page).to have_input "oc#{oc.id}[name]", value: oc.name
|
||||
it "allows removing exchanges" do
|
||||
visit edit_admin_order_cycle_path(oc)
|
||||
|
||||
oc.reload
|
||||
expect(oc.suppliers).to eq([supplier_unmanaged])
|
||||
expect(oc.coordinator).to eq(distributor_managed)
|
||||
expect(oc.distributors).to eq([distributor_unmanaged])
|
||||
expect(oc.schedules).to eq([schedule])
|
||||
expect(page).to have_field 'order_cycle_name', with: oc.name
|
||||
select2_select schedule.name, from: 'schedule_ids'
|
||||
expect(page).not_to have_select2 'schedule_ids',
|
||||
with_options: [schedule_of_other_managed_distributor.name]
|
||||
|
||||
click_button 'Save and Next'
|
||||
|
||||
# When I remove all incoming exchanges
|
||||
page.find("tr.supplier-#{supplier_managed.id} a.remove-exchange").click
|
||||
page.find("tr.supplier-#{supplier_permitted.id} a.remove-exchange").click
|
||||
click_button 'Save and Next'
|
||||
|
||||
# And I remove all outgoing exchanges
|
||||
page.find("tr.distributor-#{distributor_managed.id} a.remove-exchange").click
|
||||
page.find("tr.distributor-#{distributor_permitted.id} a.remove-exchange").click
|
||||
click_button 'Save and Back to List'
|
||||
expect(page).to have_input "oc#{oc.id}[name]", value: oc.name
|
||||
|
||||
oc.reload
|
||||
expect(oc.suppliers).to eq([supplier_unmanaged])
|
||||
expect(oc.coordinator).to eq(distributor_managed)
|
||||
expect(oc.distributors).to eq([distributor_unmanaged])
|
||||
expect(oc.schedules).to eq([schedule])
|
||||
end
|
||||
end
|
||||
|
||||
it "cloning an order cycle" do
|
||||
|
||||
Reference in New Issue
Block a user