module IdCard class Plan < ApplicationRecord belongs_to :setup, optional: true has_many :plan_benefits, dependent: :destroy accepts_nested_attributes_for :plan_benefits, allow_destroy: true, reject_if: :all_blank has_many :members, class_name: 'Member', foreign_key: :id_card_plan_id validates :title, presence: true validates :pb_product_key, :pl_plan_key, presence: true, if: -> { setup&.active } validates :pb_product_key, uniqueness: true, allow_nil: true validate :validate_plan_benefits_count, unless: -> { template } scope :templates, -> { where(template: true) } FARIOS_BENEFIT_FIELDS = ["Primary Visit", "Specialist Visit", "Urgent Care", "INN-Ind Ded", "INN-Family Ded", "OON-Ind Ded", "OON-Family Ded", "Co-Insurance", "INN-Ind OOP", "INN-Family OOP", "OON-Ind OOP", "OON-Family OOP", "Emergency Room", "Preventive Care"].freeze TANDEMLOC_BENEFIT_FIELDS = ["Physician Visit", "Specialist Visit", "Urgent Care", "Deductible", "Co-Insurance", "Out-of-Pocket", "Emergency Room", "Preventive Care"].freeze SMART_BENEFIT_FIELDS = [].freeze after_initialize :build_plan_benefits, if: :new_record? def build_plan_benefits if plan_benefits.empty? plan_benefit_fields = case setup&.card_template when "TandemlocIDCard" TANDEMLOC_BENEFIT_FIELDS when "SmartIDCard" SMART_BENEFIT_FIELDS else FARIOS_BENEFIT_FIELDS end plan_benefit_fields.each_with_index do |bene, i| self.plan_benefits.build(benefit_desc: bene, sequence: (i + 1)) end end end def format_template formatted_title = title if pl_plan_key.present? employer_name = Employer.find_by(pl_plan_key: pl_plan_key).pluck(:name) formatted_title.concat( " (#{employer_name})" ) end { id: id, title: formatted_title } end class << self def permitted_params(params) params.require(:id_card_setup).permit( plans_attributes: [ :id, :title, :pb_product_key, :pl_plan_key, :_destroy, plan_benefits_attributes: [ :id, :benefit_desc, :benefit, :sequence, :_destroy, ] ] ) end end private def validate_plan_benefits_count plan_benefits_size = plan_benefits.size template_benefits_size = case setup&.card_template when "TandemlocIDCard" TANDEMLOC_BENEFIT_FIELDS.size when "SmartIDCard" SMART_BENEFIT_FIELDS.size else FARIOS_BENEFIT_FIELDS.size end unless plan_benefits_size == template_benefits_size errors.add(:base, "Plan Benefits size (#{plan_benefits_size}) does not match ID Card Template (#{template_benefits_size})") end end end end