Class: EmployeeTopic

Inherits:
PartyTopic show all
Defined in:
app/models/employee_topic.rb

Overview

== Schema Information

Table name: party_topics
Database name: primary

id :integer not null, primary key
comments :text
due_on :datetime
follow_up :boolean
instruction_type :enum
position :integer
state :string(20)
state_created_at :datetime
type :string(20)
created_at :datetime not null
updated_at :datetime not null
course_category_id :integer
course_enrollment_id :integer
course_exam_id :integer
creator_id :integer
party_id :integer not null
survey_enrollment_id :integer
topic_id :integer not null
trainer_party_id :integer
updater_id :integer

Indexes

index_party_topic_enrollment_and_exam (party_id,topic_id,course_enrollment_id,course_exam_id)
index_party_topics_on_topic_id (topic_id)
index_party_topics_on_type (type)
party_topics_trainer_party_id_idx (trainer_party_id)

Foreign Keys

fk_rails_... (party_id => parties.id) ON DELETE => cascade
fk_rails_... (topic_id => topics.id) ON DELETE => cascade
fk_rails_... (trainer_party_id => parties.id) ON DELETE => nullify

Constant Summary

Constants inherited from PartyTopic

PartyTopic::STATES

Constants included from Models::Auditable

Models::Auditable::ALWAYS_IGNORED

Constants included from Schedulable

Schedulable::SIMPLE_FORM_OPTIONS

Instance Attribute Summary collapse

Belongs to collapse

Methods inherited from PartyTopic

#party

Methods included from Models::Auditable

#creator, #updater

Delegated Instance Attributes collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from PartyTopic

assigned, #complete, completed, in_progress, ongoing, sorted

Methods included from Models::Auditable

#all_skipped_columns, #audit_reference_data, #should_not_save_version, #stamp_record

Methods inherited from ApplicationRecord

ransackable_associations, ransackable_attributes, ransackable_scopes, ransortable_attributes, #to_relation

Methods included from Schedulable

config

Methods included from Models::AfterCommittable

#after_commit

Methods included from Models::EventPublishable

#publish_event

Instance Attribute Details

#stateObject (readonly)



50
# File 'app/models/employee_topic.rb', line 50

validates :state, :party, :topic, presence: true

Class Method Details

.activeActiveRecord::Relation<EmployeeTopic>

A relation of EmployeeTopics that are active. Active Record Scope

Returns:

See Also:



52
# File 'app/models/employee_topic.rb', line 52

scope :active, -> { where.not(state: 'cancelled') }

.apply_state_order(relation) ⇒ Object



145
146
147
# File 'app/models/employee_topic.rb', line 145

def self.apply_state_order(relation)
  relation.group_by(&:state).slice(*state_order).values.flatten
end

.assigned_topic_select_optionsObject



100
101
102
103
104
105
106
# File 'app/models/employee_topic.rb', line 100

def self.assigned_topic_select_options
  Topic.joins(:employee_topics)
       .includes(%i[employee_topics topic_category])
       .where(applies_to_employee: true)
       .order(TopicCategory[:name], Topic[:title])
       .map { |t| ["#{t.topic_category.name} > #{t.title}", t.id] }
end

.assigned_trainee_select_optionsObject



108
109
110
# File 'app/models/employee_topic.rb', line 108

def self.assigned_trainee_select_options
  Employee.active.joins(:employee_topics).order(:full_name).select('distinct parties.full_name, parties.id')
end

.assigned_trainer_select_optionsObject



96
97
98
# File 'app/models/employee_topic.rb', line 96

def self.assigned_trainer_select_options
  Employee.active.joins(:trainer_employee_topics).order(:full_name).select('distinct parties.full_name, parties.id')
end

.auto_assign(employee) ⇒ Object

This method will find all missing employee topics for a given employee and create them



113
114
115
116
# File 'app/models/employee_topic.rb', line 113

def self.auto_assign(employee)
  topics = find_missing_topics(employee)
  create_employee_topics(employee, topics)
end

.create_employee_topics(employee, topics) ⇒ Object

Builds employee topics for a given employee



134
135
136
137
138
139
# File 'app/models/employee_topic.rb', line 134

def self.create_employee_topics(employee, topics)
  topics.each do |t|
    employee.employee_topics << EmployeeTopic.new(topic: t, state: 'assigned')
  end
  employee.employee_topics
end

.find_missing_topics(employee) ⇒ Object

Find all topics that are not already in this employee's party topics



119
120
121
122
123
# File 'app/models/employee_topic.rb', line 119

def self.find_missing_topics(employee)
  topics = topics_for_employee(employee)
  existing_employee_topics = employee.employee_topics.pluck(:topic_id)
  topics.reject { |t| existing_employee_topics.include?(t.id) }
end

.instruction_types_select_optionsObject



92
93
94
# File 'app/models/employee_topic.rb', line 92

def self.instruction_types_select_options
  instruction_types.keys.map { |k| [k.humanize, k] }
end

.state_orderObject



141
142
143
# File 'app/models/employee_topic.rb', line 141

def self.state_order
  EmployeeTopic.state_machines[:state].states.map { |s| s.name.to_s }
end

.states_for_selectObject



88
89
90
# File 'app/models/employee_topic.rb', line 88

def self.states_for_select
  state_machines[:state].states.map { |s| [s.human_name, s.name] }
end

.topics_for_employee(employee) ⇒ Object

Find all applicable topics for an employee based on their role



126
127
128
129
130
131
# File 'app/models/employee_topic.rb', line 126

def self.topics_for_employee(employee)
  Topic
    .active
    .where(applies_to_employee: true)
    .for_employee_role_ids(employee.role_ids)
end

Instance Method Details

#employeeEmployee

instruction_type enum is declared on PartyTopic — see comment there.

Returns:

See Also:



44
# File 'app/models/employee_topic.rb', line 44

belongs_to :employee, inverse_of: :employee_topics, foreign_key: :party_id, optional: true

#possible_eventsObject



153
154
155
# File 'app/models/employee_topic.rb', line 153

def possible_events
  state_transitions.map(&:event).sort
end

#possible_events_for_selectObject



157
158
159
# File 'app/models/employee_topic.rb', line 157

def possible_events_for_select
  possible_events.map { |evt| [evt.to_s.titleize, evt] }
end

#titleObject

Alias for Topic#title

Returns:

  • (Object)

    Topic#title

See Also:



54
# File 'app/models/employee_topic.rb', line 54

delegate :uploads, :title, to: :topic

#to_sObject



161
162
163
# File 'app/models/employee_topic.rb', line 161

def to_s
  "#{topic.title} for #{employee.full_name}"
end

#topicTopic

Returns:

See Also:

Validations:



45
# File 'app/models/employee_topic.rb', line 45

belongs_to :topic, inverse_of: :employee_topics, optional: true

#topic_thumbnailObject



149
150
151
# File 'app/models/employee_topic.rb', line 149

def topic_thumbnail
  topic.uploads.first.try(:thumbnail_url)
end

#trainer_partyEmployee

Returns:

See Also:



46
# File 'app/models/employee_topic.rb', line 46

belongs_to :trainer_party, class_name: 'Employee', optional: true

#uploadsObject

Alias for Topic#uploads

Returns:

  • (Object)

    Topic#uploads

See Also:



54
# File 'app/models/employee_topic.rb', line 54

delegate :uploads, :title, to: :topic