class Participant < ApplicationRecord after_create :create_onboarding_items_for_forms # Associations belongs_to :employer, optional: false has_many :employments has_many :workers, through: :employments has_many :service_contracts has_many :vendors, through: :service_contracts has_many :employer_records has_many :employers, through: :employer_records has_and_belongs_to_many :programs has_many :bank_accounts, as: :owner has_many :onboarding_items, as: :owner accepts_nested_attributes_for :onboarding_items # Validations validates :first_name, :last_name, :ssn, presence: true validates :ssn, uniqueness: { message: "SSN is already taken by another participant" }, unless: :ssn_already_taken_by_employer? validates :employer_id, presence: true def full_name "#{first_name} #{last_name}" end private def ssn_already_taken_by_employer? # Check if the SSN already exists in the Employer model, excluding the current participant's employer Employer.where.not(id: employer_id).exists?(ssn: ssn) end def create_onboarding_items_for_forms create_participant_onboarding_items create_employer_onboarding_items_if_applicable end def create_participant_onboarding_items participant_role = FormRole.find_by(name: 'Participant') forms = Form.joins(:form_roles).where(form_roles: { id: participant_role.id }) forms.each do |form| onboarding_items.find_or_create_by(form: form) end end def create_employer_onboarding_items_if_applicable # Assuming there is a method or indicator to check if the participant is also an employer return unless self.is_also_employer? employer_role = FormRole.find_by(name: 'Employer') forms = Form.joins(:form_roles).where(form_roles: { id: employer_role.id }) forms.each do |form| # Here you need to decide how you want to associate the forms with the employer record # If the employer record is separate from the participant, you may need something like: self.employer.onboarding_items.find_or_create_by(form: form) if self.employer.present? # If the participant itself acts as an employer, then you might directly create onboarding items as done for participant forms end end # A method to determine if the participant should also have employer forms def is_also_employer? # Implement logic to determine if the participant is also an employer # This might involve checking if the participant has an associated employer record # or any other logic specific to your application self.employer.present? # Example logic, adjust as needed end end