Class: ElementPoleAssignment

Inherits:
ApplicationRecord show all
Includes:
Models::Auditable
Defined in:
app/models/element_pole_assignment.rb

Overview

== Schema Information

Table name: element_pole_assignments
Database name: primary

id :bigint not null, primary key
heating_element_number :integer not null
notes :string
pole_number :integer not null
relay_number :integer not null
created_at :datetime not null
updated_at :datetime not null
creator_id :integer
heating_element_item_id :integer not null
relay_item_id :integer not null
room_configuration_id :integer not null
updater_id :integer

Indexes

idx_unique_element_pole_assignment (relay_item_id,heating_element_item_id,relay_number,pole_number,heating_element_number) UNIQUE
index_element_pole_assignments_on_heating_element_item_id (heating_element_item_id)

Foreign Keys

fk_rails_... (heating_element_item_id => items.id)
fk_rails_... (relay_item_id => items.id)
fk_rails_... (room_configuration_id => room_configurations.id)

Constant Summary

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 included from Models::Auditable

#creator, #updater

Class Method Summary collapse

Instance Method Summary collapse

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

#heating_element_item_idObject (readonly)



48
# File 'app/models/element_pole_assignment.rb', line 48

validates :heating_element_item_id, uniqueness: { scope: %i[room_configuration_id relay_item_id relay_number pole_number heating_element_number], message: "cannot be assigned to the same pole multiple times" }

#heating_element_numberObject (readonly)



47
# File 'app/models/element_pole_assignment.rb', line 47

validates :relay_number, :pole_number, :heating_element_number, presence: true, numericality: { only_integer: true, greater_than: 0 }

#pole_numberObject (readonly)



47
# File 'app/models/element_pole_assignment.rb', line 47

validates :relay_number, :pole_number, :heating_element_number, presence: true, numericality: { only_integer: true, greater_than: 0 }

#relay_numberObject (readonly)



47
# File 'app/models/element_pole_assignment.rb', line 47

validates :relay_number, :pole_number, :heating_element_number, presence: true, numericality: { only_integer: true, greater_than: 0 }

Class Method Details

.order_defaultActiveRecord::Relation<ElementPoleAssignment>

A relation of ElementPoleAssignments that are order default. Active Record Scope

Returns:

See Also:



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

scope :order_default, -> { order(:room_configuration_id, :heating_element_number, :pole_number, :relay_number) }

.orderedActiveRecord::Relation<ElementPoleAssignment>

A relation of ElementPoleAssignments that are ordered. Active Record Scope

Returns:

See Also:



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

scope :ordered, -> { order_default }

Instance Method Details

#heating_element_comboObject



81
82
83
# File 'app/models/element_pole_assignment.rb', line 81

def heating_element_combo
  "#{heating_element_item_id}|#{heating_element_number}"
end

#heating_element_combo=(val) ⇒ Object



77
78
79
# File 'app/models/element_pole_assignment.rb', line 77

def heating_element_combo=(val)
  self.heating_element_item_id, self.heating_element_number = val.presence&.split('|')
end

#heating_element_combo_selectObject



102
103
104
105
106
107
108
109
110
111
112
113
# File 'app/models/element_pole_assignment.rb', line 102

def heating_element_combo_select
  # Create an incremental label counter
  options = []
  index = 0
  heating_elements_grouped.each do |item, line_items|
    (1..line_items.sum(&:quantity)).each do |_counter|
      index += 1
      options << ["#{item.sku} # #{index}", "#{item.id}|#{index}"]
    end
  end
  options
end

#heating_element_itemItem

Returns:

See Also:



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

belongs_to :heating_element_item, class_name: 'Item'

#heating_elements_groupedObject



115
116
117
# File 'app/models/element_pole_assignment.rb', line 115

def heating_elements_grouped
  room_configuration.line_items.heating_elements.sort_for_plan.joins(:item).group_by(&:item)
end

#nextObject



73
74
75
# File 'app/models/element_pole_assignment.rb', line 73

def next
  room_configuration.element_pole_assignments.order_default_at(self).next
end

#previousObject

broadcasts_to ->(element_pole_assignment) { [element_pole_assignment.room_configuration_id, "element_pole_assignments"] },
partial: "/crm/room_configurations/element_pole_assignments/element_pole_assignment",
inserts_by: :append



69
70
71
# File 'app/models/element_pole_assignment.rb', line 69

def previous
  room_configuration.element_pole_assignments.order_default_at(self).previous
end

#relay_combo_selectObject



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'app/models/element_pole_assignment.rb', line 123

def relay_combo_select
  options = []
  relay_grouped.each do |item, line_items|
    index = 0
    (1..line_items.sum(&:quantity)).each do |_counter|
      index += 1
      (1..item.num_poles).to_a.each do |pole_number|
        label = "#{item.sku} # #{index} - Pole #{pole_number}"
        if (assignments = room_configuration.element_pole_assignments.select { |epa| epa.relay_item_id == item.id && epa.relay_number == index && epa.pole_number == pole_number }).present?
          label += " [Assigned to Element #{assignments.map(&:heating_element_number).join(',')}]"
        end
        value = "#{item.id}|#{index}|#{pole_number}"
        options << [label, value]
      end
    end
  end
  options
end

#relay_groupedObject



119
120
121
# File 'app/models/element_pole_assignment.rb', line 119

def relay_grouped
  room_configuration.line_items.relay_panels.joins(:item).order(Item[:sku]).group_by(&:item)
end

#relay_identifierObject



95
96
97
98
99
100
# File 'app/models/element_pole_assignment.rb', line 95

def relay_identifier
  return unless relay_item_id && relay_number && pole_number

  # "#{relay_item.sku} ##{relay_number}"
  "#{relay_item.num_poles} PL ##{relay_number}"
end

#relay_itemItem

Returns:

See Also:



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

belongs_to :relay_item, class_name: 'Item'

#relay_pole_comboObject



89
90
91
92
93
# File 'app/models/element_pole_assignment.rb', line 89

def relay_pole_combo
  return unless relay_item_id && relay_number && pole_number

  "#{relay_item_id}|#{relay_number}|#{pole_number}"
end

#relay_pole_combo=(val) ⇒ Object



85
86
87
# File 'app/models/element_pole_assignment.rb', line 85

def relay_pole_combo=(val)
  self.relay_item_id, self.relay_number, self.pole_number = val.presence&.split('|')
end

#room_configurationRoomConfiguration

Returns:

  • (RoomConfiguration)

See Also:



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

belongs_to :room_configuration

#to_partial_pathObject

Partial lives under app/views/crm/element_pole_assignments/, not the
conventional app/views/element_pole_assignments/. Override so
render @element_pole_assignments and the turbo_stream broadcasts in
crm/element_pole_assignments/{create,update}.turbo_stream.erb resolve
correctly from any controller, not just Crm::ElementPoleAssignmentsController.



39
40
41
# File 'app/models/element_pole_assignment.rb', line 39

def to_partial_path
  'crm/element_pole_assignments/element_pole_assignment'
end