Prevent double processing of declarative dossiers

This commit is contained in:
Paul Chavard 2021-06-04 12:03:31 +02:00
parent 3bd6df8bbf
commit 1888f74b10
5 changed files with 24 additions and 7 deletions

View file

@ -8,6 +8,7 @@
# autorisation_donnees :boolean
# brouillon_close_to_expiration_notice_sent_at :datetime
# conservation_extension :interval default(0 seconds)
# declarative_triggered_at :datetime
# deleted_user_email_never_send :string
# en_construction_at :datetime
# en_construction_close_to_expiration_notice_sent_at :datetime
@ -655,7 +656,9 @@ class Dossier < ApplicationRecord
end
def after_passer_automatiquement_en_instruction
update!(en_instruction_at: Time.zone.now) if self.en_instruction_at.nil?
self.en_instruction_at ||= Time.zone.now
self.declarative_triggered_at = Time.zone.now
save!
log_automatic_dossier_operation(:passer_en_instruction)
end
@ -695,6 +698,7 @@ class Dossier < ApplicationRecord
def after_accepter_automatiquement
self.traitements.build(state: Dossier.states.fetch(:accepte), instructeur_email: nil, motivation: nil, processed_at: Time.zone.now)
self.en_instruction_at ||= Time.zone.now
self.declarative_triggered_at = Time.zone.now
if attestation.nil?
self.attestation = build_attestation

View file

@ -606,10 +606,12 @@ class Procedure < ApplicationRecord
when Procedure.declarative_with_states.fetch(:en_instruction)
dossiers
.state_en_construction
.where(declarative_triggered_at: nil)
.find_each(&:passer_automatiquement_en_instruction!)
when Procedure.declarative_with_states.fetch(:accepte)
dossiers
.state_en_construction
.where(declarative_triggered_at: nil)
.find_each(&:accepter_automatiquement!)
end
end

View file

@ -0,0 +1,5 @@
class AddDeclarativeTriggeredAtToDossiers < ActiveRecord::Migration[6.1]
def change
add_column :dossiers, :declarative_triggered_at, :datetime
end
end

View file

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 2021_05_07_135603) do
ActiveRecord::Schema.define(version: 2021_06_04_095054) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@ -278,6 +278,7 @@ ActiveRecord::Schema.define(version: 2021_05_07_135603) do
t.string "deleted_user_email_never_send"
t.index "to_tsvector('french'::regconfig, (search_terms || private_search_terms))", name: "index_dossiers_on_search_terms_private_search_terms", using: :gin
t.index "to_tsvector('french'::regconfig, search_terms)", name: "index_dossiers_on_search_terms", using: :gin
t.datetime "declarative_triggered_at"
t.index ["archived"], name: "index_dossiers_on_archived"
t.index ["groupe_instructeur_id"], name: "index_dossiers_on_groupe_instructeur_id"
t.index ["hidden_at"], name: "index_dossiers_on_hidden_at"

View file

@ -9,14 +9,17 @@ RSpec.describe Cron::DeclarativeProceduresJob, type: :job do
let(:nouveau_dossier2) { create(:dossier, :en_construction, :with_individual, procedure: procedure) }
let(:dossier_recu) { create(:dossier, :en_instruction, :with_individual, procedure: procedure) }
let(:dossier_brouillon) { create(:dossier, procedure: procedure) }
let(:dossier_repasse_en_construction) { create(:dossier, :en_construction, :with_individual, procedure: procedure) }
before do
Timecop.freeze(date)
dossier_repasse_en_construction.touch(:declarative_triggered_at)
dossiers = [
nouveau_dossier1,
nouveau_dossier2,
dossier_recu,
dossier_brouillon
dossier_brouillon,
dossier_repasse_en_construction
]
create(:attestation_template, procedure: procedure)
@ -33,19 +36,21 @@ RSpec.describe Cron::DeclarativeProceduresJob, type: :job do
let(:last_operation) { nouveau_dossier1.dossier_operation_logs.last }
it {
expect(nouveau_dossier1.en_instruction?).to be true
expect(nouveau_dossier1.en_instruction?).to be_truthy
expect(nouveau_dossier1.en_instruction_at).to eq(date)
expect(last_operation.operation).to eq('passer_en_instruction')
expect(last_operation.automatic_operation?).to be_truthy
expect(nouveau_dossier2.en_instruction?).to be true
expect(nouveau_dossier2.en_instruction?).to be_truthy
expect(nouveau_dossier2.en_instruction_at).to eq(date)
expect(dossier_recu.en_instruction?).to be true
expect(dossier_recu.en_instruction?).to be_truthy
expect(dossier_recu.en_instruction_at).to eq(instruction_date)
expect(dossier_brouillon.brouillon?).to be true
expect(dossier_brouillon.brouillon?).to be_truthy
expect(dossier_brouillon.en_instruction_at).to eq(nil)
expect(dossier_repasse_en_construction.en_construction?).to be_truthy
}
end