Add column Relationship#federal_secretary_flag
This commit is contained in:
parent
8160514840
commit
9a8eb2651c
5 changed files with 134 additions and 0 deletions
|
@ -10,6 +10,8 @@ class Relationship < ApplicationRecord
|
||||||
regional_supervisor
|
regional_supervisor
|
||||||
]
|
]
|
||||||
|
|
||||||
|
pg_enum :federal_secretary_flag, %i[federal_secretary]
|
||||||
|
|
||||||
################
|
################
|
||||||
# Associations #
|
# Associations #
|
||||||
################
|
################
|
||||||
|
@ -26,6 +28,9 @@ class Relationship < ApplicationRecord
|
||||||
|
|
||||||
scope :federal_supervisors, -> { where(role: :federal_supervisor) }
|
scope :federal_supervisors, -> { where(role: :federal_supervisor) }
|
||||||
|
|
||||||
|
scope :federal_secretaries,
|
||||||
|
-> { where(federal_secretary_flag: :federal_secretary) }
|
||||||
|
|
||||||
###############
|
###############
|
||||||
# Validations #
|
# Validations #
|
||||||
###############
|
###############
|
||||||
|
@ -35,4 +40,9 @@ class Relationship < ApplicationRecord
|
||||||
validates :status, presence: true
|
validates :status, presence: true
|
||||||
|
|
||||||
validates :role, absence: { unless: :member? }
|
validates :role, absence: { unless: :member? }
|
||||||
|
|
||||||
|
validates :federal_secretary_flag,
|
||||||
|
allow_nil: true,
|
||||||
|
absence: { unless: :federal_manager? },
|
||||||
|
uniqueness: true
|
||||||
end
|
end
|
||||||
|
|
|
@ -22,6 +22,8 @@ private
|
||||||
regional_supervisor
|
regional_supervisor
|
||||||
]
|
]
|
||||||
|
|
||||||
|
enum :relationship_federal_secretary_flag, %i[federal_secretary]
|
||||||
|
|
||||||
enum :person_comment_origin, %i[
|
enum :person_comment_origin, %i[
|
||||||
general_comments
|
general_comments
|
||||||
first_contact_date
|
first_contact_date
|
||||||
|
@ -277,6 +279,11 @@ private
|
||||||
t.column :status, :relationship_status, null: false, index: true
|
t.column :status, :relationship_status, null: false, index: true
|
||||||
t.column :role, :relationship_role, null: true, index: true
|
t.column :role, :relationship_role, null: true, index: true
|
||||||
|
|
||||||
|
t.column :federal_secretary_flag,
|
||||||
|
:relationship_federal_secretary_flag,
|
||||||
|
null: true,
|
||||||
|
index: { unique: true }
|
||||||
|
|
||||||
t.index %i[person_id from_date], unique: true
|
t.index %i[person_id from_date], unique: true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -290,6 +297,10 @@ private
|
||||||
status = 'member' OR role IS NULL
|
status = 'member' OR role IS NULL
|
||||||
SQL
|
SQL
|
||||||
|
|
||||||
|
constraint :relationships, :federal_secretary_flag, <<~SQL
|
||||||
|
federal_secretary_flag IS NULL OR role = 'federal_manager'
|
||||||
|
SQL
|
||||||
|
|
||||||
constraint :accounts, :guest_token, <<~SQL
|
constraint :accounts, :guest_token, <<~SQL
|
||||||
is_guest_token(guest_token)
|
is_guest_token(guest_token)
|
||||||
SQL
|
SQL
|
||||||
|
|
|
@ -38,6 +38,15 @@ CREATE TYPE public.person_comment_origin AS ENUM (
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: relationship_federal_secretary_flag; Type: TYPE; Schema: public; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TYPE public.relationship_federal_secretary_flag AS ENUM (
|
||||||
|
'federal_secretary'
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: relationship_role; Type: TYPE; Schema: public; Owner: -
|
-- Name: relationship_role; Type: TYPE; Schema: public; Owner: -
|
||||||
--
|
--
|
||||||
|
@ -566,7 +575,9 @@ CREATE TABLE public.relationships (
|
||||||
until_date date,
|
until_date date,
|
||||||
status public.relationship_status NOT NULL,
|
status public.relationship_status NOT NULL,
|
||||||
role public.relationship_role,
|
role public.relationship_role,
|
||||||
|
federal_secretary_flag public.relationship_federal_secretary_flag,
|
||||||
CONSTRAINT dates CHECK (((until_date IS NULL) OR (from_date < until_date))),
|
CONSTRAINT dates CHECK (((until_date IS NULL) OR (from_date < until_date))),
|
||||||
|
CONSTRAINT federal_secretary_flag CHECK (((federal_secretary_flag IS NULL) OR (role = 'federal_manager'::public.relationship_role))),
|
||||||
CONSTRAINT role CHECK (((status = 'member'::public.relationship_status) OR (role IS NULL)))
|
CONSTRAINT role CHECK (((status = 'member'::public.relationship_status) OR (role IS NULL)))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -1066,6 +1077,13 @@ CREATE INDEX index_person_comments_on_person_id ON public.person_comments USING
|
||||||
CREATE UNIQUE INDEX index_regional_offices_on_federal_subject_id ON public.regional_offices USING btree (federal_subject_id);
|
CREATE UNIQUE INDEX index_regional_offices_on_federal_subject_id ON public.regional_offices USING btree (federal_subject_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: index_relationships_on_federal_secretary_flag; Type: INDEX; Schema: public; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE UNIQUE INDEX index_relationships_on_federal_secretary_flag ON public.relationships USING btree (federal_secretary_flag);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: index_relationships_on_from_date; Type: INDEX; Schema: public; Owner: -
|
-- Name: index_relationships_on_from_date; Type: INDEX; Schema: public; Owner: -
|
||||||
--
|
--
|
||||||
|
|
|
@ -40,4 +40,9 @@ FactoryBot.define do
|
||||||
factory :regional_supervisor_relationship, parent: :member_relationship do
|
factory :regional_supervisor_relationship, parent: :member_relationship do
|
||||||
role { :regional_supervisor }
|
role { :regional_supervisor }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
factory :federal_secretary_relationship,
|
||||||
|
parent: :federal_manager_relationship do
|
||||||
|
federal_secretary_flag { :federal_secretary }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -66,6 +66,79 @@ RSpec.describe Relationship do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#federal_secretary_flag' do
|
||||||
|
def allow_value(*)
|
||||||
|
super.for :federal_secretary_flag
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'for supporter relationship' do
|
||||||
|
subject { create :supporter_relationship }
|
||||||
|
|
||||||
|
it { is_expected.to allow_value nil }
|
||||||
|
it { is_expected.not_to allow_value :federal_secretary }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'for excluded supporter relationship' do
|
||||||
|
subject { create :excluded_supporter_relationship }
|
||||||
|
|
||||||
|
it { is_expected.to allow_value nil }
|
||||||
|
it { is_expected.not_to allow_value :federal_secretary }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'for member relationship' do
|
||||||
|
subject { create :member_relationship }
|
||||||
|
|
||||||
|
it { is_expected.to allow_value nil }
|
||||||
|
it { is_expected.not_to allow_value :federal_secretary }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'for excluded member relationship' do
|
||||||
|
subject { create :excluded_member_relationship }
|
||||||
|
|
||||||
|
it { is_expected.to allow_value nil }
|
||||||
|
it { is_expected.not_to allow_value :federal_secretary }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'for federal manager relationship' do
|
||||||
|
subject { create :federal_manager_relationship }
|
||||||
|
|
||||||
|
it { is_expected.to allow_value nil }
|
||||||
|
it { is_expected.to allow_value :federal_secretary }
|
||||||
|
|
||||||
|
context 'when federal secretary already exists' do
|
||||||
|
subject { create :federal_secretary_relationship }
|
||||||
|
|
||||||
|
it do
|
||||||
|
is_expected.to \
|
||||||
|
validate_uniqueness_of(:federal_secretary_flag)
|
||||||
|
.allow_nil
|
||||||
|
.ignoring_case_sensitivity
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'for federal supervisor relationship' do
|
||||||
|
subject { create :federal_supervisor_relationship }
|
||||||
|
|
||||||
|
it { is_expected.to allow_value nil }
|
||||||
|
it { is_expected.not_to allow_value :federal_secretary }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'for regional manager relationship' do
|
||||||
|
subject { create :regional_manager_relationship }
|
||||||
|
|
||||||
|
it { is_expected.to allow_value nil }
|
||||||
|
it { is_expected.not_to allow_value :federal_secretary }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'for regional supervisor relationship' do
|
||||||
|
subject { create :regional_supervisor_relationship }
|
||||||
|
|
||||||
|
it { is_expected.to allow_value nil }
|
||||||
|
it { is_expected.not_to allow_value :federal_secretary }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '.federal_managers' do
|
describe '.federal_managers' do
|
||||||
let!(:relationship1) { create :supporter_relationship }
|
let!(:relationship1) { create :supporter_relationship }
|
||||||
let!(:relationship2) { create :member_relationship }
|
let!(:relationship2) { create :member_relationship }
|
||||||
|
@ -99,4 +172,21 @@ RSpec.describe Relationship do
|
||||||
eq [relationship5, relationship8]
|
eq [relationship5, relationship8]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '.federal_secretaries' do
|
||||||
|
let!(:relationship1) { create :supporter_relationship }
|
||||||
|
let!(:relationship2) { create :member_relationship }
|
||||||
|
let!(:relationship3) { create :excluded_supporter_relationship }
|
||||||
|
let!(:relationship3) { create :excluded_member_relationship }
|
||||||
|
let!(:relationship4) { create :federal_manager_relationship }
|
||||||
|
let!(:relationship5) { create :federal_supervisor_relationship }
|
||||||
|
let!(:relationship6) { create :regional_manager_relationship }
|
||||||
|
let!(:relationship7) { create :regional_supervisor_relationship }
|
||||||
|
let!(:relationship8) { create :federal_secretary_relationship }
|
||||||
|
let!(:relationship9) { create :federal_manager_relationship }
|
||||||
|
|
||||||
|
specify do
|
||||||
|
expect(described_class.federal_secretaries).to eq [relationship8]
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Reference in a new issue