[#3477] Filter by mutliple values
This commit is contained in:
parent
5d01e37d70
commit
70bf6aecf6
2 changed files with 121 additions and 6 deletions
|
@ -108,10 +108,10 @@ class ProcedurePresentation < ApplicationRecord
|
|||
|
||||
def filtered_ids(dossiers, statut)
|
||||
dossiers.each { |dossier| assert_matching_procedure(dossier) }
|
||||
filters[statut].map do |filter|
|
||||
table = filter['table']
|
||||
column = sanitized_column(filter)
|
||||
values = [filter['value']]
|
||||
filters[statut].group_by { |filter| filter.slice('table', 'column') } .map do |field, filters|
|
||||
table = field['table']
|
||||
column = sanitized_column(field)
|
||||
values = filters.map { |filter| filter['value'] }
|
||||
case table
|
||||
when 'self'
|
||||
dates = values.map { |v| Time.zone.parse(v).beginning_of_day rescue nil }
|
||||
|
@ -123,10 +123,10 @@ class ProcedurePresentation < ApplicationRecord
|
|||
Filter.new(
|
||||
dossiers
|
||||
.includes(relation)
|
||||
.where("champs.type_de_champ_id = ?", filter['column'].to_i)
|
||||
.where("champs.type_de_champ_id = ?", field['column'].to_i)
|
||||
).where_ilike('champs.value', values)
|
||||
when 'etablissement'
|
||||
if filter['column'] == 'entreprise_date_creation'
|
||||
if field['column'] == 'entreprise_date_creation'
|
||||
dates = values.map { |v| v.to_date rescue nil }
|
||||
Filter.new(
|
||||
dossiers.includes(table)
|
||||
|
|
|
@ -430,6 +430,23 @@ describe ProcedurePresentation do
|
|||
it { is_expected.to match([]) }
|
||||
end
|
||||
end
|
||||
|
||||
context 'with multiple search values' do
|
||||
let(:filter) do
|
||||
[
|
||||
{ 'table' => 'self', 'column' => 'en_construction_at', 'value' => '17/10/2018' },
|
||||
{ 'table' => 'self', 'column' => 'en_construction_at', 'value' => '19/10/2018' }
|
||||
]
|
||||
end
|
||||
|
||||
let!(:kept_dossier) { create(:dossier, :en_construction, procedure: procedure, en_construction_at: Time.zone.local(2018, 10, 17)) }
|
||||
let!(:other_kept_dossier) { create(:dossier, :en_construction, procedure: procedure, en_construction_at: Time.zone.local(2018, 10, 19)) }
|
||||
let!(:discarded_dossier) { create(:dossier, :en_construction, procedure: procedure, en_construction_at: Time.zone.local(2013, 1, 1)) }
|
||||
|
||||
it 'returns every dossier that matches any of the search criteria for a given column' do
|
||||
is_expected.to contain_exactly(kept_dossier.id, other_kept_dossier.id)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'for type_de_champ table' do
|
||||
|
@ -445,6 +462,25 @@ describe ProcedurePresentation do
|
|||
end
|
||||
|
||||
it { is_expected.to contain_exactly(kept_dossier.id) }
|
||||
|
||||
context 'with multiple search values' do
|
||||
let(:filter) do
|
||||
[
|
||||
{ 'table' => 'type_de_champ', 'column' => type_de_champ.id.to_s, 'value' => 'keep' },
|
||||
{ 'table' => 'type_de_champ', 'column' => type_de_champ.id.to_s, 'value' => 'and' }
|
||||
]
|
||||
end
|
||||
|
||||
let(:other_kept_dossier) { create(:dossier, procedure: procedure) }
|
||||
|
||||
before do
|
||||
type_de_champ.champ.create(dossier: other_kept_dossier, value: 'and me too')
|
||||
end
|
||||
|
||||
it 'returns every dossier that matches any of the search criteria for a given column' do
|
||||
is_expected.to contain_exactly(kept_dossier.id, other_kept_dossier.id)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'for type_de_champ_private table' do
|
||||
|
@ -460,6 +496,25 @@ describe ProcedurePresentation do
|
|||
end
|
||||
|
||||
it { is_expected.to contain_exactly(kept_dossier.id) }
|
||||
|
||||
context 'with multiple search values' do
|
||||
let(:filter) do
|
||||
[
|
||||
{ 'table' => 'type_de_champ_private', 'column' => type_de_champ_private.id.to_s, 'value' => 'keep' },
|
||||
{ 'table' => 'type_de_champ_private', 'column' => type_de_champ_private.id.to_s, 'value' => 'and' }
|
||||
]
|
||||
end
|
||||
|
||||
let(:other_kept_dossier) { create(:dossier, procedure: procedure) }
|
||||
|
||||
before do
|
||||
type_de_champ_private.champ.create(dossier: other_kept_dossier, value: 'and me too')
|
||||
end
|
||||
|
||||
it 'returns every dossier that matches any of the search criteria for a given column' do
|
||||
is_expected.to contain_exactly(kept_dossier.id, other_kept_dossier.id)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'for etablissement table' do
|
||||
|
@ -470,6 +525,21 @@ describe ProcedurePresentation do
|
|||
let!(:discarded_dossier) { create(:dossier, procedure: procedure, etablissement: create(:etablissement, entreprise_date_creation: Time.zone.local(2008, 6, 21))) }
|
||||
|
||||
it { is_expected.to contain_exactly(kept_dossier.id) }
|
||||
|
||||
context 'with multiple search values' do
|
||||
let(:filter) do
|
||||
[
|
||||
{ 'table' => 'etablissement', 'column' => 'entreprise_date_creation', 'value' => '21/6/2016' },
|
||||
{ 'table' => 'etablissement', 'column' => 'entreprise_date_creation', 'value' => '21/6/2018' }
|
||||
]
|
||||
end
|
||||
|
||||
let!(:other_kept_dossier) { create(:dossier, procedure: procedure, etablissement: create(:etablissement, entreprise_date_creation: Time.zone.local(2016, 6, 21))) }
|
||||
|
||||
it 'returns every dossier that matches any of the search criteria for a given column' do
|
||||
is_expected.to contain_exactly(kept_dossier.id, other_kept_dossier.id)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'for code_postal column' do
|
||||
|
@ -481,6 +551,21 @@ describe ProcedurePresentation do
|
|||
let!(:discarded_dossier) { create(:dossier, procedure: procedure, etablissement: create(:etablissement, code_postal: '25000')) }
|
||||
|
||||
it { is_expected.to contain_exactly(kept_dossier.id) }
|
||||
|
||||
context 'with multiple search values' do
|
||||
let(:filter) do
|
||||
[
|
||||
{ 'table' => 'etablissement', 'column' => 'code_postal', 'value' => '75017' },
|
||||
{ 'table' => 'etablissement', 'column' => 'code_postal', 'value' => '88100' }
|
||||
]
|
||||
end
|
||||
|
||||
let!(:other_kept_dossier) { create(:dossier, procedure: procedure, etablissement: create(:etablissement, code_postal: '88100')) }
|
||||
|
||||
it 'returns every dossier that matches any of the search criteria for a given column' do
|
||||
is_expected.to contain_exactly(kept_dossier.id, other_kept_dossier.id)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -491,6 +576,21 @@ describe ProcedurePresentation do
|
|||
let!(:discarded_dossier) { create(:dossier, procedure: procedure, user: create(:user, email: 'me@discard.com')) }
|
||||
|
||||
it { is_expected.to contain_exactly(kept_dossier.id) }
|
||||
|
||||
context 'with multiple search values' do
|
||||
let(:filter) do
|
||||
[
|
||||
{ 'table' => 'user', 'column' => 'email', 'value' => 'keepmail' },
|
||||
{ 'table' => 'user', 'column' => 'email', 'value' => 'beta.gouv.fr' }
|
||||
]
|
||||
end
|
||||
|
||||
let!(:other_kept_dossier) { create(:dossier, procedure: procedure, user: create(:user, email: 'bazinga@beta.gouv.fr')) }
|
||||
|
||||
it 'returns every dossier that matches any of the search criteria for a given column' do
|
||||
is_expected.to contain_exactly(kept_dossier.id, other_kept_dossier.id)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'for individual table' do
|
||||
|
@ -515,6 +615,21 @@ describe ProcedurePresentation do
|
|||
|
||||
it { is_expected.to contain_exactly(kept_dossier.id) }
|
||||
end
|
||||
|
||||
context 'with multiple search values' do
|
||||
let(:filter) do
|
||||
[
|
||||
{ 'table' => 'individual', 'column' => 'prenom', 'value' => 'Josephine' },
|
||||
{ 'table' => 'individual', 'column' => 'prenom', 'value' => 'Romuald' }
|
||||
]
|
||||
end
|
||||
|
||||
let!(:other_kept_dossier) { create(:dossier, procedure: procedure, individual: create(:individual, gender: 'M', prenom: 'Romuald', nom: 'Pistis')) }
|
||||
|
||||
it 'returns every dossier that matches any of the search criteria for a given column' do
|
||||
is_expected.to contain_exactly(kept_dossier.id, other_kept_dossier.id)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue