Class: EmployeeTopic
- Inherits:
-
PartyTopic
- Object
- ActiveRecord::Base
- ApplicationRecord
- PartyTopic
- EmployeeTopic
- 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
Constants included from Models::Auditable
Models::Auditable::ALWAYS_IGNORED
Instance Attribute Summary collapse
- #state ⇒ Object readonly
Belongs to collapse
Methods inherited from PartyTopic
Methods included from Models::Auditable
Delegated Instance Attributes collapse
-
#title ⇒ Object
Alias for Topic#title.
-
#topic_thumbnail ⇒ Object
Alias for Topic#topic_thumbnail.
-
#uploads ⇒ Object
Alias for Topic#uploads.
Class Method Summary collapse
-
.active ⇒ ActiveRecord::Relation<EmployeeTopic>
A relation of EmployeeTopics that are active.
- .apply_state_order(relation) ⇒ Object
- .assigned_topic_select_options ⇒ Object
- .assigned_trainee_select_options ⇒ Object
- .assigned_trainer_select_options ⇒ Object
-
.auto_assign(employee) ⇒ Object
This method will find all missing employee topics for a given employee and create them.
-
.create_employee_topics(employee, topics) ⇒ Object
Builds employee topics for a given employee.
-
.find_missing_topics(employee) ⇒ Object
Find all topics that are not already in this employee's party topics.
- .instruction_types_select_options ⇒ Object
- .state_order ⇒ Object
- .states_for_select ⇒ Object
-
.topics_for_employee(employee) ⇒ Object
Find all applicable topics for an employee based on their role.
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
Instance Attribute Details
#state ⇒ Object (readonly)
49 |
# File 'app/models/employee_topic.rb', line 49 validates :state, :party, :topic, presence: true |
Class Method Details
.active ⇒ ActiveRecord::Relation<EmployeeTopic>
A relation of EmployeeTopics that are active. Active Record Scope
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_options ⇒ Object
99 100 101 102 103 104 105 |
# File 'app/models/employee_topic.rb', line 99 def self. 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_options ⇒ Object
107 108 109 |
# File 'app/models/employee_topic.rb', line 107 def self. Employee.active.joins(:employee_topics).order(:full_name).select('distinct parties.full_name, parties.id') end |
.assigned_trainer_select_options ⇒ Object
95 96 97 |
# File 'app/models/employee_topic.rb', line 95 def self. 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_options ⇒ Object
91 92 93 |
# File 'app/models/employee_topic.rb', line 91 def self. instruction_types.keys.map { |k| [k.humanize, k] } end |
.state_order ⇒ Object
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_select ⇒ Object
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
#employee ⇒ Employee
43 |
# File 'app/models/employee_topic.rb', line 43 belongs_to :employee, inverse_of: :employee_topics, foreign_key: :party_id, optional: true |
#possible_events ⇒ Object
152 153 154 |
# File 'app/models/employee_topic.rb', line 152 def possible_events state_transitions.map(&:event).sort end |
#possible_events_for_select ⇒ Object
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 |
#title ⇒ Object
Alias for Topic#title
53 |
# File 'app/models/employee_topic.rb', line 53 delegate :uploads, :topic_thumbnail, :title, to: :topic |
#to_s ⇒ Object
160 161 162 |
# File 'app/models/employee_topic.rb', line 160 def to_s "#{topic.title} for #{employee.full_name}" end |
#topic ⇒ Topic
Validations:
44 |
# File 'app/models/employee_topic.rb', line 44 belongs_to :topic, inverse_of: :employee_topics, optional: true |
#topic_thumbnail ⇒ Object
Alias for Topic#topic_thumbnail
53 |
# File 'app/models/employee_topic.rb', line 53 delegate :uploads, :topic_thumbnail, :title, to: :topic |
#trainer_party ⇒ Employee
45 |
# File 'app/models/employee_topic.rb', line 45 belongs_to :trainer_party, class_name: 'Employee', optional: true |
#uploads ⇒ Object
Alias for Topic#uploads
53 |
# File 'app/models/employee_topic.rb', line 53 delegate :uploads, :topic_thumbnail, :title, to: :topic |