Add search method on dossier model
This commit is contained in:
parent
dd8bafab49
commit
de356ae0ab
2 changed files with 107 additions and 29 deletions
|
@ -128,6 +128,29 @@ class Dossier < ActiveRecord::Base
|
||||||
Dossier.joins(:procedure).where("state='closed' AND dossiers.procedure_id = procedures.id AND procedures.administrateur_id = #{current_gestionnaire.administrateur_id}").order('updated_at ASC')
|
Dossier.joins(:procedure).where("state='closed' AND dossiers.procedure_id = procedures.id AND procedures.administrateur_id = #{current_gestionnaire.administrateur_id}").order('updated_at ASC')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.search terms
|
||||||
|
return if terms.blank?
|
||||||
|
dossiers = Dossier.arel_table
|
||||||
|
users = User.arel_table
|
||||||
|
etablissements = Etablissement.arel_table
|
||||||
|
entreprises = Entreprise.arel_table
|
||||||
|
composed_scope = self.joins('LEFT OUTER JOIN users ON users.id = dossiers.user_id')
|
||||||
|
.joins('LEFT OUTER JOIN entreprises ON entreprises.dossier_id = dossiers.id')
|
||||||
|
.joins('LEFT OUTER JOIN etablissements ON etablissements.dossier_id = dossiers.id')
|
||||||
|
terms.split.each do |word|
|
||||||
|
query_string = "%#{word}%"
|
||||||
|
query_string_start_with = "#{word}%"
|
||||||
|
composed_scope = composed_scope.where(
|
||||||
|
dossiers[:nom_projet].matches(query_string).or\
|
||||||
|
users[:email].matches(query_string).or\
|
||||||
|
dossiers[:id].eq(word).or\
|
||||||
|
etablissements[:siret].matches(query_string_start_with).or\
|
||||||
|
entreprises[:raison_sociale].matches(query_string)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
composed_scope
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def build_default_cerfa
|
def build_default_cerfa
|
||||||
|
|
|
@ -417,5 +417,60 @@ describe Dossier do
|
||||||
it { expect(subject.size).to eq(1) }
|
it { expect(subject.size).to eq(1) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '.search' do
|
||||||
|
subject { described_class.search(terms) }
|
||||||
|
|
||||||
|
let!(:dossier_1) { create(:dossier, nom_projet: 'Projet de test', user: create(:user, email: 'contact@test.com')) }
|
||||||
|
let!(:dossier_2) { create(:dossier, nom_projet: 'Lili et Marcel', user: create(:user, email: 'plop@gmail.com')) }
|
||||||
|
let!(:dossier_3) { create(:dossier, nom_projet: 'Construction projet marcel', user: create(:user, email: 'peace@clap.fr')) }
|
||||||
|
|
||||||
|
let!(:etablissement_1) { create(:etablissement, entreprise: create(:entreprise, raison_sociale: 'OCTO Academy', dossier: dossier_1), dossier: dossier_1, siret: '41636169600051') }
|
||||||
|
let!(:etablissement_2) { create(:etablissement, entreprise: create(:entreprise, raison_sociale: 'Plop octo', dossier: dossier_2), dossier: dossier_2, siret: '41816602300012') }
|
||||||
|
let!(:etablissement_3) { create(:etablissement, entreprise: create(:entreprise, raison_sociale: 'OCTO Technology', dossier: dossier_3), dossier: dossier_3, siret: '41816609600051') }
|
||||||
|
|
||||||
|
describe 'search is empty' do
|
||||||
|
let(:terms) { '' }
|
||||||
|
|
||||||
|
it { expect(subject).to eq(nil) }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'search on file title' do
|
||||||
|
let(:terms) { 'Marcel' }
|
||||||
|
|
||||||
|
it { expect(subject.size).to eq(2) }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'search on contact email' do
|
||||||
|
let(:terms) { 'clap' }
|
||||||
|
|
||||||
|
it { expect(subject.size).to eq(1) }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'search on ID dossier' do
|
||||||
|
let(:terms) { "#{dossier_2.id}" }
|
||||||
|
|
||||||
|
it { expect(subject.size).to eq(1) }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'search on SIRET' do
|
||||||
|
|
||||||
|
let(:terms) { '4181' }
|
||||||
|
|
||||||
|
it { expect(subject.size).to eq(2) }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'search on raison social' do
|
||||||
|
let(:terms) { 'OCTO' }
|
||||||
|
|
||||||
|
it { expect(subject.size).to eq(3) }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'search on multiple fields' do
|
||||||
|
let(:terms) { 'octo peace' }
|
||||||
|
|
||||||
|
it { expect(subject.size).to eq(1) }
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue