diff --git a/app/models/concerns/dossier_empty_concern.rb b/app/models/concerns/dossier_empty_concern.rb new file mode 100644 index 000000000..af2acbbab --- /dev/null +++ b/app/models/concerns/dossier_empty_concern.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +module DossierEmptyConcern + extend ActiveSupport::Concern + + included do + scope :empty_brouillon, -> (created_at) do + dossiers_ids = Dossier.brouillon.where(created_at:).ids + + dossiers_with_value = Dossier.select('id').includes(:champs) + .where.not(champs: { value: nil }) + .where(id: dossiers_ids) + + dossier_with_geo_areas = Dossier.select('id').includes(champs: :geo_areas) + .where.not(geo_areas: { id: nil }) + .where(id: dossiers_ids) + + dossier_with_pj = Dossier.select('id') + .joins(champs: :piece_justificative_file_attachments) + .where(id: dossiers_ids) + + brouillon + .where.not(id: dossiers_with_value) + .where.not(id: dossier_with_geo_areas) + .where.not(id: dossier_with_pj) + .where(id: dossiers_ids) + end + end +end diff --git a/app/models/dossier.rb b/app/models/dossier.rb index a07393b05..d27b7e9ad 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -12,6 +12,7 @@ class Dossier < ApplicationRecord include DossierSectionsConcern include DossierStateConcern include DossierChampsConcern + include DossierEmptyConcern enum state: { brouillon: 'brouillon', diff --git a/spec/models/concerns/dossier_empty_concern_spec.rb b/spec/models/concerns/dossier_empty_concern_spec.rb new file mode 100644 index 000000000..6a6a1e524 --- /dev/null +++ b/spec/models/concerns/dossier_empty_concern_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +RSpec.describe DossierEmptyConcern do + describe 'empty_brouillon' do + let(:types) { [{ type: :text }, { type: :carte }, { type: :piece_justificative }] } + let(:procedure) { create(:procedure, types_de_champ_public: types) } + let!(:empty_brouillon) { create(:dossier, procedure:) } + let!(:empty_en_construction) { create(:dossier, :en_construction, procedure:) } + let!(:value_filled_dossier) { create(:dossier, procedure:) } + let!(:carte_filled_dossier) { create(:dossier, procedure:) } + let!(:pj_filled_dossier) { create(:dossier, procedure:) } + let(:geo_area) { build(:geo_area, :selection_utilisateur, :polygon) } + let(:attachment) { { io: StringIO.new("toto"), filename: "toto.png", content_type: "image/png" } } + + subject { Dossier.empty_brouillon(2.days.ago..) } + + before do + value_filled_dossier.champs.first.update(value: 'filled') + carte_filled_dossier.champs.second.update(geo_areas: [geo_area]) + pj_filled_dossier.champs.third.piece_justificative_file.attach(attachment) + end + + it do + is_expected.to eq([empty_brouillon]) + end + end +end