mas-rad_core 0.0.81 → 0.0.82
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/models/firm.rb +19 -21
- data/app/serializers/firm_serializer.rb +8 -0
- data/db/migrate/20150930140851_remove_firm_email_and_phone.rb +26 -0
- data/lib/mas/rad_core/version.rb +1 -1
- data/spec/dummy/db/schema.rb +2 -4
- data/spec/dummy/log/test.log +0 -0
- data/spec/factories/firm.rb +7 -3
- data/spec/models/firm_factory_spec.rb +20 -1
- data/spec/models/firm_spec.rb +10 -48
- data/spec/serializers/firm_serializer_spec.rb +2 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8aaa6855712fd187910683b20259960b00ca1472
|
4
|
+
data.tar.gz: 104f655a861efc082670fda527505d9e89fda40e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 588fa78f40923457266cc2d6017043c9e48792724186c247d09a4c1b930a33ce117f2a269eebb67445e361fb3bbedd0ef17967522d2ad72575fd30d206ca341f
|
7
|
+
data.tar.gz: d8b7e188680d827cd27a985ea7a52dad63c992d32ff3dd7c6e3ab3ef2d7c04b676619efaceb6caad789b1d82b89121312b80e578ac388cceb1976268d25700ef
|
data/app/models/firm.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
class Firm < ActiveRecord::Base
|
2
2
|
include Geocodable
|
3
3
|
|
4
|
+
FREE_INITIAL_MEETING_VALID_VALUES = [true, false].freeze
|
5
|
+
|
6
|
+
# We use a scalar required field as a marker to detect a record saved with validation
|
7
|
+
REGISTERED_MARKER_FIELD = :free_initial_meeting
|
8
|
+
REGISTERED_MARKER_FIELD_VALID_VALUES = FREE_INITIAL_MEETING_VALID_VALUES
|
9
|
+
|
4
10
|
ADVICE_TYPES_ATTRIBUTES = [
|
5
11
|
:retirement_income_products_flag,
|
6
12
|
:pension_transfer_flag,
|
@@ -10,7 +16,7 @@ class Firm < ActiveRecord::Base
|
|
10
16
|
:wills_and_probate_flag
|
11
17
|
]
|
12
18
|
|
13
|
-
scope :registered, -> { where.not(
|
19
|
+
scope :registered, -> { where.not(REGISTERED_MARKER_FIELD => nil) }
|
14
20
|
scope :sorted_by_registered_name, -> { order(:registered_name) }
|
15
21
|
|
16
22
|
has_and_belongs_to_many :in_person_advice_methods
|
@@ -39,23 +45,13 @@ class Firm < ActiveRecord::Base
|
|
39
45
|
before_validation :clear_blank_languages
|
40
46
|
before_validation :deduplicate_languages
|
41
47
|
|
42
|
-
validates :email_address,
|
43
|
-
presence: true,
|
44
|
-
length: { maximum: 50 },
|
45
|
-
format: { with: /.+@.+\..+/ }
|
46
|
-
|
47
|
-
validates :telephone_number,
|
48
|
-
presence: true,
|
49
|
-
length: { maximum: 30 },
|
50
|
-
format: { with: /\A[0-9 ]+\z/ }
|
51
|
-
|
52
48
|
validates :website_address,
|
53
49
|
allow_blank: true,
|
54
50
|
length: { maximum: 100 },
|
55
51
|
format: { with: /\Ahttps?:\/\/\S+\.\S+/ }
|
56
52
|
|
57
53
|
validates :free_initial_meeting,
|
58
|
-
inclusion: { in:
|
54
|
+
inclusion: { in: FREE_INITIAL_MEETING_VALID_VALUES }
|
59
55
|
|
60
56
|
validates :initial_meeting_duration,
|
61
57
|
presence: true,
|
@@ -131,17 +127,21 @@ class Firm < ActiveRecord::Base
|
|
131
127
|
# This method is basically a cheap way to answer the question: has this
|
132
128
|
# record ever been saved with validation enabled?
|
133
129
|
def registered?
|
134
|
-
|
130
|
+
# false is a valid value so we cannot use `.present?`
|
131
|
+
!(send(REGISTERED_MARKER_FIELD).nil?)
|
135
132
|
end
|
136
133
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
134
|
+
if Rails.env.test?
|
135
|
+
# A helper to shield tests from modifying the marker field directly
|
136
|
+
def __set_registered(state)
|
137
|
+
new_value = (state) ? REGISTERED_MARKER_FIELD_VALID_VALUES.first : nil
|
138
|
+
send("#{REGISTERED_MARKER_FIELD}=", new_value)
|
139
|
+
end
|
140
|
+
alias_method :__registered=, :__set_registered
|
143
141
|
end
|
144
142
|
|
143
|
+
enum status: { independent: 1, restricted: 2 }
|
144
|
+
|
145
145
|
def in_person_advice?
|
146
146
|
in_person_advice_methods.present?
|
147
147
|
end
|
@@ -155,8 +155,6 @@ class Firm < ActiveRecord::Base
|
|
155
155
|
|
156
156
|
def field_order
|
157
157
|
[
|
158
|
-
:email_address,
|
159
|
-
:telephone_number,
|
160
158
|
:website_address,
|
161
159
|
:address_line_one,
|
162
160
|
:address_line_two,
|
@@ -40,6 +40,14 @@ class FirmSerializer < ActiveModel::Serializer
|
|
40
40
|
object.advisers.geocoded
|
41
41
|
end
|
42
42
|
|
43
|
+
def telephone_number
|
44
|
+
object.main_office.telephone_number
|
45
|
+
end
|
46
|
+
|
47
|
+
def email_address
|
48
|
+
object.main_office.email_address
|
49
|
+
end
|
50
|
+
|
43
51
|
def postcode_searchable
|
44
52
|
object.postcode_searchable?
|
45
53
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class RemoveFirmEmailAndPhone < ActiveRecord::Migration
|
2
|
+
class Firm < ActiveRecord::Base; has_many :offices, -> { order created_at: :asc }; end
|
3
|
+
class Office < ActiveRecord::Base; belongs_to :firm; end
|
4
|
+
|
5
|
+
def up
|
6
|
+
remove_column :firms, :email_address
|
7
|
+
remove_column :firms, :telephone_number
|
8
|
+
|
9
|
+
# Data does not need to be migrated as the offices migration will have
|
10
|
+
# already copied these two fields into an office record.
|
11
|
+
end
|
12
|
+
|
13
|
+
def down
|
14
|
+
add_column :firms, :email_address, :string
|
15
|
+
add_column :firms, :telephone_number, :string
|
16
|
+
|
17
|
+
# Use the equivalent main office fields to repopulate
|
18
|
+
Firm.all.select { |f| f.offices.any? }.each do |firm|
|
19
|
+
main_office = firm.offices.first
|
20
|
+
firm.update!(
|
21
|
+
email_address: main_office.email_address,
|
22
|
+
telephone_number: main_office.telephone_number
|
23
|
+
)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/mas/rad_core/version.rb
CHANGED
data/spec/dummy/db/schema.rb
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
#
|
12
12
|
# It's strongly recommended that you check this file into your version control system.
|
13
13
|
|
14
|
-
ActiveRecord::Schema.define(version:
|
14
|
+
ActiveRecord::Schema.define(version: 20150930140851) do
|
15
15
|
|
16
16
|
# These are extensions that must be enabled in order to support this database
|
17
17
|
enable_extension "plpgsql"
|
@@ -80,8 +80,6 @@ ActiveRecord::Schema.define(version: 20150825090822) do
|
|
80
80
|
create_table "firms", force: :cascade do |t|
|
81
81
|
t.integer "fca_number", null: false
|
82
82
|
t.string "registered_name", null: false
|
83
|
-
t.string "email_address"
|
84
|
-
t.string "telephone_number"
|
85
83
|
t.datetime "created_at", null: false
|
86
84
|
t.datetime "updated_at", null: false
|
87
85
|
t.boolean "free_initial_meeting"
|
@@ -99,8 +97,8 @@ ActiveRecord::Schema.define(version: 20150825090822) do
|
|
99
97
|
t.string "website_address"
|
100
98
|
t.boolean "ethical_investing_flag", default: false, null: false
|
101
99
|
t.boolean "sharia_investing_flag", default: false, null: false
|
102
|
-
t.text "languages", default: [], null: false, array: true
|
103
100
|
t.integer "status"
|
101
|
+
t.text "languages", default: [], null: false, array: true
|
104
102
|
end
|
105
103
|
|
106
104
|
add_index "firms", ["initial_meeting_duration_id"], name: "index_firms_on_initial_meeting_duration_id", using: :btree
|
data/spec/dummy/log/test.log
CHANGED
Binary file
|
data/spec/factories/firm.rb
CHANGED
@@ -4,8 +4,6 @@ FactoryGirl.define do
|
|
4
4
|
factory :firm, aliases: [:publishable_firm, :onboarded_firm] do
|
5
5
|
fca_number
|
6
6
|
registered_name
|
7
|
-
email_address { Faker::Internet.email }
|
8
|
-
telephone_number { Faker::Base.numerify('##### ### ###') }
|
9
7
|
website_address { Faker::Internet.url }
|
10
8
|
in_person_advice_methods { create_list(:in_person_advice_method, rand(1..3)) }
|
11
9
|
free_initial_meeting { [true, false].sample }
|
@@ -49,6 +47,7 @@ FactoryGirl.define do
|
|
49
47
|
factory :firm_with_advisers, traits: [:with_advisers]
|
50
48
|
factory :firm_without_advisers, traits: [:without_advisers]
|
51
49
|
factory :firm_with_offices, traits: [:with_offices]
|
50
|
+
factory :firm_without_offices, traits: [:without_offices]
|
52
51
|
factory :firm_with_principal, traits: [:with_principal]
|
53
52
|
factory :firm_with_no_business_split, traits: [:with_no_business_split]
|
54
53
|
factory :firm_with_remote_advice, traits: [:with_remote_advice]
|
@@ -57,7 +56,8 @@ FactoryGirl.define do
|
|
57
56
|
factory :invalid_firm, traits: [:invalid], aliases: [:not_onboarded_firm]
|
58
57
|
|
59
58
|
trait :invalid do
|
60
|
-
|
59
|
+
# Invalidate the marker field without referencing it directly
|
60
|
+
__registered false
|
61
61
|
end
|
62
62
|
|
63
63
|
trait :with_no_business_split do
|
@@ -85,6 +85,10 @@ FactoryGirl.define do
|
|
85
85
|
offices_count 3
|
86
86
|
end
|
87
87
|
|
88
|
+
trait :without_offices do
|
89
|
+
offices_count 0
|
90
|
+
end
|
91
|
+
|
88
92
|
trait :with_remote_advice do
|
89
93
|
other_advice_methods { create_list(:other_advice_method, rand(1..3)) }
|
90
94
|
in_person_advice_methods []
|
@@ -61,7 +61,7 @@ RSpec.describe 'Firm factory' do
|
|
61
61
|
specify 'associations' do
|
62
62
|
expect(subject.principal).not_to be_present
|
63
63
|
expect(subject).to have(1).offices
|
64
|
-
expect(subject).to have(
|
64
|
+
expect(subject).to have(:no).advisers
|
65
65
|
expect(subject).to have(:no).trading_names
|
66
66
|
end
|
67
67
|
end
|
@@ -85,6 +85,25 @@ RSpec.describe 'Firm factory' do
|
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
|
+
describe 'factory :firm_without_offices' do
|
89
|
+
let(:factory) { :firm_without_offices }
|
90
|
+
|
91
|
+
specify 'expected status' do
|
92
|
+
expect(subject).to be_persisted
|
93
|
+
expect(subject).to be_valid
|
94
|
+
expect(subject).not_to be_publishable
|
95
|
+
expect(subject).not_to be_trading_name
|
96
|
+
expect(subject.primary_advice_method).to be(:local)
|
97
|
+
end
|
98
|
+
|
99
|
+
specify 'associations' do
|
100
|
+
expect(subject.principal).not_to be_present
|
101
|
+
expect(subject).to have(:no).offices
|
102
|
+
expect(subject).to have(1).advisers
|
103
|
+
expect(subject).to have(:no).trading_names
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
88
107
|
describe 'factory :firm_with_trading_names' do
|
89
108
|
let(:factory) { :firm_with_trading_names }
|
90
109
|
|
data/spec/models/firm_spec.rb
CHANGED
@@ -18,29 +18,19 @@ RSpec.describe Firm do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
describe '#registered?' do
|
21
|
-
|
22
|
-
firm.
|
23
|
-
expect(firm).not_to be_registered
|
21
|
+
def set_marker_field(firm, value)
|
22
|
+
firm.send("#{Firm::REGISTERED_MARKER_FIELD}=", value)
|
24
23
|
end
|
25
24
|
|
26
|
-
it 'is
|
27
|
-
firm
|
28
|
-
expect(firm).
|
25
|
+
it 'is false if the REGISTERED_MARKER_FIELD field is nil' do
|
26
|
+
set_marker_field(firm, nil)
|
27
|
+
expect(firm).not_to be_registered
|
29
28
|
end
|
30
|
-
end
|
31
29
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
expect(
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
context 'when provided' do
|
40
|
-
let(:firm) { build(:firm, telephone_number: ' 07715 930 457 ') }
|
41
|
-
|
42
|
-
it 'removes whitespace' do
|
43
|
-
expect(firm.telephone_number).to eq('07715930457')
|
30
|
+
it 'is true if the REGISTERED_MARKER_FIELD field has a valid value' do
|
31
|
+
Firm::REGISTERED_MARKER_FIELD_VALID_VALUES.each do |value|
|
32
|
+
set_marker_field(firm, value)
|
33
|
+
expect(firm).to be_registered
|
44
34
|
end
|
45
35
|
end
|
46
36
|
end
|
@@ -185,34 +175,6 @@ RSpec.describe Firm do
|
|
185
175
|
expect(firm.field_order).not_to be_empty
|
186
176
|
end
|
187
177
|
|
188
|
-
describe 'email address' do
|
189
|
-
context 'when not present' do
|
190
|
-
before { firm.email_address = nil }
|
191
|
-
|
192
|
-
it { is_expected.to_not be_valid }
|
193
|
-
end
|
194
|
-
|
195
|
-
context 'when badly formatted' do
|
196
|
-
before { firm.email_address = 'not-valid' }
|
197
|
-
|
198
|
-
it { is_expected.to_not be_valid }
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
describe 'telephone number' do
|
203
|
-
context 'when not present' do
|
204
|
-
before { firm.telephone_number = nil }
|
205
|
-
|
206
|
-
it { is_expected.to_not be_valid }
|
207
|
-
end
|
208
|
-
|
209
|
-
context 'when badly formatted' do
|
210
|
-
before { firm.telephone_number = 'not-valid' }
|
211
|
-
|
212
|
-
it { is_expected.to_not be_valid }
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
178
|
describe 'Website address' do
|
217
179
|
context 'when provided' do
|
218
180
|
it 'must not exceed 100 characters' do
|
@@ -450,7 +412,7 @@ RSpec.describe Firm do
|
|
450
412
|
it 'the firm is published' do
|
451
413
|
firm = create :firm
|
452
414
|
allow(IndexFirmJob).to receive(:perform_later)
|
453
|
-
firm.update_attributes(
|
415
|
+
firm.update_attributes(registered_name: 'A new name')
|
454
416
|
firm.run_callbacks(:commit)
|
455
417
|
expect(IndexFirmJob).to have_received(:perform_later).with(firm)
|
456
418
|
end
|
@@ -39,7 +39,7 @@ RSpec.describe FirmSerializer do
|
|
39
39
|
end
|
40
40
|
|
41
41
|
it 'exposes `telephone_number`' do
|
42
|
-
expect(subject[:telephone_number]).to eql(firm.telephone_number)
|
42
|
+
expect(subject[:telephone_number]).to eql(firm.main_office.telephone_number)
|
43
43
|
end
|
44
44
|
|
45
45
|
it 'exposes `website_address`' do
|
@@ -47,7 +47,7 @@ RSpec.describe FirmSerializer do
|
|
47
47
|
end
|
48
48
|
|
49
49
|
it 'exposes `email_address`' do
|
50
|
-
expect(subject[:email_address]).to eql(firm.email_address)
|
50
|
+
expect(subject[:email_address]).to eql(firm.main_office.email_address)
|
51
51
|
end
|
52
52
|
|
53
53
|
it 'exposes `free_initial_meeting`' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mas-rad_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.82
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Lovell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -305,6 +305,7 @@ files:
|
|
305
305
|
- db/migrate/20150813103046_remove_confirmed_disclaimer_from_advisers.rb
|
306
306
|
- db/migrate/20150817141257_add_status_to_firms.rb
|
307
307
|
- db/migrate/20150825090822_move_firm_address_to_office.rb
|
308
|
+
- db/migrate/20150930140851_remove_firm_email_and_phone.rb
|
308
309
|
- lib/mas/adviser_result.rb
|
309
310
|
- lib/mas/elastic_search_client.rb
|
310
311
|
- lib/mas/firm_repository.rb
|