133 lines
5.5 KiB
Ruby
133 lines
5.5 KiB
Ruby
class User < ApplicationRecord
|
|
include Devise::JWT::RevocationStrategies::JTIMatcher
|
|
|
|
devise :database_authenticatable, :registerable,
|
|
:validatable, :jwt_authenticatable, jwt_revocation_strategy: self
|
|
# Include default devise modules. Others available are:
|
|
# :recoverable, :rememberable, :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
|
|
|
|
# role-based authorization
|
|
enum :role, { member: 0, employer: 1, broker: 2, provider: 3, carrier: 4, admin: 5 }
|
|
|
|
attr_accessor :keychain
|
|
attr_accessor :date_of_birth
|
|
attr_accessor :last_four_ssn
|
|
|
|
# validations so your db doesn't turn into a trash can
|
|
validates :email, presence: true, uniqueness: true, format: { with: URI::MailTo::EMAIL_REGEXP }
|
|
validates :password, presence: true, length: { minimum: 6 }, if: -> { new_record? || !password.nil? }
|
|
|
|
validates :role, presence: true
|
|
validates :role_id, presence: true
|
|
|
|
validate :role_entity_exists, on: :create
|
|
|
|
# after_initialize :keychain
|
|
before_validation :sync_role_entity, on: :create
|
|
|
|
|
|
def keychain
|
|
@keychain ||= case role
|
|
when "member"
|
|
if role_entity.present?
|
|
# belongs_to = {
|
|
# employer_id: role_entity.employer_id,
|
|
# broker_id: role_entity&.baclight_employer.broker_id,
|
|
# carrier_id:role_entity&.baclight_employer&.baclight_broker&.carrier_id
|
|
# }
|
|
keys = role_entity.attributes.with_indifferent_access.slice(
|
|
:id, :name, :family_id, :mb_member_key, :pb_entity_key, :pl_plan_key
|
|
)
|
|
|
|
keys #.merge(belongs_to)
|
|
end
|
|
when "employer"
|
|
if role_entity.present?
|
|
belongs_to = role_entity.joins(broker: :carrier).select(
|
|
'brokers.id AS broker_id',
|
|
'carriers.id AS carrier_id'
|
|
)
|
|
|
|
|
|
keys = role_entity.attributes.with_indifferent_access.slice(
|
|
:name, :pl_plan_key, :company_pb_entity_key, :plan_id, :group_number
|
|
)
|
|
|
|
keys.merge(belongs_to)
|
|
end
|
|
when "broker"
|
|
if role_entity.present?
|
|
belongs_to = role_entity.joins(:carrier).select(
|
|
'carriers.id AS carrier_id'
|
|
)
|
|
role_entity.attributes.with_indifferent_access.slice(
|
|
:name, :id
|
|
).merge(belongs_to)
|
|
end
|
|
when "provider"
|
|
if role_entity.present?
|
|
role_entity.attributes.with_indifferent_access.slice(
|
|
:name, :pb_entity_key, :tax_id, :family_id
|
|
)
|
|
end
|
|
when "carrier"
|
|
if role_entity.present?
|
|
role_entity.attributes.with_indifferent_access.slice(
|
|
:name, :id
|
|
)
|
|
end
|
|
# when "admin"
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def role_entity
|
|
@role_entity = case role
|
|
when "member"
|
|
if self.persisted?
|
|
Baclight::Member.find_by(pb_entity_key: role_id)
|
|
else
|
|
find_initial_member
|
|
end
|
|
when "employer"
|
|
Baclight::Employer.find_by(company_pb_entity_key: role_id)
|
|
when "broker"
|
|
Baclight::Broker.find_by(broker_id: role_id)
|
|
when "provider"
|
|
Baclight::Provider.find_by(tax_id: role_id)
|
|
when "carrier"
|
|
Baclight::Carrier.find_by(carrier_id: role_id)
|
|
# when "admin"
|
|
end
|
|
end
|
|
|
|
def sync_role_entity
|
|
if role == "member"
|
|
self.name = role_entity.name.split(",").reverse.join(" ").squish
|
|
else
|
|
self.name = role_entity.name
|
|
end
|
|
end
|
|
|
|
def role_entity_exists
|
|
if role_entity.blank?
|
|
errors.add(:role, "#{role} with id #{role_id} was not found.")
|
|
end
|
|
if role == "member"
|
|
dob = Vhcs::VwmbMember.find_by(pb_entity_key: role_id).date_of_birth
|
|
unless dob == date_of_birth
|
|
errors.add(:role, "#{role} with id #{role_id} and #{date_of_birth} was not found.")
|
|
end
|
|
end
|
|
end
|
|
|
|
def find_initial_member
|
|
initial_member = Vhcs::VwmbMember.where("RIGHT(SocialSecurityNumber, 4) = ? AND DateOfBirth = ?", last_four_ssn, date_of_birth).first
|
|
self.role_id = initial_member&.pb_entity_key
|
|
member = Baclight::Member.find_by(pb_entity_key: role_id)
|
|
member.presence
|
|
end
|
|
|
|
end
|