Module: Models::ItemPackageContentHelper
- Extended by:
- ActiveSupport::Concern
- Included in:
- Item
- Defined in:
- app/concerns/models/item_package_content_helper.rb
Overview
ActiveSupport::Concern mixin: item package content helper.
Instance Method Summary collapse
- #build_package_content_entries ⇒ Object
- #condense_group_to_char_limit(group_entries, char_limit) ⇒ Object
- #group_entries_for_max_unique_items(entries, max_unique_items) ⇒ Object
- #package_content_html ⇒ Object
- #package_content_short_name ⇒ Object
- #package_contents_array(char_limit: 150, max_unique_items: nil) ⇒ Object
- #package_contents_friendly ⇒ Object
Instance Method Details
#build_package_content_entries ⇒ Object
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'app/concerns/models/item_package_content_helper.rb', line 33 def build_package_content_entries entries = [] if is_kit? entries += target_item_relations.kit_components .includes(:target_item) .joins(target_item: :product_category) .sort_by do |tir| if tir.target_item.is_heating_element? 0 elsif tir.target_item.is_thermostat? 10 elsif tir.target_item.is_membrane? 20 else 100 end end.map do |tir| qty = tir.quantity.to_i name_part = tir.target_item.package_content_short_name name_form = "(#{qty}) #{name_part}" sku_form = "(#{qty}) #{tir.target_item.sku}" { name_form: name_form, sku_form: sku_form } end # TRT and TCT kits have two sensors, one in the thermostat box, one on the roll or cable. this should probably be a spec attribute if sku.start_with?('TCT', 'TRT', 'RCT') sensor_form = '(2) Floor Sensors' entries << { name_form: sensor_form, sku_form: sensor_form } end else name_part = package_content_short_name name_form = "(1) #{name_part}" sku_form = "(1) #{sku}" entries << { name_form: name_form, sku_form: sku_form } end entries end |
#condense_group_to_char_limit(group_entries, char_limit) ⇒ Object
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'app/concerns/models/item_package_content_helper.rb', line 76 def condense_group_to_char_limit(group_entries, char_limit) forms = group_entries.map { |e| { use: :name_form, name_len: e[:name_form].length, sku_len: e[:sku_form].length, ref: e } } current = forms.map { |f| f[:ref][f[:use]] } current_len = current.join('; ').length if current_len > char_limit candidates = forms.map { |f| [f, (f[:name_len] - f[:sku_len])] } .select { |(_f, delta)| delta.positive? } .sort_by { |(_f, delta)| -delta } candidates.each do |f, _delta| f[:use] = :sku_form current = forms.map { |ff| ff[:ref][ff[:use]] } current_len = current.join('; ').length break if current_len <= char_limit end end return nil if current_len > char_limit current.join('; ') end |
#group_entries_for_max_unique_items(entries, max_unique_items) ⇒ Object
70 71 72 73 74 |
# File 'app/concerns/models/item_package_content_helper.rb', line 70 def group_entries_for_max_unique_items(entries, max_unique_items) groups = Array.new(max_unique_items) { [] } entries.each_with_index { |val, idx| groups[idx % max_unique_items] << val } groups end |
#package_content_html ⇒ Object
110 111 112 |
# File 'app/concerns/models/item_package_content_helper.rb', line 110 def package_content_html %(<ul>#{package_contents_array.map { |c| "<li>#{c}</li>" }.join}</ul>).html_safe end |
#package_content_short_name ⇒ Object
100 101 102 103 104 105 106 107 108 |
# File 'app/concerns/models/item_package_content_helper.rb', line 100 def package_content_short_name if sku.in?(ItemConstants::TZ_CABLE_STRIP_SKUS) n = 'Cable Fixing Strips' else n = public_name.gsub(/[,();™©Ⓒ]/, '').gsub('sq.ft.', 'sq ft').gsub('ft.', 'ft') n << " (#{sku})" end n end |
#package_contents_array(char_limit: 150, max_unique_items: nil) ⇒ Object
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# File 'app/concerns/models/item_package_content_helper.rb', line 9 def package_contents_array(char_limit: 150, max_unique_items: nil) entries = build_package_content_entries # If no grouping required, return individual entries respecting char limit per entry if max_unique_items.blank? return entries.map { |e| e[:name_form].length > char_limit ? e[:sku_form] : e[:name_form] } end max_unique_items = max_unique_items.to_i return [] if max_unique_items <= 0 groups = group_entries_for_max_unique_items(entries, max_unique_items) condensed = groups.map { |group_entries| condense_group_to_char_limit(group_entries, char_limit) } if condensed.any?(&:nil?) Rails.logger.warn( "package_contents_array: could not fit grouped contents within char_limit=#{char_limit} and max_unique_items=#{max_unique_items} for item id=#{id}, sku=#{sku}; returning empty array" ) return [] end condensed.compact_blank end |
#package_contents_friendly ⇒ Object
96 97 98 |
# File 'app/concerns/models/item_package_content_helper.rb', line 96 def package_contents_friendly package_contents_array.join('; ') end |