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')
|
||||
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
|
||||
|
||||
def build_default_cerfa
|
||||
|
|
|
@ -417,5 +417,60 @@ describe Dossier do
|
|||
it { expect(subject.size).to eq(1) }
|
||||
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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue