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 :integer
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

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, exams, for_topic_category, in_progress, no_exams, 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 Models::EventPublishable

#publish_event

Instance Attribute Details

#stateObject (readonly)



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

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:



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

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

.apply_state_order(relation) ⇒ Object



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

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

.assigned_topic_select_optionsObject



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

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



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

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



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

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



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

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



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

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



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

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

.instruction_types_select_optionsObject



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

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

.state_orderObject



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

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

.states_for_selectObject



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

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



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

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

Returns:

See Also:



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

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

#possible_eventsObject



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

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

#possible_events_for_selectObject



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

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:



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

delegate :uploads, :topic_thumbnail, :title, to: :topic

#to_sObject



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

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

#topicTopic

Returns:

See Also:

Validations:



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

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

#topic_thumbnailObject

Alias for Topic#topic_thumbnail

Returns:

  • (Object)

    Topic#topic_thumbnail

See Also:



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

delegate :uploads, :topic_thumbnail, :title, to: :topic

#trainer_partyEmployee

Returns:

See Also:



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

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

#uploadsObject

Alias for Topic#uploads

Returns:

  • (Object)

    Topic#uploads

See Also:



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

delegate :uploads, :topic_thumbnail, :title, to: :topic