Official support for declarative demarches
This commit is contained in:
parent
dfefb827d9
commit
46c1bbbc6f
8 changed files with 149 additions and 3 deletions
|
@ -63,7 +63,7 @@ En local, un utilisateur de test est créé automatiquement, avec les identifian
|
||||||
|
|
||||||
AutoArchiveProcedureJob.set(cron: "* * * * *").perform_later
|
AutoArchiveProcedureJob.set(cron: "* * * * *").perform_later
|
||||||
WeeklyOverviewJob.set(cron: "0 7 * * 1").perform_later
|
WeeklyOverviewJob.set(cron: "0 7 * * 1").perform_later
|
||||||
AutoReceiveDossiersForProcedureJob.set(cron: "* * * * *").perform_later(procedure_declaratoire_id, Dossier.states.fetch(:en_instruction))
|
DeclarativeProceduresJob.set(cron: "* * * * *").perform_later
|
||||||
UpdateAdministrateurUsageStatisticsJob.set(cron: "0 10 * * *").perform_later
|
UpdateAdministrateurUsageStatisticsJob.set(cron: "0 10 * * *").perform_later
|
||||||
FindDubiousProceduresJob.set(cron: "0 0 * * *").perform_later
|
FindDubiousProceduresJob.set(cron: "0 0 * * *").perform_later
|
||||||
Administrateurs::ActivateBeforeExpirationJob.set(cron: "0 8 * * *").perform_later
|
Administrateurs::ActivateBeforeExpirationJob.set(cron: "0 8 * * *").perform_later
|
||||||
|
|
7
app/jobs/declarative_procedures_job.rb
Normal file
7
app/jobs/declarative_procedures_job.rb
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
class DeclarativeProceduresJob < ApplicationJob
|
||||||
|
queue_as :cron
|
||||||
|
|
||||||
|
def perform(*args)
|
||||||
|
Procedure.declarative.find_each(&:process_dossiers!)
|
||||||
|
end
|
||||||
|
end
|
|
@ -411,13 +411,13 @@ class Dossier < ApplicationRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def send_dossier_received
|
def send_dossier_received
|
||||||
if saved_change_to_state? && en_instruction?
|
if saved_change_to_state? && en_instruction? && !procedure.declarative_accepte?
|
||||||
NotificationMailer.send_dossier_received(self).deliver_later
|
NotificationMailer.send_dossier_received(self).deliver_later
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def send_draft_notification_email
|
def send_draft_notification_email
|
||||||
if brouillon?
|
if brouillon? && !procedure.declarative?
|
||||||
DossierMailer.notify_new_draft(self).deliver_later
|
DossierMailer.notify_new_draft(self).deliver_later
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -46,6 +46,7 @@ class Procedure < ApplicationRecord
|
||||||
scope :created_during, -> (range) { where(created_at: range) }
|
scope :created_during, -> (range) { where(created_at: range) }
|
||||||
scope :cloned_from_library, -> { where(cloned_from_library: true) }
|
scope :cloned_from_library, -> { where(cloned_from_library: true) }
|
||||||
scope :avec_lien, -> { where.not(path: nil) }
|
scope :avec_lien, -> { where.not(path: nil) }
|
||||||
|
scope :declarative, -> { where.not(declarative_with_state: nil) }
|
||||||
|
|
||||||
scope :for_api, -> {
|
scope :for_api, -> {
|
||||||
includes(
|
includes(
|
||||||
|
@ -57,6 +58,11 @@ class Procedure < ApplicationRecord
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum declarative_with_state: {
|
||||||
|
en_instruction: 'en_instruction',
|
||||||
|
accepte: 'accepte'
|
||||||
|
}
|
||||||
|
|
||||||
validates :libelle, presence: true, allow_blank: false, allow_nil: false
|
validates :libelle, presence: true, allow_blank: false, allow_nil: false
|
||||||
validates :description, presence: true, allow_blank: false, allow_nil: false
|
validates :description, presence: true, allow_blank: false, allow_nil: false
|
||||||
validates :administrateurs, presence: true
|
validates :administrateurs, presence: true
|
||||||
|
@ -141,6 +147,14 @@ class Procedure < ApplicationRecord
|
||||||
module_api_carto&.use_api_carto? && module_api_carto&.migrated?
|
module_api_carto&.use_api_carto? && module_api_carto&.migrated?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def declarative?
|
||||||
|
declarative_with_state.present?
|
||||||
|
end
|
||||||
|
|
||||||
|
def declarative_accepte?
|
||||||
|
declarative_with_state == Procedure.declarative_with_states.fetch(:accepte)
|
||||||
|
end
|
||||||
|
|
||||||
# Warning: dossier after_save build_default_champs must be removed
|
# Warning: dossier after_save build_default_champs must be removed
|
||||||
# to save a dossier created from this method
|
# to save a dossier created from this method
|
||||||
def new_dossier
|
def new_dossier
|
||||||
|
@ -431,6 +445,19 @@ class Procedure < ApplicationRecord
|
||||||
update!(collection_attribute_name => attributes)
|
update!(collection_attribute_name => attributes)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def process_dossiers!
|
||||||
|
case declarative_with_state
|
||||||
|
when Procedure.declarative_with_states.fetch(:en_instruction)
|
||||||
|
dossiers
|
||||||
|
.state_en_construction
|
||||||
|
.find_each(&:passer_automatiquement_en_instruction!)
|
||||||
|
when Procedure.declarative_with_states.fetch(:accepte)
|
||||||
|
dossiers
|
||||||
|
.state_en_construction
|
||||||
|
.find_each(&:accepter_automatiquement!)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def move_type_de_champ_attributes(types_de_champ, type_de_champ, new_index)
|
def move_type_de_champ_attributes(types_de_champ, type_de_champ, new_index)
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
class AddDeclarativeWithStateToProcedures < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
add_column :procedures, :declarative_with_state, :string
|
||||||
|
add_index :procedures, :declarative_with_state
|
||||||
|
end
|
||||||
|
end
|
|
@ -492,6 +492,8 @@ ActiveRecord::Schema.define(version: 2019_06_27_132911) do
|
||||||
t.boolean "durees_conservation_required", default: true
|
t.boolean "durees_conservation_required", default: true
|
||||||
t.string "path"
|
t.string "path"
|
||||||
t.boolean "expects_multiple_submissions", default: false, null: false
|
t.boolean "expects_multiple_submissions", default: false, null: false
|
||||||
|
t.string "declarative_with_state"
|
||||||
|
t.index ["declarative_with_state"], name: "index_procedures_on_declarative_with_state"
|
||||||
t.index ["hidden_at"], name: "index_procedures_on_hidden_at"
|
t.index ["hidden_at"], name: "index_procedures_on_hidden_at"
|
||||||
t.index ["parent_procedure_id"], name: "index_procedures_on_parent_procedure_id"
|
t.index ["parent_procedure_id"], name: "index_procedures_on_parent_procedure_id"
|
||||||
t.index ["service_id"], name: "index_procedures_on_service_id"
|
t.index ["service_id"], name: "index_procedures_on_service_id"
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
namespace :after_party do
|
||||||
|
desc 'Deployment task: set_declarative_procedures'
|
||||||
|
task set_declarative_procedures: :environment do
|
||||||
|
puts "Running deploy task 'set_declarative_procedures'"
|
||||||
|
|
||||||
|
Delayed::Job.where.not(cron: nil).find_each do |job|
|
||||||
|
job_data = YAML.load_dj(job.handler).job_data
|
||||||
|
|
||||||
|
if job_data['job_class'] == 'AutoReceiveDossiersForProcedureJob'
|
||||||
|
procedure_id, state = job_data['arguments']
|
||||||
|
procedure = Procedure.find(procedure_id)
|
||||||
|
procedure.declarative_with_state = state
|
||||||
|
procedure.save!
|
||||||
|
job.delete
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Update task as completed. If you remove the line below, the task will
|
||||||
|
# run with every deploy (or every time you call after_party:run).
|
||||||
|
AfterParty::TaskRecord.create version: '20190523122639'
|
||||||
|
end
|
||||||
|
end
|
82
spec/jobs/declarative_procedures_job_spec.rb
Normal file
82
spec/jobs/declarative_procedures_job_spec.rb
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe DeclarativeProceduresJob, type: :job do
|
||||||
|
describe "perform" do
|
||||||
|
let(:date) { Time.utc(2017, 9, 1, 10, 5, 0) }
|
||||||
|
let(:instruction_date) { date + 120 }
|
||||||
|
|
||||||
|
let(:state) { nil }
|
||||||
|
let(:procedure) { create(:procedure, :with_gestionnaire, declarative_with_state: state) }
|
||||||
|
let(:nouveau_dossier1) { create(:dossier, :en_construction, procedure: procedure) }
|
||||||
|
let(:nouveau_dossier2) { create(:dossier, :en_construction, procedure: procedure) }
|
||||||
|
let(:dossier_recu) { create(:dossier, :en_instruction, procedure: procedure) }
|
||||||
|
let(:dossier_brouillon) { create(:dossier, procedure: procedure) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
Timecop.freeze(date)
|
||||||
|
dossiers = [
|
||||||
|
nouveau_dossier1,
|
||||||
|
nouveau_dossier2,
|
||||||
|
dossier_recu,
|
||||||
|
dossier_brouillon
|
||||||
|
]
|
||||||
|
|
||||||
|
create(:attestation_template, procedure: procedure)
|
||||||
|
DeclarativeProceduresJob.new.perform
|
||||||
|
|
||||||
|
dossiers.each(&:reload)
|
||||||
|
end
|
||||||
|
|
||||||
|
after { Timecop.return }
|
||||||
|
|
||||||
|
context "with some dossiers" do
|
||||||
|
context "en_construction" do
|
||||||
|
let(:state) { Dossier.states.fetch(:en_instruction) }
|
||||||
|
let(:last_operation) { nouveau_dossier1.dossier_operation_logs.last }
|
||||||
|
|
||||||
|
it {
|
||||||
|
expect(nouveau_dossier1.en_instruction?).to be true
|
||||||
|
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_at).to eq(date)
|
||||||
|
|
||||||
|
expect(dossier_recu.en_instruction?).to be true
|
||||||
|
expect(dossier_recu.en_instruction_at).to eq(instruction_date)
|
||||||
|
|
||||||
|
expect(dossier_brouillon.brouillon?).to be true
|
||||||
|
expect(dossier_brouillon.en_instruction_at).to eq(nil)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
context "accepte" do
|
||||||
|
let(:state) { Dossier.states.fetch(:accepte) }
|
||||||
|
let(:last_operation) { nouveau_dossier1.dossier_operation_logs.last }
|
||||||
|
|
||||||
|
it {
|
||||||
|
expect(nouveau_dossier1.accepte?).to be true
|
||||||
|
expect(nouveau_dossier1.en_instruction_at).to eq(date)
|
||||||
|
expect(nouveau_dossier1.processed_at).to eq(date)
|
||||||
|
expect(nouveau_dossier1.attestation).to be_present
|
||||||
|
expect(last_operation.operation).to eq('accepter')
|
||||||
|
expect(last_operation.automatic_operation?).to be_truthy
|
||||||
|
|
||||||
|
expect(nouveau_dossier2.accepte?).to be true
|
||||||
|
expect(nouveau_dossier2.en_instruction_at).to eq(date)
|
||||||
|
expect(nouveau_dossier2.processed_at).to eq(date)
|
||||||
|
expect(nouveau_dossier2.attestation).to be_present
|
||||||
|
|
||||||
|
expect(dossier_recu.en_instruction?).to be true
|
||||||
|
expect(dossier_recu.en_instruction_at).to eq(instruction_date)
|
||||||
|
expect(dossier_recu.processed_at).to eq(nil)
|
||||||
|
|
||||||
|
expect(dossier_brouillon.brouillon?).to be true
|
||||||
|
expect(dossier_brouillon.en_instruction_at).to eq(nil)
|
||||||
|
expect(dossier_brouillon.processed_at).to eq(nil)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue